configure-cmake revision 1.1 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