| #!/usr/bin/env bash | |
| # Autotools-style (./configure) wrapper for CMake | |
| # <https://github.com/nemequ/configure-cmake> | |
| # | |
| # *** IMPORTANT *** | |
| # | |
| # You must include the GNUInstallDirs module (which comes with | |
| # CMake) in your project. Just put "include (GNUInstallDirs)" in | |
| # you CMakeLists.txt and you should be good. | |
| # | |
| # This script was originally written for Squash | |
| # <https://quixdb.github.io/squash/> by Evan Nemerson | |
| # <evan@nemerson.com>, but has been spun off into a separate | |
| # repository. Please feel free to copy it into your own repository, | |
| # though I would appreciate it if you would post improvements, bugs, | |
| # feature requests, etc. to the issue tracker at | |
| # <https://github.com/nemequ/configure-cmake/issues>. | |
| # | |
| # To the extent possible under law, the author(s) hereby waive all | |
| # copyright and related or neighboring rights to this work. For | |
| # details, see <https://creativecommons.org/publicdomain/zero/1.0/> | |
| TOP_SRCDIR="$(dirname $0)" | |
| if [ "${CMAKE_CMD}" = "" ]; then | |
| CMAKE_CMD="cmake" | |
| fi | |
| BUILD_TYPE="Debug" | |
| PREFIX=/usr/local | |
| LIBDIR= | |
| CMAKE_ARGS= | |
| if [ -e "${TOP_SRCDIR}/scripts/.configure-custom.sh" ]; then | |
| . "${TOP_SRCDIR}/scripts/.configure-custom.sh" | |
| fi | |
| quote() { | |
| echo "$1" | sed -e "s|'|'\\\\''|g; 1s/^/'/; \$s/\$/'/" | |
| } | |
| extract_var_string() { | |
| VAR_NAME=$1 | |
| VAR_NAME=$(echo $1 | sed -e 's/[ \t]*$//') | |
| if [ "x$2" != "x" ]; then | |
| VAR_VALUE=$2 | |
| else | |
| VAR_VALUE=yes | |
| fi | |
| if [ "x$3" != "x" ]; then | |
| VAR_UC_NAME=$3 | |
| else | |
| VAR_UC_NAME=$(echo "$1" | tr '[:lower:]' '[:upper:]' | tr -c '[:alnum:]' '_' | sed 's/_$//g') | |
| fi | |
| } | |
| set_config_var() { | |
| is_with=n | |
| case "$1" in | |
| "--enable-"*) | |
| name="${1#--enable-}" | |
| cfg="${ENABLE_VARS}" | |
| ;; | |
| "--disable-"*) | |
| name="${1#--disable-}"; | |
| cfg="${DISABLE_VARS}"; | |
| ;; | |
| "--with-"*) | |
| # IFS="=" read -ra WITHARGS <<< "${1}" | |
| name="${1#--with-}" | |
| cfg="${WITH_VARS}" | |
| is_with=y | |
| ;; | |
| esac | |
| found=n | |
| for varstring in $cfg; do | |
| extract_var_string $(echo "${varstring}" | tr '|' ' ') | |
| if [ "x$VAR_NAME" = "x$name" ]; then | |
| found=y | |
| break; | |
| fi | |
| done | |
| if [ "$found" = "y" ]; then | |
| if [ "x$is_with" = "xy" ]; then | |
| CMAKE_ARGS="$CMAKE_ARGS -D${VAR_UC_NAME}=$(quote "$2")" | |
| else | |
| CMAKE_ARGS="$CMAKE_ARGS -D${VAR_UC_NAME}=$(quote "${VAR_VALUE}")" | |
| fi | |
| else | |
| echo "Unknown parameter: ${1}" | |
| exit 1 | |
| fi | |
| } | |
| prefix_to_offset() { | |
| expr $(echo "${1}" | awk '{ print length }') + 1 | |
| } | |
| print_help() { | |
| cat <<EOF >&2 | |
| -h, --help display this help and exit | |
| --disable-debug disable debugging mode | |
| --pass-thru pass remaining arguments through to CMake | |
| --prefix=PREFIX install architecture-independent files in PREFIX | |
| [$PREFIX] | |
| --bindir=DIR user executables [PREFIX/bin] | |
| --sbindir=DIR system admin executables [PREFIX/sbin] | |
| --libexecdir=DIR program executables [PREFIX/libexec] | |
| --sysconfdir=DIR read-only single-machine data [PREFIX/etc] | |
| --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] | |
| --localstatedir=DIR modifiable single-machine data [PREFIX/var] | |
| --libdir=DIR object code libraries [PREFIX/lib] | |
| --includedir=DIR C header files [PREFIX/include] | |
| --oldincludedir=DIR C header files for non-gcc [/usr/include] | |
| --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] | |
| --datadir=DIR read-only architecture-independent data [DATAROOTDIR] | |
| --infodir=DIR info documentation [DATAROOTDIR/info] | |
| --localedir=DIR locale-dependent data [DATAROOTDIR/locale] | |
| --mandir=DIR man documentation [DATAROOTDIR/man] | |
| --docdir=DIR documentation root [DATAROOTDIR/doc/PROJECT_NAME] | |
| EOF | |
| first=y | |
| for varstring in ${ENABLE_VARS}; do | |
| if [ $first = 'y' ]; then | |
| echo "" | |
| first=n | |
| fi | |
| extract_var_string $(echo "${varstring}" | tr '|' ' ') | |
| var_doc_name="ENABLE_${VAR_UC_NAME}_DOC" | |
| eval "docstring=\$$var_doc_name" | |
| if [ "x${docstring}" = "x" ]; then | |
| printf " --enable-%-14s enable %s support\n" "${VAR_NAME}" "$(echo -n "${VAR_NAME}" | tr '-' ' ')" | |
| else | |
| printf " --enable-%-14s %s\n" "${VAR_NAME}" "$docstring" | |
| fi | |
| done | |
| first=y | |
| for varstring in ${DISABLE_VARS}; do | |
| if [ $first = 'y' ]; then | |
| echo "" | |
| first=n | |
| fi | |
| extract_var_string $(echo "${varstring}" | tr '|' ' ') | |
| var_doc_name="DISABLE_${VAR_UC_NAME}_DOC" | |
| eval "docstring=\$$var_doc_name" | |
| if [ "x${docstring}" = "x" ]; then | |
| printf " --disable-%-13s disable %s support\n" "${VAR_NAME}" "$(echo -n "${VAR_NAME}" | tr '-' ' ')" | |
| else | |
| printf " --disable-%-13s %s\n" "${VAR_NAME}" "$docstring" | |
| fi | |
| done | |
| first=y | |
| for varstring in ${WITH_VARS}; do | |
| if [ $first = 'y' ]; then | |
| echo "" | |
| first=n | |
| fi | |
| extract_var_string $(echo "${varstring}" | tr '|' ' ') | |
| var_doc_name="WITH_${VAR_UC_NAME}_DOC" | |
| eval "docstring=\$$var_doc_name" | |
| paraminfo="${VAR_NAME}=${VAR_VALUE}" | |
| if [ "x${docstring}" = "x" ]; then | |
| printf " --with-%-16s enable %s support\n" "$paraminfo" "$(echo -n "${VAR_NAME}" | tr '-' ' ')" | |
| else | |
| printf " --with-%-16s %s\n" "$paraminfo" "$docstring" | |
| fi | |
| done | |
| exit 0 | |
| } | |
| while [ $# != 0 ]; do | |
| case "$1" in | |
| "--prefix="*) | |
| PREFIX="${1#*=}";; | |
| "--prefix") | |
| PREFIX="${2}"; shift;; | |
| "--bindir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_BINDIR=$(quote "${1#*=}")";; | |
| "--bindir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_BINDIR=$(quote "$2")"; shift;; | |
| "--sbindir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SBINDIR=$(quote "${1#*=}")";; | |
| "--sbindir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SBINDIR=$(quote "$2")"; shift;; | |
| "--libexecdir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LIBEXECDIR=$(quote "${1#*=}")";; | |
| "--libexecdir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LIBEXECDIR=$(quote "$2")"; shift;; | |
| "--sysconfdir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SYSCONFDIR=$(quote "${1#*=}")";; | |
| "--sysconfdir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SYSCONFDIR=$(quote "$2")"; shift;; | |
| "--sharedstatedir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SHAREDSTATEDIR=$(quote "${1#*=}")";; | |
| "--sharedstatedir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SHAREDSTATEDIR=$(quote "$2")"; shift;; | |
| "--localstatedir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALSTATEDIR=$(quote "${1#*=}")";; | |
| "--localstatedir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALSTATEDIR=$(quote "$2")"; shift;; | |
| "--libdir="*) | |
| LIBDIR="${1#*=}";; | |
| "--libdir") | |
| LIBDIR="${2}"; shift;; | |
| "--includedir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INCLUDEDIR=$(quote "${1#*=}")";; | |
| "--includedir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INCLUDEDIR=$(quote "$2")"; shift;; | |
| "--oldincludedir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_OLDINCLUDEDIR=$(quote "${1#*=}")";; | |
| "--oldincludedir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_OLDINCLUDEDIR=$(quote "$2")"; shift;; | |
| "--datarootdir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATAROOTDIR=$(quote "${1#*=}")";; | |
| "--datarootdir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATAROOTDIR=$(quote "$2")"; shift;; | |
| "--datadir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATADIR=$(quote "${1#*=}")";; | |
| "--datadir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATADIR=$(quote "$2")"; shift;; | |
| "--infodir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INFODIR=$(quote "${1#*=}")";; | |
| "--infodir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INFODIR=$(quote "$2")"; shift;; | |
| "--localedir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALEDIR=$(quote "${1#*=}")";; | |
| "--localedir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALEDIR=$(quote "$2")"; shift;; | |
| "--mandir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_MANDIR=$(quote "${1#*=}")";; | |
| "--mandir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_MANDIR=$(quote "$2")"; shift;; | |
| "--docdir="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DOCDIR=$(quote "${1#*=}")";; | |
| "--docdir") | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DOCDIR=$(quote "$2")"; shift;; | |
| "CC="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_COMPILER=$(quote "${1#*=}")";; | |
| "CXX="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_COMPILER=$(quote "${1#*=}")";; | |
| "CFLAGS="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_FLAGS=$(quote "${1#*=}")";; | |
| "CXXFLAGS="*) | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_FLAGS=$(quote "${1#*=}")";; | |
| "LDFLAGS="*) | |
| LDFLAGS="$LDFLAGS ${1#*=}";; | |
| "--help") | |
| print_help;; | |
| "-h") | |
| print_help;; | |
| # This flag is the only one which may be a bit surprising to | |
| # people. Autotools always builds with debugging symbols enabled | |
| # (AFAIK), but for cmake you have to do -DCMAKE_BUILD_TYPE=Debug. | |
| # Unfortunately this can change other things as well, so although | |
| # I realize there is no --disable-debug flag I thought it would be | |
| # prudent to support one here. | |
| "--disable-debug") | |
| BUILD_TYPE="Release";; | |
| "--pass-thru") | |
| shift; | |
| while [ $# != 0 ]; do | |
| CMAKE_ARGS="$CMAKE_ARGS $(quote "${1}")"; | |
| shift; | |
| done;; | |
| "--enable-"*) | |
| set_config_var "$1" | |
| ;; | |
| "--disable-"*) | |
| set_config_var "$1" | |
| ;; | |
| "--with-"*) | |
| name=$(echo "${1#--with-}" | awk '{split($1,v,"="); print v[1]}') | |
| case "${1}" in | |
| "--with-${name}="*) | |
| set_config_var "--with-${name}" "${1#--with-${name}=}";; | |
| "--with-${name}") | |
| set_config_var "$1" "$2"; | |
| shift;; | |
| esac | |
| ;; | |
| *) | |
| echo "$0: error: unrecognized option: \`$1'" >&2 | |
| echo "Try \`$0 --help' for more information" >&2 | |
| exit -1 | |
| esac; | |
| shift | |
| done | |
| if [ "x${LIBDIR}" = "x" ]; then | |
| LIBDIR="${PREFIX}/lib" | |
| fi | |
| # Unlike CFLAGS/CXXFLAGS/CC/CXX, LDFLAGS isn't handled by CMake, so we | |
| # need to parse it here. | |
| if [ "x${LDFLAGS}" != "x" ]; then | |
| for varname in EXE MODULE SHARED STATIC; do | |
| CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_${varname}_LINKER_FLAGS=$(quote "$LDFLAGS")" | |
| done | |
| fi | |
| eval "${CMAKE_CMD}" "${TOP_SRCDIR}" -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" -DCMAKE_INSTALL_PREFIX="${PREFIX}" -DCMAKE_INSTALL_LIBDIR="${LIBDIR}" ${CMAKE_ARGS} |