366 lines
13 KiB
Bash
Executable File
366 lines
13 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# 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)"
|
|
CMAKE=cmake
|
|
|
|
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/[\\b]*$//')
|
|
|
|
if [ "x$VAR_VALUE" = "x" ]; then
|
|
if [ "x$2" != "x" ]; then
|
|
VAR_VALUE=$2
|
|
else
|
|
VAR_VALUE=yes
|
|
fi
|
|
fi
|
|
|
|
if [ "x$3" != "x" ]; then
|
|
VAR_UC_NAME=$3
|
|
VAR_UC=$(echo "$1" | tr '[:lower:]' '[:upper:]' | tr -c '[:alnum:]' '_' | sed 's/_$//g')
|
|
else
|
|
VAR_UC_NAME=$(echo "$1" | tr '[:lower:]' '[:upper:]' | tr -c '[:alnum:]' '_' | sed 's/_$//g')
|
|
fi
|
|
}
|
|
|
|
set_config_var() {
|
|
is_with=n
|
|
found=y
|
|
arg=$(echo "${2}" | tr '[:upper:]' '[:lower:]' )
|
|
case "$1" in
|
|
"--enable-"*)
|
|
name="${1#--enable-}"
|
|
cfg="${ENABLE_VARS}"
|
|
case "x$arg" in
|
|
"xy"|"xyes"|"xtrue")
|
|
VAR_VALUE=yes
|
|
;;
|
|
"xn"|"xno"|"xfalse")
|
|
found=y
|
|
VAR_VALUE=no
|
|
;;
|
|
**)
|
|
VAR_VALUE=""
|
|
;;
|
|
esac
|
|
;;
|
|
"--disable-"*)
|
|
name="${1#--disable-}";
|
|
cfg="${ENABLE_VARS}"
|
|
case "x$arg" in
|
|
"xy"|"xyes"|"xtrue")
|
|
VAR_VALUE=no
|
|
;;
|
|
"xn"|"xno"|"xfalse")
|
|
VAR_VALUE=yes
|
|
;;
|
|
**)
|
|
VAR_VALUE=""
|
|
;;
|
|
esac
|
|
;;
|
|
"--with-"*)
|
|
# IFS="=" read -ra WITHARGS <<< "${1}"
|
|
name="${1#--with-}"
|
|
cfg="${WITH_VARS}"
|
|
case "x$arg" in
|
|
"x"|"xy"|"xyes"|"xtrue")
|
|
is_with=n
|
|
VAR_VALUE=yes
|
|
``;;
|
|
"xn"|"xno"|"xfalse")
|
|
is_with=n
|
|
VAR_VALUE=no
|
|
;;
|
|
**)
|
|
is_with=y
|
|
VAR_VALUE=""
|
|
;;
|
|
esac
|
|
|
|
;;
|
|
esac
|
|
|
|
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 "$VAR_VALUE") -D${VAR_UC}_ROOT_DIR=$(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
|
|
--cmake=CMAKE use a specific cmake, not the default
|
|
--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
|
|
|
|
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
|
|
"--cmake="*)
|
|
CMAKE="${1#*=}";;
|
|
"--cmake")
|
|
CMAKE="${2}"; shift;;
|
|
"--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-"*)
|
|
name=$(echo "${1#--enable-}" | awk '{split($1,v,"="); print v[1]}')
|
|
set_config_var "--with-${name}" "${1#--enable-${name}=}"
|
|
;;
|
|
|
|
"--disable-"*)
|
|
name=$(echo "${1#--disable-}" | awk '{split($1,v,"="); print v[1]}')
|
|
set_config_var "--with-${name}" "${1#--disable-${name}=}"
|
|
;;
|
|
|
|
"--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
|
|
|
|
CMAKE_CMD="'${CMAKE} ${TOP_SRCDIR}"
|
|
echo "${CMAKE} ${TOP_SRCDIR} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${PREFIX} -DCMAKE_INSTALL_LIBDIR=${LIBDIR} ${CMAKE_ARGS}"
|