196 lines
8.0 KiB
Bash
Executable File
196 lines
8.0 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
|
|
#
|
|
# Convenience wrapper for easily viewing/setting options that
|
|
# the project's CMake scripts will recognize
|
|
#
|
|
# Adapted from Zeek's wrapper.
|
|
|
|
set -e
|
|
|
|
# Defaults
|
|
cmake_binary_packaging_mode="no"
|
|
cmake_bison_root=""
|
|
cmake_build_directory="build"
|
|
cmake_build_shared_libs="yes"
|
|
cmake_build_toolchain="yes"
|
|
cmake_build_type="Release"
|
|
cmake_c_compiler=""
|
|
cmake_cxx_compiler=""
|
|
cmake_flex_root=""
|
|
cmake_generator=""
|
|
cmake_install_prefix="/usr/local"
|
|
cmake_use_ccache="no"
|
|
cmake_use_gold="yes"
|
|
cmake_use_precompiled_headers="yes"
|
|
cmake_use_sanitizers=""
|
|
cmake_use_werror="no"
|
|
|
|
display_cmake=0
|
|
cmake_cache_entries=""
|
|
|
|
set -e
|
|
command="$0 $*"
|
|
|
|
cmake_exe="<no cmake>"
|
|
for i in cmake cmake3; do
|
|
if which $i >/dev/null; then
|
|
version="$($i --version 2>&1 | grep "cmake.*version" | awk -F '[ .]' '{print $3}')"
|
|
test -n "${version}" && test "${version}" -ge 3 && cmake_exe=$(which $i)
|
|
break
|
|
fi
|
|
done
|
|
|
|
which "${cmake_exe}" > /dev/null 2>&1 || {
|
|
echo "\
|
|
This package requires CMake >= 3, please install it first, then you may
|
|
use this configure script to access CMake equivalent functionality.\
|
|
" >&2;
|
|
exit 1;
|
|
}
|
|
|
|
usage="\
|
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
|
|
|
Build Options:
|
|
--binary-package Toggle special logic for binary packaging
|
|
--build-dir=DIR Place build files in directory [default: ${cmake_build_directory}]
|
|
--build-static-libs Build static libraries instead [default: shared]
|
|
--build-toolchain={yes,no} Build the Spicy compiler toolchain [default: ${cmake_build_toolchain}]
|
|
--build-type=TYPE Set build type (Debug,Release,RelWithDebInfo) [default: ${cmake_build_type}]
|
|
--disable-gold On Linux, do not try to use the gold linker
|
|
--disable-precompiled-headers Disable use of precompiled headers for developer tests
|
|
--enable-ccache Build using the compiler cache cache if in PATH [default: ${cmake_use_ccache}]
|
|
--enable-debug Compile debug version (same as --build-type=Debug) [default: off]
|
|
--enable-sanitizer[=<names>] Enable sanitizer(s), default if not further specified is \"address\"
|
|
--enable-werror Treat compiler warnings as errors [default: ${cmake_use_werror}]
|
|
--generator=<generator> CMake generator to use (see cmake --help)
|
|
--prefix=PATH Installation prefix [default: ${cmake_install_prefix}]
|
|
--with-bison=<prefix> Set prefix of Bison installation
|
|
--with-c-compiler=<path> Set C compiler to use
|
|
--with-cxx-compiler=<path> Set C++ compiler to use
|
|
--with-hilti-compiler-launcher=<cmd> Set compiler launcher to use during JIT, e.g., ccache.
|
|
--with-flex=<prefix> Set prefix of Flex installation
|
|
|
|
--display-cmake Don't create build configuration, just output final CMake invocation
|
|
"
|
|
source_dir="$(cd "$(dirname "$0")" && pwd)"
|
|
|
|
if [ ! -e "$source_dir/3rdparty/doctest/CMakeLists.txt" ] && [ -d "$source_dir/.git" ]; then
|
|
echo "\
|
|
You seem to be missing the content of the 3rdparty/doctest directory.
|
|
|
|
This typically means that you performed a non-recursive git clone of
|
|
Spicy. To check out the required subdirectories, please execute:
|
|
|
|
( cd $source_dir && git submodule update --recursive --init )
|
|
" >&2;
|
|
exit 1;
|
|
fi
|
|
|
|
# Function to append a CMake cache entry definition to the
|
|
# cmake_cache_entries variable.
|
|
# $1 is the cache entry variable name
|
|
# $2 is the cache entry variable type
|
|
# $3 is the cache entry variable value
|
|
append_cache_entry () {
|
|
if [ "$3" != "" ]; then
|
|
cmake_cache_entries="${cmake_cache_entries} -D $1:$2=$3"
|
|
fi
|
|
}
|
|
|
|
# parse arguments
|
|
while [ $# -ne 0 ]; do
|
|
case "$1" in
|
|
-*=*) optarg=$(echo "$1" | sed 's/[-_a-zA-Z0-9]*=//') ;;
|
|
*) optarg= ;;
|
|
esac
|
|
|
|
case "$1" in
|
|
--binary-package) cmake_binary_packaging_mode="yes";;
|
|
--build-dir=*|--builddir=*) cmake_build_directory="${optarg}";;
|
|
--build-static-libs) cmake_build_shared_libs="no";;
|
|
--build-toolchain=*) cmake_build_toolchain="${optarg}";;
|
|
--build-type=*) cmake_build_type="${optarg}";;
|
|
--disable-gold) cmake_use_gold="no";;
|
|
--disable-precompiled-headers) cmake_use_precompiled_headers="no";;
|
|
--enable-ccache) cmake_use_ccache="yes";;
|
|
--enable-debug) cmake_build_type="Debug";;
|
|
--enable-sanitizer) cmake_use_sanitizers="address";;
|
|
--enable-sanitizer=*) cmake_use_sanitizers="${optarg}";;
|
|
--enable-werror) cmake_use_werror="yes";;
|
|
--generator=*) cmake_generator="${optarg}";;
|
|
--prefix=*) cmake_install_prefix="${optarg}";;
|
|
--with-c-compiler=*) cmake_c_compiler="${optarg}";;
|
|
--with-cxx-compiler=*)
|
|
cmake_cxx_compiler="${optarg}"
|
|
|
|
if [ -z "${cmake_c_compiler}" ]; then
|
|
try_c_compiler=$(echo "${cmake_cxx_compiler}" | sed 's/++//g')
|
|
which "${try_c_compiler}" >/dev/null && cmake_c_compiler="${try_c_compiler}"
|
|
fi
|
|
;;
|
|
|
|
--with-hilti-compiler-launcher=*) hilti_compiler_launcher="${optarg}";;
|
|
|
|
--with-flex=*) cmake_flex_root="${optarg}";;
|
|
--with-bison=*) cmake_bison_root="${optarg}";;
|
|
--without-bison=*) cmake_bison_root="";;
|
|
--without-flex=*) cmake_flex_root="";;
|
|
|
|
--display-cmake) display_cmake=1;;
|
|
|
|
--help|-h) echo "${usage}" 1>&2 && exit 1;;
|
|
*) echo "Invalid option '$1'. Try $0 --help to see available options." && exit 1;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# Set CMake cache options.
|
|
append_cache_entry BINARY_PACKAGING_MODE BOOL "${cmake_binary_packaging_mode}"
|
|
append_cache_entry BISON_ROOT PATH "${cmake_bison_root}"
|
|
append_cache_entry BUILD_SHARED_LIBS BOOL "${cmake_build_shared_libs}"
|
|
append_cache_entry BUILD_TOOLCHAIN BOOL "${cmake_build_toolchain}"
|
|
append_cache_entry CMAKE_BUILD_TYPE STRING "${cmake_build_type}"
|
|
append_cache_entry CMAKE_C_COMPILER PATH "${cmake_c_compiler}"
|
|
append_cache_entry CMAKE_CXX_COMPILER PATH "${cmake_cxx_compiler}"
|
|
append_cache_entry CMAKE_INSTALL_PREFIX PATH "${cmake_install_prefix}"
|
|
append_cache_entry HILTI_COMPILER_LAUNCHER STRING "${hilti_compiler_launcher}"
|
|
append_cache_entry FLEX_ROOT PATH "${cmake_flex_root}"
|
|
append_cache_entry USE_CCACHE BOOL "${cmake_use_ccache}"
|
|
append_cache_entry USE_GOLD BOOL "${cmake_use_gold}"
|
|
append_cache_entry USE_SANITIZERS STRING "${cmake_use_sanitizers}"
|
|
append_cache_entry HILTI_DEV_PRECOMPILE_HEADERS BOOL "${cmake_use_precompiled_headers}"
|
|
append_cache_entry USE_WERROR BOOL "${cmake_use_werror}"
|
|
|
|
if [ -n "${cmake_generator}" ]; then
|
|
cmake="${cmake_exe} -G '${cmake_generator}' ${cmake_cache_entries} ${source_dir}"
|
|
else
|
|
cmake="${cmake_exe} ${cmake_cache_entries} ${source_dir}"
|
|
fi
|
|
|
|
if [ "${display_cmake}" = 1 ]; then
|
|
echo "${cmake}"
|
|
exit 0
|
|
fi
|
|
|
|
if [ ! -d "${cmake_build_directory}" ]; then
|
|
# Create build directory
|
|
mkdir -p "${cmake_build_directory}"
|
|
else
|
|
# If build directory already exists, remove any pre-existing
|
|
# CMake cache so that this configuration is not tainted by a
|
|
# previous one
|
|
rm -f "${cmake_build_directory}"/CMakeCache.txt
|
|
fi
|
|
|
|
cd "${cmake_build_directory}"
|
|
fail=$(mktemp)
|
|
{ eval "${cmake}" 2>&1 || echo > "$fail"; } | tee config.log && [ ! -s "$fail" ]
|
|
rm "$fail"
|
|
|
|
echo "# This is the command used to configure this build" > config.status
|
|
echo "${command}" >> config.status
|
|
chmod u+x config.status
|