Home | History | Annotate | Line # | Download | only in dist
      1  1.1  mrg #!/usr/bin/env bash
      2  1.1  mrg 
      3  1.1  mrg # Autotools-style (./configure) wrapper for CMake
      4  1.1  mrg # <https://github.com/nemequ/configure-cmake>
      5  1.1  mrg #
      6  1.1  mrg #   *** IMPORTANT ***
      7  1.1  mrg #
      8  1.1  mrg #   You must include the GNUInstallDirs module (which comes with
      9  1.1  mrg #   CMake) in your project.  Just put "include (GNUInstallDirs)" in
     10  1.1  mrg #   you CMakeLists.txt and you should be good.
     11  1.1  mrg #
     12  1.1  mrg # This script was originally written for Squash
     13  1.1  mrg # <https://quixdb.github.io/squash/> by Evan Nemerson
     14  1.1  mrg # <evan (at] nemerson.com>, but has been spun off into a separate
     15  1.1  mrg # repository.  Please feel free to copy it into your own repository,
     16  1.1  mrg # though I would appreciate it if you would post improvements, bugs,
     17  1.1  mrg # feature requests, etc. to the issue tracker at
     18  1.1  mrg # <https://github.com/nemequ/configure-cmake/issues>.
     19  1.1  mrg #
     20  1.1  mrg # To the extent possible under law, the author(s) hereby waive all
     21  1.1  mrg # copyright and related or neighboring rights to this work.  For
     22  1.1  mrg # details, see <https://creativecommons.org/publicdomain/zero/1.0/>
     23  1.1  mrg 
     24  1.1  mrg TOP_SRCDIR="$(dirname $0)"
     25  1.1  mrg 
     26  1.1  mrg if [ "${CMAKE_CMD}" = "" ]; then
     27  1.1  mrg     CMAKE_CMD="cmake"
     28  1.1  mrg fi
     29  1.1  mrg 
     30  1.1  mrg BUILD_TYPE="Debug"
     31  1.1  mrg PREFIX=/usr/local
     32  1.1  mrg LIBDIR=
     33  1.1  mrg CMAKE_ARGS=
     34  1.1  mrg 
     35  1.1  mrg if [ -e "${TOP_SRCDIR}/scripts/.configure-custom.sh" ]; then
     36  1.1  mrg     . "${TOP_SRCDIR}/scripts/.configure-custom.sh"
     37  1.1  mrg fi
     38  1.1  mrg 
     39  1.1  mrg quote() {
     40  1.1  mrg     echo "$1" | sed -e "s|'|'\\\\''|g; 1s/^/'/; \$s/\$/'/"
     41  1.1  mrg }
     42  1.1  mrg 
     43  1.1  mrg extract_var_string() {
     44  1.1  mrg     VAR_NAME=$1
     45  1.1  mrg     VAR_NAME=$(echo $1 | sed -e 's/[ \t]*$//')
     46  1.1  mrg     if [ "x$2" != "x" ]; then
     47  1.1  mrg         VAR_VALUE=$2
     48  1.1  mrg     else
     49  1.1  mrg         VAR_VALUE=yes
     50  1.1  mrg     fi
     51  1.1  mrg 
     52  1.1  mrg     if [ "x$3" != "x" ]; then
     53  1.1  mrg         VAR_UC_NAME=$3
     54  1.1  mrg     else
     55  1.1  mrg         VAR_UC_NAME=$(echo "$1" | tr '[:lower:]' '[:upper:]' | tr -c '[:alnum:]' '_' | sed 's/_$//g')
     56  1.1  mrg     fi
     57  1.1  mrg }
     58  1.1  mrg 
     59  1.1  mrg set_config_var() {
     60  1.1  mrg     is_with=n
     61  1.1  mrg     case "$1" in
     62  1.1  mrg         "--enable-"*)
     63  1.1  mrg             name="${1#--enable-}"
     64  1.1  mrg             cfg="${ENABLE_VARS}"
     65  1.1  mrg             ;;
     66  1.1  mrg         "--disable-"*)
     67  1.1  mrg             name="${1#--disable-}";
     68  1.1  mrg             cfg="${DISABLE_VARS}";
     69  1.1  mrg             ;;
     70  1.1  mrg         "--with-"*)
     71  1.1  mrg             # IFS="=" read -ra WITHARGS <<< "${1}"
     72  1.1  mrg             name="${1#--with-}"
     73  1.1  mrg             cfg="${WITH_VARS}"
     74  1.1  mrg             is_with=y
     75  1.1  mrg             ;;
     76  1.1  mrg     esac
     77  1.1  mrg 
     78  1.1  mrg     found=n
     79  1.1  mrg     for varstring in $cfg; do
     80  1.1  mrg         extract_var_string $(echo "${varstring}" | tr '|' ' ')
     81  1.1  mrg         if [ "x$VAR_NAME" = "x$name" ]; then
     82  1.1  mrg             found=y
     83  1.1  mrg             break;
     84  1.1  mrg         fi
     85  1.1  mrg     done
     86  1.1  mrg 
     87  1.1  mrg     if [ "$found" = "y" ]; then
     88  1.1  mrg         if [ "x$is_with" = "xy" ]; then
     89  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -D${VAR_UC_NAME}=$(quote "$2")"
     90  1.1  mrg         else
     91  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -D${VAR_UC_NAME}=$(quote "${VAR_VALUE}")"
     92  1.1  mrg         fi
     93  1.1  mrg     else
     94  1.1  mrg         echo "Unknown parameter: ${1}"
     95  1.1  mrg         exit 1
     96  1.1  mrg     fi
     97  1.1  mrg }
     98  1.1  mrg 
     99  1.1  mrg prefix_to_offset() {
    100  1.1  mrg     expr $(echo "${1}" | awk '{ print length }') + 1
    101  1.1  mrg }
    102  1.1  mrg 
    103  1.1  mrg print_help() {
    104  1.1  mrg     cat <<EOF >&2
    105  1.1  mrg   -h, --help              display this help and exit
    106  1.1  mrg   --disable-debug         disable debugging mode
    107  1.1  mrg   --pass-thru             pass remaining arguments through to CMake
    108  1.1  mrg 
    109  1.1  mrg   --prefix=PREFIX         install architecture-independent files in PREFIX
    110  1.1  mrg                           [$PREFIX]
    111  1.1  mrg   --bindir=DIR            user executables [PREFIX/bin]
    112  1.1  mrg   --sbindir=DIR           system admin executables [PREFIX/sbin]
    113  1.1  mrg   --libexecdir=DIR        program executables [PREFIX/libexec]
    114  1.1  mrg   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
    115  1.1  mrg   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
    116  1.1  mrg   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
    117  1.1  mrg   --libdir=DIR            object code libraries [PREFIX/lib]
    118  1.1  mrg   --includedir=DIR        C header files [PREFIX/include]
    119  1.1  mrg   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
    120  1.1  mrg   --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
    121  1.1  mrg   --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
    122  1.1  mrg   --infodir=DIR           info documentation [DATAROOTDIR/info]
    123  1.1  mrg   --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
    124  1.1  mrg   --mandir=DIR            man documentation [DATAROOTDIR/man]
    125  1.1  mrg   --docdir=DIR            documentation root [DATAROOTDIR/doc/PROJECT_NAME]
    126  1.1  mrg EOF
    127  1.1  mrg 
    128  1.1  mrg     first=y
    129  1.1  mrg     for varstring in ${ENABLE_VARS}; do
    130  1.1  mrg         if [ $first = 'y' ]; then
    131  1.1  mrg             echo ""
    132  1.1  mrg             first=n
    133  1.1  mrg         fi
    134  1.1  mrg         extract_var_string $(echo "${varstring}" | tr '|' ' ')
    135  1.1  mrg         var_doc_name="ENABLE_${VAR_UC_NAME}_DOC"
    136  1.1  mrg         eval "docstring=\$$var_doc_name"
    137  1.1  mrg         if [ "x${docstring}" = "x" ]; then
    138  1.1  mrg             printf "  --enable-%-14s enable %s support\n" "${VAR_NAME}" "$(echo -n "${VAR_NAME}" | tr '-' ' ')"
    139  1.1  mrg         else
    140  1.1  mrg             printf "  --enable-%-14s %s\n" "${VAR_NAME}" "$docstring"
    141  1.1  mrg         fi
    142  1.1  mrg     done
    143  1.1  mrg 
    144  1.1  mrg     first=y
    145  1.1  mrg     for varstring in ${DISABLE_VARS}; do
    146  1.1  mrg         if [ $first = 'y' ]; then
    147  1.1  mrg             echo ""
    148  1.1  mrg             first=n
    149  1.1  mrg         fi
    150  1.1  mrg         extract_var_string $(echo "${varstring}" | tr '|' ' ')
    151  1.1  mrg         var_doc_name="DISABLE_${VAR_UC_NAME}_DOC"
    152  1.1  mrg         eval "docstring=\$$var_doc_name"
    153  1.1  mrg         if [ "x${docstring}" = "x" ]; then
    154  1.1  mrg             printf "  --disable-%-13s disable %s support\n" "${VAR_NAME}" "$(echo -n "${VAR_NAME}" | tr '-' ' ')"
    155  1.1  mrg         else
    156  1.1  mrg             printf "  --disable-%-13s %s\n" "${VAR_NAME}" "$docstring"
    157  1.1  mrg         fi
    158  1.1  mrg     done
    159  1.1  mrg 
    160  1.1  mrg     first=y
    161  1.1  mrg     for varstring in ${WITH_VARS}; do
    162  1.1  mrg         if [ $first = 'y' ]; then
    163  1.1  mrg             echo ""
    164  1.1  mrg             first=n
    165  1.1  mrg         fi
    166  1.1  mrg         extract_var_string $(echo "${varstring}" | tr '|' ' ')
    167  1.1  mrg         var_doc_name="WITH_${VAR_UC_NAME}_DOC"
    168  1.1  mrg         eval "docstring=\$$var_doc_name"
    169  1.1  mrg         paraminfo="${VAR_NAME}=${VAR_VALUE}"
    170  1.1  mrg         if [ "x${docstring}" = "x" ]; then
    171  1.1  mrg             printf "  --with-%-16s enable %s support\n" "$paraminfo" "$(echo -n "${VAR_NAME}" | tr '-' ' ')"
    172  1.1  mrg         else
    173  1.1  mrg             printf "  --with-%-16s %s\n" "$paraminfo" "$docstring"
    174  1.1  mrg         fi
    175  1.1  mrg     done
    176  1.1  mrg 
    177  1.1  mrg     exit 0
    178  1.1  mrg }
    179  1.1  mrg 
    180  1.1  mrg while [ $# != 0 ]; do
    181  1.1  mrg     case "$1" in
    182  1.1  mrg         "--prefix="*)
    183  1.1  mrg             PREFIX="${1#*=}";;
    184  1.1  mrg         "--prefix")
    185  1.1  mrg             PREFIX="${2}"; shift;;
    186  1.1  mrg         "--bindir="*)
    187  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_BINDIR=$(quote "${1#*=}")";;
    188  1.1  mrg         "--bindir")
    189  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_BINDIR=$(quote "$2")"; shift;;
    190  1.1  mrg         "--sbindir="*)
    191  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SBINDIR=$(quote "${1#*=}")";;
    192  1.1  mrg         "--sbindir")
    193  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SBINDIR=$(quote "$2")"; shift;;
    194  1.1  mrg         "--libexecdir="*)
    195  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LIBEXECDIR=$(quote "${1#*=}")";;
    196  1.1  mrg         "--libexecdir")
    197  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LIBEXECDIR=$(quote "$2")"; shift;;
    198  1.1  mrg         "--sysconfdir="*)
    199  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SYSCONFDIR=$(quote "${1#*=}")";;
    200  1.1  mrg         "--sysconfdir")
    201  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SYSCONFDIR=$(quote "$2")"; shift;;
    202  1.1  mrg         "--sharedstatedir="*)
    203  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SHAREDSTATEDIR=$(quote "${1#*=}")";;
    204  1.1  mrg         "--sharedstatedir")
    205  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_SHAREDSTATEDIR=$(quote "$2")"; shift;;
    206  1.1  mrg         "--localstatedir="*)
    207  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALSTATEDIR=$(quote "${1#*=}")";;
    208  1.1  mrg         "--localstatedir")
    209  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALSTATEDIR=$(quote "$2")"; shift;;
    210  1.1  mrg         "--libdir="*)
    211  1.1  mrg             LIBDIR="${1#*=}";;
    212  1.1  mrg         "--libdir")
    213  1.1  mrg             LIBDIR="${2}"; shift;;
    214  1.1  mrg         "--includedir="*)
    215  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INCLUDEDIR=$(quote "${1#*=}")";;
    216  1.1  mrg         "--includedir")
    217  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INCLUDEDIR=$(quote "$2")"; shift;;
    218  1.1  mrg         "--oldincludedir="*)
    219  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_OLDINCLUDEDIR=$(quote "${1#*=}")";;
    220  1.1  mrg         "--oldincludedir")
    221  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_OLDINCLUDEDIR=$(quote "$2")"; shift;;
    222  1.1  mrg         "--datarootdir="*)
    223  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATAROOTDIR=$(quote "${1#*=}")";;
    224  1.1  mrg         "--datarootdir")
    225  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATAROOTDIR=$(quote "$2")"; shift;;
    226  1.1  mrg         "--datadir="*)
    227  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATADIR=$(quote "${1#*=}")";;
    228  1.1  mrg         "--datadir")
    229  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DATADIR=$(quote "$2")"; shift;;
    230  1.1  mrg         "--infodir="*)
    231  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INFODIR=$(quote "${1#*=}")";;
    232  1.1  mrg         "--infodir")
    233  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_INFODIR=$(quote "$2")"; shift;;
    234  1.1  mrg         "--localedir="*)
    235  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALEDIR=$(quote "${1#*=}")";;
    236  1.1  mrg         "--localedir")
    237  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_LOCALEDIR=$(quote "$2")"; shift;;
    238  1.1  mrg         "--mandir="*)
    239  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_MANDIR=$(quote "${1#*=}")";;
    240  1.1  mrg         "--mandir")
    241  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_MANDIR=$(quote "$2")"; shift;;
    242  1.1  mrg         "--docdir="*)
    243  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DOCDIR=$(quote "${1#*=}")";;
    244  1.1  mrg         "--docdir")
    245  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_DOCDIR=$(quote "$2")"; shift;;
    246  1.1  mrg 
    247  1.1  mrg         "CC="*)
    248  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_COMPILER=$(quote "${1#*=}")";;
    249  1.1  mrg         "CXX="*)
    250  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_COMPILER=$(quote "${1#*=}")";;
    251  1.1  mrg         "CFLAGS="*)
    252  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_C_FLAGS=$(quote "${1#*=}")";;
    253  1.1  mrg         "CXXFLAGS="*)
    254  1.1  mrg             CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_FLAGS=$(quote "${1#*=}")";;
    255  1.1  mrg         "LDFLAGS="*)
    256  1.1  mrg             LDFLAGS="$LDFLAGS ${1#*=}";;
    257  1.1  mrg 
    258  1.1  mrg         "--help")
    259  1.1  mrg             print_help;;
    260  1.1  mrg         "-h")
    261  1.1  mrg             print_help;;
    262  1.1  mrg 
    263  1.1  mrg         # This flag is the only one which may be a bit surprising to
    264  1.1  mrg         # people.  Autotools always builds with debugging symbols enabled
    265  1.1  mrg         # (AFAIK), but for cmake you have to do -DCMAKE_BUILD_TYPE=Debug.
    266  1.1  mrg         # Unfortunately this can change other things as well, so although
    267  1.1  mrg         # I realize there is no --disable-debug flag I thought it would be
    268  1.1  mrg         # prudent to support one here.
    269  1.1  mrg         "--disable-debug")
    270  1.1  mrg             BUILD_TYPE="Release";;
    271  1.1  mrg 
    272  1.1  mrg         "--pass-thru")
    273  1.1  mrg             shift;
    274  1.1  mrg             while [ $# != 0 ]; do
    275  1.1  mrg                 CMAKE_ARGS="$CMAKE_ARGS $(quote "${1}")";
    276  1.1  mrg                 shift;
    277  1.1  mrg             done;;
    278  1.1  mrg 
    279  1.1  mrg         "--enable-"*)
    280  1.1  mrg             set_config_var "$1"
    281  1.1  mrg             ;;
    282  1.1  mrg 
    283  1.1  mrg         "--disable-"*)
    284  1.1  mrg             set_config_var "$1"
    285  1.1  mrg             ;;
    286  1.1  mrg 
    287  1.1  mrg         "--with-"*)
    288  1.1  mrg             name=$(echo "${1#--with-}" | awk '{split($1,v,"="); print v[1]}')
    289  1.1  mrg             case "${1}" in
    290  1.1  mrg                 "--with-${name}="*)
    291  1.1  mrg                     set_config_var "--with-${name}" "${1#--with-${name}=}";;
    292  1.1  mrg                 "--with-${name}")
    293  1.1  mrg                     set_config_var "$1" "$2";
    294  1.1  mrg                     shift;;
    295  1.1  mrg             esac
    296  1.1  mrg             ;;
    297  1.1  mrg 
    298  1.1  mrg         *)
    299  1.1  mrg             echo "$0: error: unrecognized option: \`$1'" >&2
    300  1.1  mrg             echo "Try \`$0 --help' for more information" >&2
    301  1.1  mrg             exit -1
    302  1.1  mrg     esac;
    303  1.1  mrg     shift
    304  1.1  mrg done
    305  1.1  mrg 
    306  1.1  mrg if [ "x${LIBDIR}" = "x" ]; then
    307  1.1  mrg     LIBDIR="${PREFIX}/lib"
    308  1.1  mrg fi
    309  1.1  mrg 
    310  1.1  mrg # Unlike CFLAGS/CXXFLAGS/CC/CXX, LDFLAGS isn't handled by CMake, so we
    311  1.1  mrg # need to parse it here.
    312  1.1  mrg if [ "x${LDFLAGS}" != "x" ]; then
    313  1.1  mrg     for varname in EXE MODULE SHARED STATIC; do
    314  1.1  mrg         CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_${varname}_LINKER_FLAGS=$(quote "$LDFLAGS")"
    315  1.1  mrg     done
    316  1.1  mrg fi
    317  1.1  mrg 
    318  1.1  mrg eval "${CMAKE_CMD}" "${TOP_SRCDIR}" -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" -DCMAKE_INSTALL_PREFIX="${PREFIX}" -DCMAKE_INSTALL_LIBDIR="${LIBDIR}" ${CMAKE_ARGS}
    319