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