Browse Source

Add configure script to generate mconfig

Configure script for generating mconfig. Now used to automatically generate mconfig by makefiles when the platform isn't recognised (i.e. when no prewritten config exists for the platform detected via uname).

Signed-off-by: Mobin <mobin@mobintestserver.ir>
Hojjat 1 year ago
parent
commit
7780b3ab97
3 changed files with 413 additions and 5 deletions
  1. 12 3
      BUILD
  2. 1 2
      Makefile
  3. 400 0
      configure

+ 12 - 3
BUILD

@@ -23,9 +23,18 @@ suitable build configuration is provided and will be used automatically if no ma
 is supplied - skip directly to running "make" (more details below) if you are on one of these
 systems and are happy to use the default configuration.
 
-For other systems, or to fine tune or correct the configuration, create and edit the
-"mconfig" file (start by copying one for a particular OS from the "configs" directory) to choose
-appropriate values for the configuration variables defined within. In particular:
+For other systems, or to fine tune or correct the configuration, you need to create mconfig
+manally. you can use experimental "configure" script. Also make use this script if suitable config
+is not available by default. This script try to find C++ compiler and
+auto-detects OS and checks some options are supported or not and finally create mconfig.
+Also several options are available to control configuration, for more info use
+
+    ./configure --help
+
+command to see all options.
+otherwise you can create and edit the "mconfig" file (start by copying one for a particular OS
+from the "configs" directory) to choose appropriate values for the configuration variables defined
+within. In particular:
 
   CXX      : should be set to the name of the C++ compiler (and link driver)
   CXXFLAGS : are options passed to the compiler during compilation

+ 1 - 2
Makefile

@@ -36,6 +36,5 @@ mconfig:
 	    echo "*** Found configuration for OS: $$UNAME"; \
 	    ln -sf "configs/mconfig.$$UNAME" mconfig; \
 	else \
-	    echo "*** No config available. Please create suitable mconfig file."; \
-	    exit 1; \
+	    ./configure; \
 	fi

+ 400 - 0
configure

@@ -0,0 +1,400 @@
+#!/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