You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
318 lines
11 KiB
318 lines
11 KiB
#!/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}/.configure-custom.sh" ]; then |
|
. "${TOP_SRCDIR}/.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}
|
|
|