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