configure

Sun, 01 Oct 2023 14:41:17 +0200

author
Mike Becker <universe@uap-core.de>
date
Sun, 01 Oct 2023 14:41:17 +0200
changeset 74
831928419249
parent 73
072fa3e165f0
permissions
-rwxr-xr-x

improve Makefiles

     1 #!/bin/sh
     3 # create temporary directory
     4 TEMP_DIR=".tmp-`uname -n`"
     5 rm -Rf "$TEMP_DIR"
     6 if mkdir -p "$TEMP_DIR"; then
     7     :
     8 else
     9     echo "Cannot create tmp dir $TEMP_DIR"
    10     echo "Abort"
    11     exit 1
    12 fi
    13 touch "$TEMP_DIR/options"
    14 touch "$TEMP_DIR/features"
    16 # define standard variables
    17 PREFIX=/usr
    18 EPREFIX=
    19 BINDIR=
    20 SBINDIR=
    21 LIBDIR=
    22 LIBEXECDIR=
    23 DATADIR=
    24 SYSCONFDIR=
    25 SHAREDSTATEDIR=
    26 LOCALSTATEDIR=
    27 INCLUDEDIR=
    28 INFODIR=
    29 MANDIR=
    31 # custom variables
    33 # features
    35 # clean abort
    36 abort_configure()
    37 {
    38     rm -Rf "$TEMP_DIR"
    39     exit 1
    40 }
    42 # help text
    43 printhelp()
    44 {
    45     echo "Usage: $0 [OPTIONS]..."
    46     cat << __EOF__
    47 Installation directories:
    48   --prefix=PREFIX         path prefix for architecture-independent files
    49                           [/usr]
    50   --exec-prefix=EPREFIX   path prefix for architecture-dependent files
    51                           [PREFIX]
    53   --bindir=DIR            user executables [EPREFIX/bin]
    54   --sbindir=DIR           system admin executables [EPREFIX/sbin]
    55   --libexecdir=DIR        program executables [EPREFIX/libexec]
    56   --sysconfdir=DIR        system configuration files [PREFIX/etc]
    57   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
    58   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
    59   --libdir=DIR            object code libraries [EPREFIX/lib]
    60   --includedir=DIR        C header files [PREFIX/include]
    61   --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
    62   --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
    63   --infodir=DIR           info documentation [DATAROOTDIR/info]
    64   --mandir=DIR            man documentation [DATAROOTDIR/man]
    66 __EOF__
    67 }
    69 #
    70 # parse arguments
    71 #
    72 BUILD_TYPE="default"
    73 for ARG in "$@"
    74 do
    75     case "$ARG" in
    76         "--prefix="*)         PREFIX=${ARG#--prefix=} ;;
    77         "--exec-prefix="*)    EPREFIX=${ARG#--exec-prefix=} ;;
    78         "--bindir="*)         BINDIR=${ARG#----bindir=} ;;
    79         "--sbindir="*)        SBINDIR=${ARG#--sbindir=} ;;
    80         "--libdir="*)         LIBDIR=${ARG#--libdir=} ;;
    81         "--libexecdir="*)     LIBEXECDIR=${ARG#--libexecdir=} ;;
    82         "--datadir="*)        DATADIR=${ARG#--datadir=} ;;
    83         "--sysconfdir="*)     SYSCONFDIR=${ARG#--sysconfdir=} ;;
    84         "--sharedstatedir="*) SHAREDSTATEDIR=${ARG#--sharedstatedir=} ;;
    85         "--localstatedir="*)  LOCALSTATEDIR=${ARG#--localstatedir=} ;;
    86         "--includedir="*)     INCLUDEDIR=${ARG#--includedir=} ;;
    87         "--infodir="*)        INFODIR=${ARG#--infodir=} ;;
    88         "--mandir"*)          MANDIR=${ARG#--mandir} ;;
    89         "--help"*) printhelp; abort_configure ;;
    90         "--debug")           BUILD_TYPE="debug" ;;
    91         "--release")         BUILD_TYPE="release" ;;
    92         "-"*) echo "unknown option: $ARG"; abort_configure ;;
    93     esac
    94 done
    97 # set dir variables
    98 : ${EPREFIX:="$PREFIX"}
    99 : ${BINDIR:="$EPREFIX/bin"}
   100 : ${SBINDIR:="$EPREFIX/sbin"}
   101 : ${LIBDIR:="$EPREFIX/lib"}
   102 : ${LIBEXECDIR:="$EPREFIX/libexec"}
   103 : ${DATADIR:="$PREFIX/share"}
   104 : ${SYSCONFDIR:="$PREFIX/etc"}
   105 : ${SHAREDSTATEDIR:="$PREFIX/com"}
   106 : ${LOCALSTATEDIR:="$PREFIX/var"}
   107 : ${INCLUDEDIR:="$PREFIX/include"}
   108 : ${INFODIR:="$PREFIX/info"}
   109 : ${MANDIR:="$PREFIX/man"}
   111 # Test for availability of pkg-config
   112 PKG_CONFIG=`command -v pkg-config`
   113 : ${PKG_CONFIG:="false"}
   115 # Simple uname based platform detection
   116 # $PLATFORM is used for platform dependent dependency selection
   117 OS=`uname -s`
   118 OS_VERSION=`uname -r`
   119 printf "detect platform... "
   120 if [ "$OS" = "SunOS" ]; then
   121     PLATFORM="solaris sunos unix svr4"
   122 fi
   123 if [ "$OS" = "Linux" ]; then
   124     PLATFORM="linux unix"
   125 fi
   126 if [ "$OS" = "FreeBSD" ]; then
   127     PLATFORM="freebsd bsd unix"
   128 fi
   129 if [ "$OS" = "Darwin" ]; then
   130     PLATFORM="macos osx bsd unix"
   131 fi
   132 if echo "$OS" | grep -i "MINGW" > /dev/null; then
   133     PLATFORM="windows mingw"
   134 fi
   135 : ${PLATFORM:="unix"}
   137 PLATFORM_NAME=`echo "$PLATFORM" | cut -f1 -d' ' -`
   138 echo "$PLATFORM_NAME"
   140 isplatform()
   141 {
   142     for p in $PLATFORM
   143     do
   144         if [ "$p" = "$1" ]; then
   145             return 0
   146         fi
   147     done
   148     return 1
   149 }
   150 notisplatform()
   151 {
   152     for p in $PLATFORM
   153     do
   154         if [ "$p" = "$1" ]; then
   155             return 1
   156         fi
   157     done
   158     return 0
   159 }
   162 # generate vars.mk
   163 cat > "$TEMP_DIR/vars.mk" << __EOF__
   164 PREFIX="$PREFIX"
   165 EPREFIX="$EPREFIX"
   166 BINDIR="$BINDIR"
   167 SBINDIR="$SBINDIR"
   168 LIBDIR="$LIBDIR"
   169 LIBEXECDIR="$LIBEXECDIR"
   170 DATADIR="$DATADIR"
   171 SYSCONFDIR="$SYSCONFDIR"
   172 SHAREDSTATEDIR="$SHAREDSTATEDIR"
   173 LOCALSTATEDIR="$LOCALSTATEDIR"
   174 INCLUDEDIR="$INCLUDEDIR"
   175 INFODIR="$INFODIR"
   176 MANDIR="$MANDIR"
   177 __EOF__
   178 sort -u -o "$TEMP_DIR/vars.mk" "$TEMP_DIR/vars.mk"
   181 # toolchain detection utilities
   182 . make/toolchain.sh
   184 #
   185 # DEPENDENCIES
   186 #
   188 # check languages
   189 lang_c=
   190 lang_cpp=
   191 if detect_c_compiler ; then
   192     lang_c=1
   193 fi
   195 # create buffer for make variables required by dependencies
   196 echo > "$TEMP_DIR/make.mk"
   198 test_pkg_config()
   199 {
   200     if "$PKG_CONFIG" --exists "$1" ; then :
   201     else return 1 ; fi
   202     if [ -z "$2" ] || "$PKG_CONFIG" --atleast-version="$2" "$1" ; then :
   203     else return 1 ; fi
   204     if [ -z "$3" ] || "$PKG_CONFIG" --exact-version="$3" "$1" ; then :
   205     else return 1 ; fi
   206     if [ -z "$4" ] || "$PKG_CONFIG" --max-version="$4" "$1" ; then :
   207     else return 1 ; fi
   208     return 0
   209 }
   211 dependency_error_ucx()
   212 {
   213     printf "checking for ucx... "
   214     # dependency ucx
   215     while true
   216     do
   217         if check_lib ucx cx/list.h > /dev/null ; then
   218             :
   219         else
   220             break
   221         fi
   222         TEMP_LDFLAGS="$TEMP_LDFLAGS -lucx"
   223         echo yes
   224         return 1
   225     done
   227     echo no
   228     return 0
   229 }
   230 dependency_error_tools()
   231 {
   232     printf "checking for tools... "
   233     # dependency tools platform="unix"
   234     while true
   235     do
   236         if notisplatform "unix"; then
   237             break
   238         fi
   239         cat >> $TEMP_DIR/make.mk << __EOF__
   240 # Dependency: tools
   241 RMDIR=rm -fR
   242 MKDIR=mkdir -p
   244 __EOF__
   245         echo yes
   246         return 1
   247     done
   249     echo no
   250     return 0
   251 }
   256 # start collecting dependency information
   257 echo > "$TEMP_DIR/flags.mk"
   259 DEPENDENCIES_FAILED=
   260 ERROR=0
   261 # unnamed dependencies
   262 TEMP_CFLAGS=
   263 TEMP_CXXFLAGS=
   264 TEMP_LDFLAGS=
   265 while true
   266 do
   267     while true
   268     do
   269         if [ -z "$lang_c" ] ; then
   270             ERROR=1
   271             break
   272         fi
   274         break
   275     done
   276     break
   277 done
   279 # add general dependency flags to flags.mk
   280 echo "# general flags" >> "$TEMP_DIR/flags.mk"
   281 if [ -n "${TEMP_CFLAGS}" ]; then
   282     echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
   283 fi
   284 if [ -n "${TEMP_CXXFLAGS}" ]; then
   285     echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
   286 fi
   287 if [ -n "${TEMP_LDFLAGS}" ]; then
   288     echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
   289 fi
   291 #
   292 # OPTION VALUES
   293 #
   295 #
   296 # TARGETS
   297 #
   299 echo >> "$TEMP_DIR/flags.mk"
   300 # Target: default
   301 echo "# flags for target default" >> "$TEMP_DIR/flags.mk"
   302 TEMP_CFLAGS=
   303 TEMP_CXXFLAGS=
   304 TEMP_LDFLAGS=
   306 if dependency_error_ucx; then
   307     DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED ucx "
   308     ERROR=1
   309 fi
   310 if dependency_error_tools; then
   311     DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED tools "
   312     ERROR=1
   313 fi
   315 # Features
   318 if [ -n "${TEMP_CFLAGS}" ]; then
   319     echo "CFLAGS  += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk"
   320 fi
   321 if [ -n "${TEMP_CXXFLAGS}" ]; then
   322     echo "CXXFLAGS  += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk"
   323 fi
   324 if [ "$BUILD_TYPE" = "debug" ]; then
   325     echo 'CFLAGS += ${DEBUG_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
   326     echo 'CXXFLAGS += ${DEBUG_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
   327 fi
   328 if [ "$BUILD_TYPE" = "release" ]; then
   329     echo 'CFLAGS += ${RELEASE_CC_FLAGS}' >> "$TEMP_DIR/flags.mk"
   330     echo 'CXXFLAGS += ${RELEASE_CXX_FLAGS}' >> "$TEMP_DIR/flags.mk"
   331 fi
   332 if [ -n "${TEMP_LDFLAGS}" ]; then
   333     echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk"
   334 fi
   337 # final result
   338 if [ $ERROR -ne 0 ]; then
   339     echo
   340     echo "Error: Unresolved dependencies"
   341     echo "$DEPENDENCIES_FAILED"
   342     abort_configure
   343 fi
   345 echo "configure finished"
   346 echo
   347 echo "Build Config:"
   348 echo "  PREFIX:    $PREFIX"
   349 echo "  TOOLCHAIN: $TOOLCHAIN_NAME"
   350 echo
   352 # generate the config.mk file
   353 cat > "$TEMP_DIR/config.mk" << __EOF__
   354 #
   355 # config.mk generated by configure
   356 #
   358 __EOF__
   359 write_toolchain_defaults "$TEMP_DIR/toolchain.mk"
   360 cat "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk
   361 rm -Rf "$TEMP_DIR"

mercurial