configure

Sun, 17 Dec 2023 15:33:50 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 17 Dec 2023 15:33:50 +0100
changeset 800
30d484806c2b
parent 787
bd96cbb0e205
child 802
16e5b9d32754
permissions
-rwxr-xr-x

fix faulty string to int conversion utilities

Probably it was expected that errno is set to EINVAL when illegal characters are encountered. But this is not standard and does not happen on every system, allowing illegal strings to be parsed as valid integers.

#!/bin/sh


PREFIX=/usr
EPREFIX=$PREFIX

BINDIR=
SBINDIR=
LIBDIR=
LIBEXECDIR=
DATADIR=
SYSCONFDIR=
SHAREDSTATEDIR=
LOCALSTATEDIR=
INCLUDEDIR=
INFODIR=
MANDIR=

OS=`uname -s`
OS_VERSION=`uname -r`

TEMP_DIR=".tmp-`uname -n`"
mkdir -p "$TEMP_DIR"
if [ $? -ne 0 ]; then
    echo "Cannot create tmp dir"
    echo "Abort"
fi
touch "$TEMP_DIR/options"
touch "$TEMP_DIR/features"

# features

# help text
printhelp()
{
    echo "Usage: $0 [OPTIONS]..."
    cat << __EOF__
Installation directories:
  --prefix=PREFIX         path prefix for architecture-independent files
                          [/usr]
  --exec-prefix=EPREFIX   path prefix for architecture-dependent files
                          [PREFIX]

  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        system configuration files [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/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]
  --mandir=DIR            man documentation [DATAROOTDIR/man]

__EOF__
}

#
# parse arguments
#
for ARG in "$@"
do
    case "$ARG" in
        "--prefix="*)         PREFIX=${ARG#--prefix=} ;;
        "--exec-prefix="*)    EPREFIX=${ARG#--exec-prefix=} ;;
        "--bindir="*)         BINDIR=${ARG#----bindir=} ;;
        "--sbindir="*)        SBINDIR=${ARG#--sbindir=} ;;
        "--libdir="*)         LIBDIR=${ARG#--libdir=} ;;
        "--libexecdir="*)     LIBEXECDIR=${ARG#--libexecdir=} ;;
        "--datadir="*)        DATADIR=${ARG#--datadir=} ;;
        "--sysconfdir="*)     SYSCONFDIR=${ARG#--sysconfdir=} ;;
        "--sharedstatedir="*) SHAREDSTATEDIR=${ARG#--sharedstatedir=} ;;
        "--localstatedir="*)  LOCALSTATEDIR=${ARG#--localstatedir=} ;;
        "--includedir="*)     INCLUDEDIR=${ARG#--includedir=} ;;
        "--infodir="*)        INFODIR=${ARG#--infodir=} ;;
        "--mandir"*)          MANDIR=${ARG#--mandir} ;;
        "--help"*) printhelp; rm -Rf "$TEMP_DIR"; exit 1 ;;
        "-"*) echo "unknown option: $ARG"; rm -Rf "$TEMP_DIR"; exit 1 ;;
    esac
done

# set dir variables
if [ -z "$BINDIR" ]; then
    BINDIR=$EPREFIX/bin
fi
if [ -z "$SBINDIR" ]; then
    SBINDIR=$EPREFIX/sbin
fi
if [ -z "$LIBDIR" ]; then
    LIBDIR=$EPREFIX/lib
fi
if [ -z "$LIBEXEC" ]; then
    LIBEXECDIR=$EPREFIX/libexec
fi
if [ -z "$DATADIR" ]; then
    DATADIR=$PREFIX/share
fi
if [ -z "$SYSCONFDIR" ]; then
    SYSCONFDIR=$PREFIX/etc
fi
if [ -z "$SHAREDSTATEDIR" ]; then
    SHAREDSTATEDIR=$PREFIX/com
fi
if [ -z "$LOCALSTATEDIR" ]; then
    LOCALSTATEDIR=$PREFIX/var
fi
if [ -z "$INCLUDEDIR" ]; then
    INCLUDEDIR=$PREFIX/include
fi
if [ -z "$INFODIR" ]; then
    INFODIR=$PREFIX/info
fi
if [ -z "$MANDIR" ]; then
    MANDIR=$PREFIX/man
fi

which pkg-config > /dev/null
if [ $? -eq 0 ]; then
    PKG_CONFIG=pkg-config
else
    PKG_CONFIG=false
fi

# Simple uname based platform detection
# $PLATFORM is used for platform dependent dependency selection
printf "detect platform... "
if [ "$OS" = "SunOS" ]; then
    PLATFORM="solaris sunos unix svr4"
fi
if [ "$OS" = "Linux" ]; then
    PLATFORM="linux unix"
fi
if [ "$OS" = "FreeBSD" ]; then
    PLATFORM="freebsd bsd unix"
fi
if [ "$OS" = "Darwin" ]; then
    PLATFORM="macos osx bsd unix"
fi
echo "$OS" | grep -i "MINGW" > /dev/null
if [ $? -eq 0 ]; then
    PLATFORM="windows mingw"
fi

if [ -z "$PLATFORM" ]; then
    PLATFORM="unix"
fi

for p in $PLATFORM
do
    PLATFORM_NAME=$p
    break
done
echo $PLATFORM_NAME

isplatform()
{
    for p in $PLATFORM
    do
        if [ "$p" = "$1" ]; then
            return 0
        fi
    done
    return 1
}
isnotplatform()
{
    for p in $PLATFORM
    do
        if [ "$p" = "$1" ]; then
            return 1
        fi
    done
    return 0
}

# generate config.mk and config.h
cat > "$TEMP_DIR/config.mk" << __EOF__
#
# config.mk generated by configure
#

# general vars

PREFIX=$PREFIX
EPREFIX=$EPREFIX

BINDIR=$BINDIR
SBINDIR=$SBINDIR
LIBDIR=$LIBDIR
LIBEXECDIR=$LIBEXECDIR
DATADIR=$DATADIR
SYSCONFDIR=$SYSCONFDIR
SHAREDSTATEDIR=$SHAREDSTATEDIR
LOCALSTATEDIR=$LOCALSTATEDIR
INCLUDEDIR=$INCLUDEDIR
INFODIR=$INFODIR
MANDIR=$MANDIR

__EOF__

echo > "$TEMP_DIR/make.mk"

ENV_CFLAGS=$CFLAGS
ENV_LDFLAGS=$LDFLAGS
ENV_CXXFLAGS=$CXXFLAGS

# Toolchain detection
# this will insert make vars to config.mk
. make/toolchain.sh

# add user specified flags to config.mk
echo "# project specific flags" >> "$TEMP_DIR/config.mk"
if [ -n "${ENV_CFLAGS}" ]; then
    echo "CFLAGS += $ENV_CFLAGS" >> "$TEMP_DIR/config.mk"
fi
if [ -n "${ENV_CXXFLAGS}" ]; then
    echo "CXXFLAGS += $ENV_CXXFLAGS" >> "$TEMP_DIR/config.mk"
fi
if [ -n "${ENV_LDFLAGS}" ]; then
    echo "LDFLAGS += $ENV_LDFLAGS" >> "$TEMP_DIR/config.mk"
fi

#
# DEPENDENCIES
#

dependency_curl()
{
    printf "checking for curl... "
    # dependency curl platform="windows"
    while true
    do
        if isnotplatform "windows"; then
            break
        fi
        TEMP_CFLAGS="$TEMP_CFLAGS -I/mingw/include"
        TEMP_LDFLAGS="$TEMP_LDFLAGS -lcurl"
        echo yes
        return 0
    done

    # dependency curl platform="macos"
    while true
    do
        if isnotplatform "macos"; then
            break
        fi
        curl-config --cflags > /dev/null
        if [ $? -eq 0 ]; then
            TEMP_CFLAGS="$TEMP_CFLAGS `curl-config --cflags`"
        else
            break
        fi
        curl-config --ldflags > /dev/null
        if [ $? -eq 0 ]; then
            TEMP_LDFLAGS="$TEMP_LDFLAGS `curl-config --ldflags`"
        else
            break
        fi
        echo yes
        return 0
    done

    # dependency curl
    while true
    do
        if [ -z "$PKG_CONFIG" ]; then
            break
        fi
        $PKG_CONFIG libcurl
        if [ $? -ne 0 ] ; then
            break
        fi
        TEMP_CFLAGS="$TEMP_CFLAGS `$PKG_CONFIG --cflags libcurl`"
        TEMP_LDFLAGS="$TEMP_LDFLAGS `$PKG_CONFIG --libs libcurl`"
        echo yes
        return 0
    done

    # dependency curl
    while true
    do
        curl-config --cflags > /dev/null
        if [ $? -eq 0 ]; then
            TEMP_CFLAGS="$TEMP_CFLAGS `curl-config --cflags`"
        else
            break
        fi
        curl-config --libs > /dev/null
        if [ $? -eq 0 ]; then
            TEMP_LDFLAGS="$TEMP_LDFLAGS `curl-config --libs`"
        else
            break
        fi
        echo yes
        return 0
    done

    echo no
    return 1
}
dependency_openssl()
{
    printf "checking for openssl... "
    # dependency openssl platform="windows"
    while true
    do
        if isnotplatform "windows"; then
            break
        fi
        TEMP_LDFLAGS="$TEMP_LDFLAGS -lssl -lcrypto"
        echo yes
        return 0
    done

    # dependency openssl platform="macos"
    while true
    do
        if isnotplatform "macos"; then
            break
        fi
        TEMP_LDFLAGS="$TEMP_LDFLAGS -framework CoreFoundation"
        echo yes
        return 0
    done

    # dependency openssl platform="bsd"
    while true
    do
        if isnotplatform "bsd"; then
            break
        fi
        if isplatform "macos"; then
            break
        fi
        TEMP_LDFLAGS="$TEMP_LDFLAGS -lssl -lcrypto"
        echo yes
        return 0
    done

    # dependency openssl
    while true
    do
        if [ -z "$PKG_CONFIG" ]; then
            break
        fi
        $PKG_CONFIG openssl
        if [ $? -ne 0 ] ; then
            break
        fi
        TEMP_CFLAGS="$TEMP_CFLAGS `$PKG_CONFIG --cflags openssl`"
        TEMP_LDFLAGS="$TEMP_LDFLAGS `$PKG_CONFIG --libs openssl`"
        echo yes
        return 0
    done

    echo no
    return 1
}
dependency_libxml2()
{
    printf "checking for libxml2... "
    # dependency libxml2 platform="windows"
    while true
    do
        if isnotplatform "windows"; then
            break
        fi
        xml2-config --cflags > /dev/null
        if [ $? -eq 0 ]; then
            TEMP_CFLAGS="$TEMP_CFLAGS `xml2-config --cflags`"
        else
            break
        fi
        xml2-config --libs > /dev/null
        if [ $? -eq 0 ]; then
            TEMP_LDFLAGS="$TEMP_LDFLAGS `xml2-config --libs`"
        else
            break
        fi
        echo yes
        return 0
    done

    # dependency libxml2 platform="macos"
    while true
    do
        if isnotplatform "macos"; then
            break
        fi
        xml2-config --cflags > /dev/null
        if [ $? -eq 0 ]; then
            TEMP_CFLAGS="$TEMP_CFLAGS `xml2-config --cflags`"
        else
            break
        fi
        xml2-config --libs > /dev/null
        if [ $? -eq 0 ]; then
            TEMP_LDFLAGS="$TEMP_LDFLAGS `xml2-config --libs`"
        else
            break
        fi
        echo yes
        return 0
    done

    # dependency libxml2
    while true
    do
        if [ -z "$PKG_CONFIG" ]; then
            break
        fi
        $PKG_CONFIG libxml-2.0
        if [ $? -ne 0 ] ; then
            break
        fi
        TEMP_CFLAGS="$TEMP_CFLAGS `$PKG_CONFIG --cflags libxml-2.0`"
        TEMP_LDFLAGS="$TEMP_LDFLAGS `$PKG_CONFIG --libs libxml-2.0`"
        echo yes
        return 0
    done

    # dependency libxml2
    while true
    do
        xml2-config --cflags > /dev/null
        if [ $? -eq 0 ]; then
            TEMP_CFLAGS="$TEMP_CFLAGS `xml2-config --cflags`"
        else
            break
        fi
        xml2-config --libs > /dev/null
        if [ $? -eq 0 ]; then
            TEMP_LDFLAGS="$TEMP_LDFLAGS `xml2-config --libs`"
        else
            break
        fi
        echo yes
        return 0
    done

    echo no
    return 1
}

DEPENDENCIES_FAILED=
ERROR=0
# general dependencies
TEMP_CFLAGS=
TEMP_LDFLAGS=
while true
do
    while true
    do

        TEMP_LDFLAGS="$TEMP_LDFLAGS -lm -lpthread"

        break
    done

    break
done
while true
do
    if isnotplatform "bsd"; then
        break
    fi
    if isplatform "macos"; then
        break
    fi
    while true
    do

        TEMP_CFLAGS="$TEMP_CFLAGS -I/usr/local/include"
        TEMP_LDFLAGS="$TEMP_LDFLAGS -L/usr/local/lib"

        break
    done

    break
done
while true
do
    if isnotplatform "macos"; then
        break
    fi
    while true
    do

        cat >> "$TEMP_DIR/make.mk" << __EOF__
OBJ_EXT = .o
LIB_EXT = .a

__EOF__

        break
    done

    break
done
while true
do
    if isnotplatform "unix"; then
        break
    fi
    if isplatform "macos"; then
        break
    fi
    while true
    do

        cat >> "$TEMP_DIR/make.mk" << __EOF__
OBJ_EXT = .o
LIB_EXT = .a

__EOF__

        break
    done

    break
done

# add general dependency flags to config.mk
echo >> "$TEMP_DIR/config.mk"
if [ -n "${TEMP_CFLAGS}" ]; then
    echo "CFLAGS += $TEMP_CFLAGS" >> $TEMP_DIR/config.mk
fi
if [ -n "${TEMP_CXXFLAGS}" ]; then
    echo "CXXFLAGS += $TEMP_CXXFLAGS" >> $TEMP_DIR/config.mk
fi
if [ -n "${TEMP_LDFLAGS}" ]; then
    echo "LDFLAGS += $TEMP_LDFLAGS" >> $TEMP_DIR/config.mk
fi

#
# OPTION VALUES
#

#
# TARGETS
#
TEMP_CFLAGS=
TEMP_CXXFLAGS=
TEMP_LDFLAGS=

# Target: dav
TEMP_CFLAGS=
TEMP_LDFLAGS=
TEMP_CXXFLAGS=

dependency_curl
if [ $? -ne 0 ]; then
    DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED curl "
    ERROR=1
fi
dependency_libxml2
if [ $? -ne 0 ]; then
    DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED libxml2 "
    ERROR=1
fi
dependency_openssl
if [ $? -ne 0 ]; then
    DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED openssl "
    ERROR=1
fi

# Features


echo >> "$TEMP_DIR/config.mk"
if [ -n "${TEMP_CFLAGS}" ]; then
    echo "DAV_CFLAGS  += $TEMP_CFLAGS" >> "$TEMP_DIR/config.mk"
fi
if [ -n "${TEMP_CXXFLAGS}" ]; then
    echo "DAV_CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/config.mk"
fi
if [ -n "${TEMP_LDFLAGS}" ]; then
    echo "DAV_LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/config.mk"
fi

if [ $ERROR -ne 0 ]; then
    echo
    echo "Error: Unresolved dependencies"
    echo "$DEPENDENCIES_FAILED"
    rm -Rf "$TEMP_DIR"
    exit 1
fi

echo "configure finished"
echo
echo "Build Config:"
echo "  PREFIX:    $PREFIX"
echo "  TOOLCHAIN: $TOOLCHAIN_NAME"
echo
cat "$TEMP_DIR/config.mk" "$TEMP_DIR/make.mk" > config.mk
rm -Rf "$TEMP_DIR"

mercurial