123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400 |
- #!/bin/sh
- ### Custom configure script of Dinit.
- ## Initial prepartion
- set -eu
- cd "$(dirname "$0")"
- ## Helper functions
- # According to POSIX, echo has some unspecified behavior in some cases, for example
- # when its first argument is "-n" or backslash ("\"). We prefer to rely on
- # POSIX documented things.
- # So we replace shell built-in echo with a printf based function.
- # For more info see http://www.etalabs.net/sh_tricks.html
- echo()
- {
- IFS=" " printf %s\\n "$*"
- }
- info()
- {
- echo "$*"
- }
- sub_info()
- {
- echo " ... $*"
- }
- error()
- {
- >&2 echo "Error: $*"
- exit 1
- }
- sub_error()
- {
- >&2 echo " ... Error: $*"
- exit 1
- }
- warning()
- {
- echo
- echo "Warning: $*"
- }
- sub_warning()
- {
- echo " ... $*"
- echo
- }
- findcxx()
- {
- if type "$1" > /dev/null 2>&1; then
- CXX="$1"
- fi
- }
- cxx_works()
- {
- info Checking "$1" works...
- if ! $CXX -o testfile.o testfile.cc; then
- rm -f testfile*
- sub_error Seems like C++ compiler is not working!
- else
- rm -f testfile
- sub_info Yes.
- fi
- }
- try_cxx_argument()
- {
- info Checking whatever compiler accepts "$2"...
- if $CXX $CXXFLAGS $2 $CXXFLAGS_EXTRA $LDFLAGS $LDFLAGS_EXTRA testfile.cc -o testfile > /dev/null 2>&1; then
- rm testfile
- sub_info Yes.
- eval "$1=\"\${$1} \$2\""
- eval "$1=\${$1# }"
- else
- if [ "$2" = "-std=c++11" ]; then
- sub_error "Seems like C++ compiler don't support $2 but It's required!"
- else
- sub_info No.
- fi
- fi
- }
- try_ld_argument()
- {
- info Checking whatever linker accepts "$2"...
- if $CXX $CXXFLAGS $CXXFLAGS_EXTRA $LDFLAGS $LDFLAGS_EXTRA $2 testfile.cc -o testfile > /dev/null 2>&1; then
- sub_info Yes.
- eval "$1=\"\${$1} \$2\""
- eval "$1=\${$1# }"
- else
- sub_info No.
- fi
- }
- try_both_argument()
- {
- info Checking whatever compiler/linker accepts "$3"...
- if $CXX $CXXFLAGS $CXXFLAGS_EXTRA $LDFLAGS $LDFLAGS_EXTRA $3 testfile.cc -o testfile > /dev/null 2>&1; then
- sub_info Yes.
- eval "$1=\"\${$1} \$3\""
- eval "$1=\${$1# }"
- eval "$2=\"\${$2} \$3\""
- eval "$2=\${$2# }"
- else
- sub_info No.
- fi
- }
- usage()
- {
- cat << _EOF
- Usage: $0 [OPTION]...
- Defaults for the options are specified in brackets.
- --help This help message.
- --quiet Don't print normal messages, just errors.
- --clean Clear mconfig and configure's temp files.
- Target options:
- --platform=PLATFORM Set the platform manually (Just for cross-platform cross-compile!) [autodetected]
- For all cross-compiles (even this) don't forget to set correct CXX and CXX_FOR_BUILD!
- Installation directories:
- --prefix=PREFIX Main installtion prefix [/usr]
- --exec-prefix=EPREFIX Main executables location [/]
- --sbindir=SBINDIR Dinit executables [EPREFIX/sbin]
- --mandir=MANDIR Dinit man-pages location [PREFIX/share/man]
- --syscontrolsocket=SOCKETPATH Dinitctl socket location [/run/dinitctl] on Linux based systems
- [/var/run/dinitctl] on Other systems
- Optional options:
- --shutdown-prefix=PREFIX Name prefix for shutdown, poweroff, reboot, halt programs []
- --enable-shutdown Build shutdown, poweroff, reboot, halt programs [Enabled only on Linux based systems]
- --disable-shutdown Don't build shutdown, poweroff, reboot, halt programs
- --enable-cgroups Enable Cgroups support [Enabled only on Linux based systems]
- --disable-cgroups Disable Cgroups support
- --enable-utmpx Enable manipulating the utmp/utmpx database via the related POSIX functions [auto]
- --disable-utmpx Disable manipulating the utmp/utmpx database via the related POSIX functions
- Environment variables can be used:
- Note: environments vars can be passed as $0 argument.
- Note: CXXFLAGS , TEST_CXXFLAGS, LDFLAGS and TEST_LDFLAGS will be set to the options that the configure
- script uses as default for the platform, filtered to remove any options not supported by the
- compiler/linker. For disable this thing just pass empty value as those things or pass some flags as them.
- CXX If you want to use specific C++ compiler.
- CXX_FOR_BUILD If you want to cross-compiling and set the native C++ compiler.
- CXXFLAGS_FOR_BUILD If you want to use some arguments in native C++ compiler.
- By default it's same as CXXFLAGS.
- CPPFLAGS_FOR_BUILD If you want to use some arguments in native C++ compiler preprocessor.
- By default it's same as CPPFLAGS.
- LDFLAGS_FOR_BUILD If you want to use some arguments in native Linker command line.
- By default it's same as LDFLAGS.
- CXXFLAGS If you want to use some arguments in C++ compiler command line.
- CXXFLAGS_EXTRA If you want to use some arguments in C++ compiler command line.
- It's passed after CXXFLAGS without overwrite it.
- TEST_CXXFLAGS If you want to use some arguments in C++ compiler for testing.
- TEST_CXXFLAGS_EXTRA If you want to use some arguments in C++ compiler for testing.
- It's passed after TEST_CXXFLAGS without overwrite it.
- CPPFLAGS If you want to use some arguments in C++ compiler preprocessor.
- LDFLAGS If you want to use some arguments in Linker command line.
- LDFLAGS_EXTRA If you want to use some arguments in Linker command line.
- It's passed after LDFLAGS without overwrite it.
- TEST_LDFLAGS If you want to use some arguments in Linker for testing.
- TEST_LDFLAGS_EXTRA If you want to use some arguments in Linker for testing.
- It's passed after TEST_LDFLAGS without overwrite it.
- Note: be careful about passing a path with space as prefix/eprefix/sbindir/mandir:
- for this thing You need to use backslash (\) with double quotation (") for every space.
- For example: ./configure --sbindir="/usr/bin\ with\ space/"
- See BUILD file for more information.
- _EOF
- exit 0
- }
- ## Don't take values from env for these variables
- for var in PREFIX \
- EPREFIX \
- SBINDIR \
- MANDIR \
- NO_SANITIZE \
- SHUTDOWN_PREFIX \
- BUILD_SHUTDOWN \
- SUPPORT_CGROUPS \
- SYSCONTROLSOCKET
- do
- unset $var
- done
- ## Flag parser
- for arg in "$@"; do
- case "$arg" in
- --help) usage ;;
- --quiet)
- info() { true; }
- sub_info() { true; }
- warning() { true; }
- sub_warning() { true; }
- ;;
- --clean) rm -f test* & rm -f mconfig && exit 0 ;;
- --platform=*) PLATFORM="${arg#*=}" && shift ;;
- --prefix=*) PREFIX="${arg#*=}" && shift ;;
- --exec-prefix=*) EPREFIX="${arg#*=}" && shift;;
- --sbindir=*) SBINDIR="${arg#*=}" && shift ;;
- --mandir=*) MANDIR="${arg#*=}" && shift ;;
- --syscontrolsocket=*) SYSCONTROLSOCKET="${arg#*=}" && shift ;;
- --shutdown-prefix=*) SHUTDOWN_PREFIX="${arg#*=}" && shift ;;
- --enable-shutdown|--enable-shutdown=yes) BUILD_SHUTDOWN=yes ;;
- --disable-shutdown|--enable-shutdown=no) BUILD_SHUTDOWN=no ;;
- --enable-cgroups|--enable-cgroups=yes) SUPPORT_CGROUPS=1 ;;
- --disable-cgroups|--enable-cgroups=no) SUPPORT_CGROUPS=0 ;;
- --enable-utmpx|--enable-utmpx=yes) USE_UTMPX=1 ;;
- --disable-utmpx|--enable-utmpx=no) USE_UTMPX=0 ;;
- CXX=*|CXX_FOR_BUILD=*|CXXFLAGS_FOR_BUILD=*|CPPFLAGS_FOR_BUILD=*\
- |LDFLAGS_FOR_BUILD=*|CXXFLAGS=*|CXXFLAGS_EXTRA=*|TEST_CXXFLAGS=*\
- |TEST_CXXFLAGS_EXTRA|LDFLAGS=*|LDFLAGS_EXTRA=*|TEST_LDFLAGS=*\
- |TEST_LDFLAGS_EXTRA=*|CPPFLAGS=*) eval "${arg%%=*}=\${arg#*=}" ;;
- *=*) warning Unknown variable: "${arg%%=*}" ;;
- *) warning Unknown argument: "$arg" ;;
- esac
- done
- ## General Defines
- : "${PLATFORM:=$(uname)}"
- : "${PREFIX:="/usr"}"
- : "${EPREFIX:="/"}"
- : "${SBINDIR:="/sbin"}"
- : "${MANDIR:="/share/man/"}"
- : "${NO_SANITIZE:="auto"}"
- : "${SHUTDOWN_PREFIX:=""}"
- : "${CXXFLAGS_EXTRA:=""}"
- : "${TEST_CXXFLAGS_EXTRA:=""}"
- : "${CPPFLAGS:=""}"
- : "${LDFLAGS_EXTRA:=""}"
- : "${TEST_LDFLAGS_EXTRA:=""}"
- if [ "$PLATFORM" = "Linux" ]; then
- : "${BUILD_SHUTDOWN:="yes"}"
- : "${SUPPORT_CGROUPS:="1"}"
- : "${SYSCONTROLSOCKET:="/run/dinitctl"}"
- else
- : "${BUILD_SHUTDOWN:="no"}"
- : "${SUPPORT_CGROUPS:="0"}"
- : "${SYSCONTROLSOCKET:="/var/run/dinitctl"}"
- fi
- ## Resolve final paths
- SBINDIR="$EPREFIX/$SBINDIR"
- MANDIR="$PREFIX/$MANDIR"
- ## Finalize $CXXFLAGS, $TEST_CXXFLAGS, $LDFLAGS, $TEST_LDFLAGS
- if [ -z "${CXXFLAGS+IS_SET}" ]; then
- CXXFLAGS=""
- AUTO_CXXFLAGS="true"
- else
- AUTO_CXXFLAGS="false"
- fi
- if [ -z "${TEST_CXXFLAGS+IS_SET}" ]; then
- TEST_CXXFLAGS=""
- AUTO_TEST_CXXFLAGS="true"
- else
- AUTO_TEST_CXXFLAGS="false"
- fi
- if [ -z "${LDFLAGS+IS_SET}" ]; then
- LDFLAGS=""
- AUTO_LDFLAGS="true"
- else
- AUTO_LDFLAGS="false"
- fi
- if [ -z "${TEST_LDFLAGS+IS_SET}" ]; then
- TEST_LDFLAGS=""
- AUTO_TEST_LDFLAGS="true"
- else
- AUTO_TEST_LDFLAGS="false"
- fi
- ## Verify PLATFORM value
- if [ "$PLATFORM" != "Linux" ] && [ "$PLATFORM" != "FreeBSD" ] && \
- [ "$PLATFORM" != "OpenBSD" ] && [ "$PLATFORM" != "Darwin" ]; then
- warning "$PLATFORM" platform is unknown!
- sub_warning Known Platforms are: Linux, FreeBSD, OpenBSD, Darwin
- fi
- ## Create testfile.cc to test c++ compiler
- echo "int main(int argc, char **argv) { return 0; }" > testfile.cc || error Cant create test file
- ## Find and test C++ compiler
- if [ -z "${CXX:-}" ]; then
- info Checking C++ compiler...
- for guess in g++ clang++ c++; do
- findcxx "$guess"
- if [ -n "${CXX:-}" ]; then
- sub_info "$CXX"
- break # Found
- fi
- done
- if [ -z "${CXX:-}" ]; then
- sub_error No C++ compiler found! # Not found
- fi
- fi
- cxx_works "$CXX"
- if [ -n "${CXX_FOR_BUILD:-}" ]; then
- cxx_works "$CXX_FOR_BUILD"
- fi
- ## Test compiler/linker supported arguments
- if [ "$AUTO_CXXFLAGS" = "true" ]; then
- for argument in -std=c++11 \
- -Wall \
- -Os \
- -fno-plt
- do
- try_cxx_argument CXXFLAGS $argument
- done
- if [ "$PLATFORM" != "Darwin" ]; then
- try_cxx_argument CXXFLAGS -fno-rtti
- fi
- fi
- if [ "$AUTO_LDFLAGS" = "true" ] && [ "$AUTO_CXXFLAGS" = "true" ]; then
- try_both_argument CXXFLAGS LDFLAGS -flto
- fi
- if [ "$AUTO_LDFLAGS" = "true" ] && [ "$PLATFORM" = "FreeBSD" ]; then
- try_ld_argument LDFLAGS -lrt
- fi
- # Add $CXXFLAGS and $LDFLAGS to $TEST_{LD,CXX}FLAGS when AUTO_TEST vars are true
- if [ "$AUTO_TEST_CXXFLAGS" = "true" ]; then
- TEST_CXXFLAGS="$CXXFLAGS"
- fi
- if [ "$AUTO_TEST_LDFLAGS" = "true" ]; then
- TEST_LDFLAGS="$LDFLAGS"
- fi
- if [ "$AUTO_TEST_LDFLAGS" = "true" ] && [ "$AUTO_TEST_CXXFLAGS" = "true" ]; then
- try_both_argument TEST_CXXFLAGS TEST_LDFLAGS -fsanitize=address,undefined
- fi
- ## Create mconfig
- rm -f testfile*
- info Creating mconfig...
- cat << _EOF > mconfig
- ## Auto-generated by "$0" for "$PLATFORM"
- # All changes will be lost if "$0" will be runned.
- # Installation path options.
- SBINDIR=$SBINDIR
- MANDIR=$MANDIR
- SYSCONTROLSOCKET=$SYSCONTROLSOCKET
- # General build options.
- # Linux (GCC): Note with GCC 5.x/6.x you must use the old ABI, with GCC 7.x you must use
- # the new ABI. See BUILD file for more information.
- # MacOS: Cannot use -fno-rtti: apparently prevents exception handling from working properly.
- # FreeBSD: Cannot use LTO with default linker.
- CXX=$CXX
- CXXFLAGS=$CXXFLAGS
- CXXFLAGS_EXTRA=$CXXFLAGS_EXTRA
- TEST_CXXFLAGS=$TEST_CXXFLAGS
- TEST_CXXFLAGS_EXTRA=$TEST_CXXFLAGS_EXTRA
- CPPFLAGS=$CPPFLAGS
- LDFLAGS=$LDFLAGS
- LDFLAGS_EXTRA=$LDFLAGS_EXTRA
- TEST_LDFLAGS=$TEST_LDFLAGS
- TEST_LDFLAGS_EXTRA=$TEST_LDFLAGS_EXTRA
- BUILD_SHUTDOWN=$BUILD_SHUTDOWN
- # Feature settings
- SUPPORT_CGROUPS=$SUPPORT_CGROUPS
- # Optional settings
- SHUTDOWN_PREFIX=${SHUTDOWN_PREFIX:-}
- _EOF
- if [ -n "${USE_UTMPX:-}" ]; then
- echo "USE_UTMPX=$USE_UTMPX" >> mconfig
- fi
- if [ -n "${CXX_FOR_BUILD:-}" ]; then
- {
- echo ""
- echo "# For cross-compiling"
- echo "CXX_FOR_BUILD=$CXX_FOR_BUILD"
- } >> mconfig
- fi
- if [ -n "${CXXFLAGS_FOR_BUILD:-}" ]; then
- echo "CXXFLAGS_FOR_BUILD=$CXXFLAGS_FOR_BUILD" >> mconfig
- fi
- if [ -n "${CPPFLAGS_FOR_BUILD:-}" ]; then
- echo "CPPFLAGS_FOR_BUILD=$CPPFLAGS_FOR_BUILD" >> mconfig
- fi
- if [ -n "${LDFLAGS_FOR_BUILD:-}" ]; then
- echo "LDFLAGS_FOR_BUILD=$LDFLAGS_FOR_BUILD" >> mconfig
- fi
- sub_info done.
- info Done!
- exit 0
|