diff options
Diffstat (limited to 'configure')
| -rwxr-xr-x | configure | 1814 |
1 files changed, 1814 insertions, 0 deletions
diff --git a/configure b/configure new file mode 100755 index 000000000000..19eb431816e7 --- /dev/null +++ b/configure @@ -0,0 +1,1814 @@ +#!/bin/sh +# Try and be like autotools configure, but without autotools + +echo "configure args: $*" +exec 3>config.log + +# Ensure that we do not inherit these from env +HOOKSET=false +INET= +ARP= +ARPING= +IPV4LL= +INET6= +PRIVSEP= +PRIVSEP_USER= +ARC4RANDOM= +CLOSEFROM= +RBTREE= +CONSTTIME_MEMEQUAL= +OPEN_MEMSTREAM= +STRLCPY= +UDEV= +OS= +BUILD= +HOST= +HOSTCC= +TARGET= +INCLUDEDIR= +DEBUG= +FORK= +STATIC= +DEVS= +EMBEDDED= +AUTH= +POLL= +SMALL= +SANITIZE=no +STATUSARG= + +DHCPCD_DEFS=dhcpcd-definitions.conf + +for x do + opt=${x%%=*} + var=${x#*=} + case "$opt" in + --os|OS) OS=$var;; + --debug) DEBUG=$var;; + --disable-debug) DEBUG=no;; + --enable-debug) DEBUG=yes;; + --fork) FORK=$var;; + --disable-fork) FORK=no;; + --enable-fork) FORK=yes;; + --disable-static) STATIC=no;; + --enable-static) STATIC=yes;; + --disable-ipv4|--disable-inet) INET=no; ARP=no; ARPING=no; IPV4LL=no;; + --enable-ipv4|--enable-inet) INET=yes;; + --disable-arp) ARP=no; ARPING=no; IPV4LL=no;; + --enable-arp) ARP=yes; INET=yes;; + --disable-arping) ARPING=no;; + --enable-arping) ARPING=yes; ARP=yes; INET=yes;; + --disable-ipv4ll) IPV4LL=no;; + --enable-ipv4ll) IPV4LL=yes; ARP=yes; INET=yes;; + --disable-ipv6|--disable-inet6) INET6=no; DHCP6=no;; + --enable-ipv6|--enable-inet6) INET6=yes;; + --disable-dhcp6) DHCP6=no;; + --enable-dhcp6) DHCP6=yes;; + --disable-embedded) EMBEDDED=no;; + --enable-embedded) EMBEDDED=yes;; + --disable-auth) AUTH=no;; + --enable-auth) AUTH=yes;; + --disable-privsep) PRIVSEP=no;; + --enable-privsep) PRIVSEP=yes;; + --privsepuser) PRIVSEP_USER=$var;; + --prefix) PREFIX=$var;; + --sysconfdir) SYSCONFDIR=$var;; + --bindir|--sbindir) SBINDIR=$var;; + --libexecdir) LIBEXECDIR=$var;; + --statedir|--localstatedir) STATEDIR=$var;; + --dbdir) DBDIR=$var;; + --rundir) RUNDIR=$var;; + --runstatedir) RUNSTATEDIR=$var;; + --mandir) MANDIR=$var;; + --datadir) DATADIR=$var;; + --with-ccopts|CFLAGS) CFLAGS=$var;; + -I|--includedir) INCLUDEDIR="$INCLUDEDIR${INCLUDEDIR:+ }-I$var";; + CC) CC=$var;; + CPPFLAGS) CPPFLAGS=$var;; + PKG_CONFIG) PKG_CONFIG=$var;; + --with-hook) HOOKSCRIPTS="$HOOKSCRIPTS${HOOKSCRIPTS:+ }$var";; + --with-hooks|HOOKSCRIPTS) HOOKSCRIPTS=$var; HOOKSET=true;; + --with-eghook) EGHOOKSCRIPTS="$EGHOOKSCRIPTS${EGHOOKSCRIPTS+ }$var";; + --with-eghooks|EGHOOKSCRIPTS) EGHOOKSCRIPTS=$var; EGHOOKSET=true;; + --with-default-hostname) _DEFAULT_HOSTNAME=$var;; + --build) BUILD=$var;; + --host) HOST=$var; HOSTCC=$var-;; + --target) TARGET=$var;; + --libdir) LIBDIR=$var;; + --without-arc4random) ARC4RANDOM=no;; + --without-strlcpy) STRLCPY=no;; + --without-pidfile_lock) PIDFILE_LOCK=no;; + --without-reallocarrray) REALLOCARRAY=no;; + --without-md5) MD5=no;; + --without-sha2) SHA2=no;; + --without-sha256) SHA2=no;; + --without-hmac) HMAC=no;; + --without-dev) DEV=no;; + --with-udev) DEV=yes; UDEV=yes;; + --without-udev) UDEV=no;; + --with-poll) POLL="$var";; + --sanitise|--sanitize) SANITIZEADDRESS="yes";; + --serviceexists) SERVICEEXISTS=$var;; + --servicecmd) SERVICECMD=$var;; + --servicestatus) SERVICESTATUS=$var;; + --small) SMALL=yes;; + --statusarg) STATUSARG=$var;; + --infodir) ;; # ignore autotools + --disable-maintainer-mode|--disable-dependency-tracking) ;; + --disable-silent-rules) ;; + -V|--version) + v=$(sed -ne 's/.*VERSION[[:space:]]*"\([^"]*\).*/\1/p' defs.h); + c=$(sed -ne 's/^.*copyright\[\] = "\([^"]*\).*/\1/p' dhcpcd.c); + echo "dhcpcd-$v $c"; + exit 0;; + -h|--help) cat <<EOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: configure [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + -V, --version display version information and exit + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX [/] + +By default, \`make install' will install all the files in \'/sbin', +\`/libexec', etc. You can specify +an installation prefix other than \`/' using \`--prefix', +for instance \`--prefix=$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [PREFIX/bin] + --sbindir=DIR system admin executables [PREFIX/sbin] + --libexecdir=DIR program executables [PREFIX/libexec] + --dbdir=DIR database [STATEDIR/db/dhcpcd] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --localstatedir=DIR modifiable single-machine data [/var] + --libdir=DIR object code libraries [PREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --mandir=DIR man documentation [PREFIX/man] + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a + nonstandard directory <lib dir> + CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have + headers in a nonstandard directory <include dir> + CPP C preprocessor + PKG_CONFIG pkg-config executable + +Use these variables to override the choices made by \`configure' or to help +it to find libraries and programs with nonstandard names/locations. +EOF +exit 0 +;; + *) echo "$0: WARNING: unknown option $opt" >&2;; + esac +done + +: ${SED:=sed} +: ${GREP:=grep} +: ${PKG_CONFIG:=pkg-config} +: ${WC:=wc} + +: ${FORK:=yes} +_which() +{ + x="$(which "$1" 2>/dev/null)" + if [ $? = 0 ] && [ -n "$x" ]; then + echo "$x" + return 0 + fi + for x in /sbin/"$1" /usr/sbin/"$1" \ + /usr/pkg/sbin/"$1" /usr/local/sbin/"$1" + do + if [ -e "$x" ]; then + echo "$x" + return 0 + fi + done + return 1 +} + +CONFIG_H=config.h +CONFIG_MK=config.mk + +if [ -z "$BUILD" ]; then + # autoconf target triplet: cpu-vendor-os + BUILD=$(uname -m)-unknown-$(uname -s | tr '[:upper:]' '[:lower:]') +fi +: ${HOST:=$BUILD} + +if [ -z "$OS" ]; then + echo "Deriving operating system from ... $HOST" + # Derive OS from cpu-vendor-[kernel-]os + CPU=${HOST%%-*} + REST=${HOST#*-} + if [ "$CPU" != "$REST" ]; then + VENDOR=${REST%%-*} + REST=${REST#*-} + if [ "$VENDOR" != "$REST" ]; then + # Use kernel if given, otherwise os + OS=${REST%%-*} + else + # 2 tupple + OS=$VENDOR + VENDOR= + fi + fi + + # Work with cpu-kernel-os, ie Debian + case "$VENDOR" in + linux*|kfreebsd*) OS=$VENDOR; VENDOR= ;; + esac + case "$REST" in + gnu/kfreebsd*) OS="kfreebsd"; VENDOR= ;; + esac + # Special case + case "$OS" in + dragonfly*) + # This means /usr HAS to be mounted not via dhcpcd + : ${LIBEXECDIR:=${PREFIX:-/usr}/libexec} + ;; + gnu*) OS=hurd;; # No HURD support as yet + esac +fi + +echo "Configuring dhcpcd for ... $OS" +rm -f $CONFIG_H $CONFIG_MK +echo "# $OS" >$CONFIG_MK +echo "/* $OS */" >$CONFIG_H + +: ${SYSCONFDIR:=$PREFIX/etc} +: ${SBINDIR:=$PREFIX/sbin} +: ${LIBDIR:=$PREFIX/lib} +: ${LIBEXECDIR:=$PREFIX/libexec} +: ${STATEDIR:=/var} +: ${DBDIR:=$STATEDIR/db/dhcpcd} +: ${RUNSTATEDIR:=$STATEDIR/run} +: ${RUNDIR:=$RUNSTATEDIR/dhcpcd} +: ${MANDIR:=${PREFIX:-/usr}/share/man} +: ${DATADIR:=${PREFIX:-/usr}/share} + +eval SYSCONFDIR="$SYSCONFDIR" +eval LIBDIR="$LIBDIR" +eval LIBEXECDIR="$LIBEXECDIR" +eval STATEDIR="$STATEDIR" +eval DBDIR="$DBDIR" +eval RUNDIR="$RUNDIR" +eval MANDIR="$MANDIR" +eval DATADIR="$DATADIR" + +echo "#ifndef SYSCONFDIR" >>$CONFIG_H +for x in SYSCONFDIR SBINDIR LIBDIR LIBEXECDIR DBDIR RUNDIR; do + eval v=\$$x + # Make files look nice for import + l=$((10 - ${#x})) + unset t + [ $l -gt 3 ] && t=" " + echo "$x=$t $v" >>$CONFIG_MK + unset t + [ $l -gt 2 ] && t=" " + echo "#define $x$t \"$v\"" >>$CONFIG_H +done +echo "#endif" >>$CONFIG_H + +echo "LIBDIR= $LIBDIR" >>$CONFIG_MK +echo "MANDIR= $MANDIR" >>$CONFIG_MK +echo "DATADIR= $DATADIR" >>$CONFIG_MK + +# Always obey CC. +if [ -n "$CC" ]; then + HOSTCC= +else + CC=cc + _COMPILERS="cc clang gcc pcc icc" +fi +# Only look for a cross compiler if --host and --build are not the same +if [ -n "$HOSTCC" ] && [ "$BUILD" != "$HOST" ]; then + for _CC in $_COMPILERS; do + _CC=$(_which "$HOSTCC$_CC") + if [ -x "$_CC" ]; then + CC=$_CC + break + fi + done +fi +if ! type "$CC" >/dev/null 2>&1; then + for _CC in $_COMPILERS; do + _CC=$(_which "$_CC") + if [ -x "$_CC" ]; then + CC=$_CC + break + fi + done +fi + +# Set to blank, then append user config +# We do this so our SED call to append to XCC remains portable +if [ -n "$CFLAGS" ]; then + echo "CFLAGS=" >>$CONFIG_MK + echo "CFLAGS+= $CFLAGS" >>$CONFIG_MK +fi +if [ -n "$CPPFLAGS" ]; then + echo "CPPFLAGS=" >>$CONFIG_MK + echo "CPPFLAGS+= $CPPFLAGS" >>$CONFIG_MK +fi +if [ -n "$INCLUDEDIR" ]; then + echo "CPPFLAGS+= $INCLUDEDIR" >>$CONFIG_MK +fi +if [ -n "$LDFLAGS" ]; then + echo "LDFLAGS=" >>$CONFIG_MK + echo "LDFLAGS+= $LDFLAGS" >>$CONFIG_MK +fi + +echo "CPPFLAGS+= -DHAVE_CONFIG_H" >>$CONFIG_MK + +# NetBSD: Even if we build for $PREFIX, the clueless user might move us to / +LDELF=/libexec/ld.elf_so +if [ -e "$LDELF" ]; then + echo "Linking against $LDELF" + echo "LDFLAGS+= -Wl,-dynamic-linker=$LDELF" >>$CONFIG_MK + echo "LDFLAGS+= -Wl,-rpath=${LIBDIR}" >>$CONFIG_MK +fi + +if [ -z "$PREFIX" ] || [ "$PREFIX" = / ]; then + ALLOW_USR_LIBS=false +else + ALLOW_USR_LIBS=true +fi +case "$OS" in +linux*|solaris*|sunos*|kfreebsd*) ;; +*) + # There might be more than one ... + for LDELFN in /libexec/ld-elf.so.[0-9]*; do + [ -x "$LDELFN" ] && break + done + if ! [ -x "$LDELF" ] || [ -x "$LDELFN" ]; then + if [ -z "$PREFIX" ] || [ "$PREFIX" = "/" ]; then + echo "Forcing a static build for $OS and \$PREFIX of /" + STATIC=yes + ALLOW_USR_LIBS=true + fi + fi + ;; +esac +if [ "$STATIC" = yes ]; then + echo "LDFLAGS+= -static" >>$CONFIG_MK +fi + +if [ -z "$DEBUG" ] && [ -d .git ]; then + printf "Found git checkout ... " + DEBUG=yes +fi +if [ -n "$DEBUG" ] && [ "$DEBUG" != no ] && [ "$DEBUG" != false ]; then + echo "Adding debugging CFLAGS" + + cat <<EOF >>$CONFIG_MK +CFLAGS+= -g -Wall -Wextra -Wundef +CFLAGS+= -Wmissing-prototypes -Wmissing-declarations +CFLAGS+= -Wmissing-format-attribute -Wnested-externs +CFLAGS+= -Winline -Wcast-align -Wcast-qual -Wpointer-arith +CFLAGS+= -Wreturn-type -Wswitch -Wshadow +CFLAGS+= -Wcast-qual -Wwrite-strings +CFLAGS+= -Wformat=2 +CFLAGS+= -Wpointer-sign -Wmissing-noreturn +EOF + + case "$OS" in + mirbsd*|openbsd*);; # OpenBSD has many redundant decs in system headers + bitrig*|solaris*|sunos*) + echo "CFLAGS+= -Wredundant-decls" >>$CONFIG_MK + ;; # Bitrig spouts many conversion errors with htons + # sunos has many as well + *) echo "CFLAGS+= -Wredundant-decls" >>$CONFIG_MK + echo "CFLAGS+= -Wconversion" >>$CONFIG_MK + ;; + esac + + case "$OS" in + solaris*|sunos*);; + *) echo "CFLAGS+= -Wstrict-overflow" >>$CONFIG_MK;; + esac + + # Turn on extra per compiler debugging + case "$CC" in + *gcc*) echo "CFLAGS+= -Wlogical-op" >>$CONFIG_MK;; + esac + + if [ "$SANITIZEADDRESS" = yes ]; then + printf "Testing compiler supports address sanitisation ..." + cat <<EOF >_test.c +int main(void) { + return 0; +} +EOF + if $CC -fsanitize=address _test.c -o _test 2>&3; then + echo "yes" + echo "CFLAGS+= -fsanitize=address" >>$CONFIG_MK + echo "CFLAGS+= -fno-omit-frame-pointer" >>$CONFIG_MK + echo "LDFLAGS+= -fsanitize=address" >>$CONFIG_MK + else + echo "no" + fi + rm -rf _test.c _test + fi +else + echo "CPPFLAGS+= -DNDEBUG" >>$CONFIG_MK +fi + +if [ -n "$FORK" ] && [ "$FORK" != yes ] && [ "$FORK" != true ]; then + echo "There is no fork" + echo "CPPFLAGS+= -DTHERE_IS_NO_FORK" >>$CONFIG_MK +fi + +if [ "$SMALL" = yes ]; then + echo "Building with -DSMALL" + echo "CPPFLAGS+= -DSMALL" >>$CONFIG_MK + DHCPCD_DEFS=dhcpcd-definitions-small.conf + echo "DHCPCD_DEFS= $DHCPCD_DEFS" >>$CONFIG_MK +fi + +case "$OS" in +freebsd*|kfreebsd*) + # FreeBSD hide some newer POSIX APIs behind _GNU_SOURCE ... + echo "CPPFLAGS+= -D_GNU_SOURCE" >>$CONFIG_MK + case "$OS" in + kfreebsd*) echo "CPPFLAGS+= -DBSD" >>$CONFIG_MK;; + esac + echo "DHCPCD_SRCS+= if-bsd.c" >>$CONFIG_MK + # Whacky includes needed to buck the trend + case "$OS" in + kfreebsd*) echo "#include <inttypes.h>" >>$CONFIG_H; + esac + echo "#include <net/if.h>" >>$CONFIG_H + echo "#include <net/if_var.h>" >>$CONFIG_H + ;; +netbsd*) + # reallocarray(3) is guarded by _OPENBSD_SOURCE + echo "CPPFLAGS+= -D_OPENBSD_SOURCE" >>$CONFIG_MK + echo "DHCPCD_SRCS+= if-bsd.c" >>$CONFIG_MK + ;; +linux*) + echo "CPPFLAGS+= -D_GNU_SOURCE" >>$CONFIG_MK + # Large File Support, should be fine for 32-bit systems. + # But if this is the case, why is it not set by default? + echo "CPPFLAGS+= -D_FILE_OFFSET_BITS=64" >>$CONFIG_MK + echo "CPPFLAGS+= -D_LARGEFILE_SOURCE" >>$CONFIG_MK + echo "CPPFLAGS+= -D_LARGEFILE64_SOURCE" >>$CONFIG_MK + echo "DHCPCD_SRCS+= if-linux.c" >>$CONFIG_MK + # for RTM_NEWADDR and friends + echo "#include <asm/types.h> /* fix broken headers */" >>$CONFIG_H + echo "#include <sys/socket.h> /* fix broken headers */" >>$CONFIG_H + echo "#include <linux/rtnetlink.h>" >>$CONFIG_H + # cksum does't support -a and netpgp is rare + echo "CKSUM= sha256sum --tag" >>$CONFIG_MK + echo "PGP= gpg2" >>$CONFIG_MK + ;; +qnx*) + echo "CPPFLAGS+= -D__EXT" >>$CONFIG_MK + echo "DHCPCD_SRCS+= if-bsd.c" >>$CONFIG_MK + ;; +solaris*|sunos*) + echo "CPPFLAGS+= -D_XPG4_2 -D__EXTENSIONS__ -DBSD_COMP" \ + >>$CONFIG_MK + echo "DHCPCD_SRCS+= if-sun.c" >>$CONFIG_MK + echo "LDADD+= -ldlpi -lkstat" >>$CONFIG_MK + ;; +*) + echo "DHCPCD_SRCS+= if-bsd.c" >>$CONFIG_MK + ;; +esac + +if [ -n "${_DEFAULT_HOSTNAME+x}" ]; then + DEFAULT_HOSTNAME="${_DEFAULT_HOSTNAME}" +else + case "$OS" in + linux*) DEFAULT_HOSTNAME="(none)";; + *) DEFAULT_HOSTNAME="";; + esac +fi +echo "DEFAULT_HOSTNAME= $DEFAULT_HOSTNAME" >>$CONFIG_MK + +if [ -z "$INET" ] || [ "$INET" = yes ]; then + echo "Enabling INET support" + echo "CPPFLAGS+= -DINET" >>$CONFIG_MK + echo "DHCPCD_SRCS+= dhcp.c ipv4.c bpf.c" >>$CONFIG_MK + if [ -z "$ARP" ] || [ "$ARP" = yes ]; then + echo "Enabling ARP support" + echo "CPPFLAGS+= -DARP" >>$CONFIG_MK + echo "DHCPCD_SRCS+= arp.c" >>$CONFIG_MK + fi + if [ -z "$ARPING" ] || [ "$ARPING" = yes ]; then + echo "Enabling ARPing support" + echo "CPPFLAGS+= -DARPING" >>$CONFIG_MK + fi + if [ -z "$IPV4LL" ] || [ "$IPV4LL" = yes ]; then + echo "Enabling IPv4LL support" + echo "CPPFLAGS+= -DIPV4LL" >>$CONFIG_MK + echo "DHCPCD_SRCS+= ipv4ll.c" >>$CONFIG_MK + fi +fi +if [ -z "$INET6" ] || [ "$INET6" = yes ]; then + echo "Enabling INET6 support" + echo "CPPFLAGS+= -DINET6" >>$CONFIG_MK + echo "DHCPCD_SRCS+= ipv6.c ipv6nd.c" >>$CONFIG_MK + if [ -z "$DHCP6" ] || [ "$DHCP6" = yes ]; then + echo "Enabling DHCPv6 support" + echo "CPPFLAGS+= -DDHCP6" >>$CONFIG_MK + echo "DHCPCD_SRCS+= dhcp6.c" >>$CONFIG_MK + fi +fi +if [ -z "$AUTH" ] || [ "$AUTH" = yes ]; then + echo "Enabling Authentication" + echo "CPPFLAGS+= -DAUTH" >>$CONFIG_MK + echo "SRCS+= auth.c" >>$CONFIG_MK +fi + +if [ -z "$PRIVSEP" ]; then + # privilege separation works fine .... except on Solaris + case "$OS" in + solaris*|sunos*) PRIVSEP=no;; + *) PRIVSEP=yes;; + esac +fi + +if [ "$PRIVSEP" = yes ]; then + echo "Enabling Privilege Separation" + + # Try and work out system user + if [ -z "$PRIVSEP_USER" ]; then + printf "Detecting a suitable user for dhcpcd ... " + for x in _dhcpcd _dhcp dhcpcd; do + home=$(getent passwd $x 2>/dev/null | cut -d: -f6) + if [ -d "$home" ]; then + PRIVSEP_USER="$x" + break + fi + done + fi + if [ -n "$PRIVSEP_USER" ]; then + echo "$PRIVSEP_USER" + else + PRIVSEP_USER=dhcpcd + echo + echo "No suitable user found for Priviledge Separation!" + fi + + echo "CPPFLAGS+= -DPRIVSEP" >>$CONFIG_MK + echo "PRIVSEP_USER?= $PRIVSEP_USER" >>$CONFIG_MK + echo "#ifndef PRIVSEP_USER" >>$CONFIG_H + echo "#define PRIVSEP_USER \"$PRIVSEP_USER\"" >>$CONFIG_H + echo "#endif" >>$CONFIG_H + echo "PRIVSEP_SRCS= privsep.c privsep-root.c" >>$CONFIG_MK + echo "PRIVSEP_SRCS+= privsep-control.c privsep-inet.c" >>$CONFIG_MK + if [ -z "$INET" ] || [ "$INET" = yes ]; then + echo "PRIVSEP_SRCS+= privsep-bpf.c" >>$CONFIG_MK + fi + case "$OS" in + linux*) echo "PRIVSEP_SRCS+= privsep-linux.c" >>$CONFIG_MK;; + solaris*|sunos*) echo "PRIVSEP_SRCS+= privsep-sun.c" >>$CONFIG_MK;; + *) echo "PRIVSEP_SRCS+= privsep-bsd.c" >>$CONFIG_MK;; + esac +else + echo "PRIVSEP_SRCS=" >>$CONFIG_MK +fi + +echo "Using compiler .. $CC" +# Add CPPFLAGS and CFLAGS to CC for testing features +XCC="$CC `$SED -n -e 's/CPPFLAGS+=*\(.*\)/\1/p' $CONFIG_MK`" +XCC="$XCC `$SED -n -e 's/CFLAGS+=*\(.*\)/\1/p' $CONFIG_MK`" + +# When running tests, treat all warnings as errors. +# This avoids the situation where we link to a libc symbol +# without the correct header because it might be hidden behind +# a _*_SOURCE #define guard. +XCC="$XCC -Wall -Werror" + +# Now test we can use the compiler with our CFLAGS +cat <<EOF >_test.c +int main(void) { + return 0; +} +EOF +_CC=false +if $XCC _test.c -o _test >/dev/null 2>&3; then + [ -x _test ] && _CC=true +fi +rm -f _test.c _test +if ! $_CC; then + echo $XCC + echo "$CC does not create executables" >&2 + exit 1 +fi +[ "$CC" != cc ] && echo "CC= $CC" >>$CONFIG_MK +$CC --version | $SED -e '1!d' + +if [ "$PRIVSEP" = yes ]; then + printf "Testing for capsicum ... " + cat <<EOF >_capsicum.c +#include <sys/capsicum.h> +int main(void) { + return cap_enter(); +} +EOF + if $XCC _capsicum.c -o _capsicum 2>&3; then + echo "yes" + echo "#define HAVE_CAPSICUM" >>$CONFIG_H + else + echo "no" + fi + rm -f _capsicum.c _capsicum + + printf "Testing for pledge ... " + cat <<EOF >_pledge.c +#include <unistd.h> +int main(void) { + return pledge("stdio", NULL); +} +EOF + if $XCC _pledge.c -o _pledge 2>&3; then + echo "yes" + echo "#define HAVE_PLEDGE" >>$CONFIG_H + else + echo "no" + fi + rm -f _pledge.c _pledge +fi + +# This block needs to be after the compiler test due to embedded quotes. +if [ -z "$EMBEDDED" ] || [ "$EMBEDDED" = yes ]; then + echo "$DHCPCD_DEFS will be embedded in dhcpcd itself" + echo "DHCPCD_SRCS+= dhcpcd-embedded.c" >>$CONFIG_MK +else + echo "$DHCPCD_DEFS will be installed to $LIBEXECDIR" + echo "CPPFLAGS+= -DEMBEDDED_CONFIG=\\\"$LIBEXECDIR/dhcpcd-definitions.conf\\\"" >>$CONFIG_MK + echo "EMBEDDEDINSTALL= _embeddedinstall" >>$CONFIG_MK +fi + +if [ "$OS" = linux ]; then + printf "Testing for nl80211 ... " + cat <<EOF >_nl80211.c +#include <linux/nl80211.h> +int main(void) { + return 0; +} +EOF + if $XCC _nl80211.c -o _nl80211 2>&3; then + echo "yes" + echo "#define HAVE_NL80211_H" >>$CONFIG_H + else + echo "no" + echo "DHCPCD_SRCS+= if-linux-wext.c" >>$CONFIG_MK + fi + rm -f _nl80211.c _nl80211 + + printf "Testing for IN6_ADDR_GEN_MODE_NONE ... " + cat <<EOF >_IN6_ADDR_GEN_MODE_NONE.c +#include <linux/if_link.h> +int main(void) { + int x = IN6_ADDR_GEN_MODE_NONE; + return x; +} +EOF + if $XCC _IN6_ADDR_GEN_MODE_NONE.c -o _IN6_ADDR_GEN_MODE_NONE 2>&3; then + echo "yes" + echo "#define HAVE_IN6_ADDR_GEN_MODE_NONE" >>$CONFIG_H + else + echo "no" + fi + rm -f _IN6_ADDR_GEN_MODE_NONE.c _IN6_ADDR_GEN_MODE_NONE +else + printf "Testing for ifam_pid ... " + cat <<EOF >_ifam_pid.c +#include <net/if.h> +int main(void) { + struct ifa_msghdr ifam = { }; + return (int)ifam.ifam_pid; +} +EOF + if $XCC _ifam_pid.c -o _ifam_pid 2>&3; then + echo "yes" + echo "#define HAVE_IFAM_PID" >>$CONFIG_H + else + echo "no" + fi + rm -f _ifam_pid.c _ifam_pid + + printf "Testing for ifam_addrflags ... " + cat <<EOF >_ifam_addrflags.c +#include <net/if.h> +int main(void) { + struct ifa_msghdr ifam = { }; + return (int)ifam.ifam_addrflags; +} +EOF + if $XCC _ifam_addrflags.c -o _ifam_addrflags 2>&3; then + echo "yes" + echo "#define HAVE_IFAM_ADDRFLAGS" >>$CONFIG_H + else + echo "no" + fi + rm -f _ifam_addrflags.c _ifam_addrflags +fi + +abort=false +# We require the libc to support non standard functions, like getifaddrs +printf "Testing for getifaddrs ... " +cat <<EOF >_getifaddrs.c +#include <sys/types.h> +#include <ifaddrs.h> +int main(void) { + struct ifaddrs *ifap; + return getifaddrs(&ifap); +} +EOF +LIBSOCKET= +if $XCC _getifaddrs.c -o _getifaddrs 2>&3; then + echo "yes" +elif $XCC _getifaddrs.c -o _getifaddrs -lsocket 2>&3; then + LIBSOCKET=-lsocket + echo "yes (-lsocket)" + echo "LDADD+= -lsocket" >>$CONFIG_MK +else + echo "no" + echo "libc support for getifaddrs is required - aborting" >&2 + abort=true +fi +rm -f _getifaddrs.c _getifaddrs +$abort && exit 1 + +printf "Testing for ifaddrs.ifa_addrflags ... " +cat <<EOF >_getifaddrs_addrflags.c +#include <sys/types.h> +#include <ifaddrs.h> +int main(void) { + struct ifaddrs *ifap; + getifaddrs(&ifap); + return (int)ifap->ifa_addrflags; +} +EOF +if $XCC _getifaddrs_addrflags.c -o _getifaddrs_addrflags $LIBSOCKET 2>&3; then + echo "yes" + echo "#define HAVE_IFADDRS_ADDRFLAGS" >>$CONFIG_H +else + echo "no" +fi +rm -f _getifaddrs_addrflags.c _getifaddrs_addrflags + +printf "Testing for clock_gettime ... " +cat <<EOF >_clock_gettime.c +#include <time.h> +int main(void) { + struct timespec ts; + return clock_gettime(CLOCK_MONOTONIC, &ts); +} +EOF +if $XCC _clock_gettime.c -o _clock_gettime 2>&3; then + echo "yes" +elif $XCC _clock_gettime.c -lrt -o _clock_gettime 2>&3; then + echo "yes (-lrt)" + echo "LDADD+= -lrt" >>$CONFIG_MK +else + echo "no" + echo "libc support for clock_getttime is required - aborting" >&2 + abort=true +fi +rm -f _clock_gettime.c _clock_gettime +$abort && exit 1 + +printf "Testing ioctl request type ... " +cat <<EOF >_ioctl.c +#include <sys/ioctl.h> +int main(void) { + unsigned long req = 0; + return ioctl(3, req, &req); +} +EOF +if $XCC _ioctl.c -o _ioctl 2>&3; then + IOCTL_REQ="unsigned long" +else + IOCTL_REQ="int" +fi +echo "$IOCTL_REQ" +# Our default is unsigned long +# We can still define it, but it makes the code path slightly bigger +if [ "$IOCTL_REQ" != "unsigned long" ]; then + echo "#define IOCTL_REQUEST_TYPE $IOCTL_REQ" >>$CONFIG_H +fi +rm -f _ioctl.c _ioctl + +printf "Testing for inet_ntoa ... " +cat <<EOF >_inet_ntoa.c +#include <netinet/in.h> +#include <arpa/inet.h> +int main(void) { + struct in_addr in = { .s_addr = 0 }; + inet_ntoa(in); + return 0; +} +EOF +if $XCC _inet_ntoa.c -o _inet_ntoa 2>&3; then + echo "yes" +elif $XCC _inet_ntoa.c -lnsl -o _inet_ntoa 2>&3; then + echo "yes (-lnsl)" + echo "LDADD+= -lnsl" >>$CONFIG_MK +elif $XCC _inet_ntoa.c -lsocket -o _inet_ntoa 2>&3; then + echo "yes (-lsocket)" + echo "LDADD+= -lsocket" >>$CONFIG_MK +else + echo "no" + echo "libc support for inet_ntoa is required - aborting" >&2 + abort=true +fi +rm -f _inet_ntoa.c _inet_ntoa +$abort && exit 1 + +if [ -z "$ARC4RANDOM" ]; then + printf "Testing for arc4random ... " + cat <<EOF >_arc4random.c +#include <stdlib.h> +int main(void) { + arc4random(); + return 0; +} +EOF + if $XCC _arc4random.c -o _arc4random 2>&3; then + ARC4RANDOM=yes + else + ARC4RANDOM=no + fi + echo "$ARC4RANDOM" + rm -f _arc4random.c _arc4random +fi +if [ "$ARC4RANDOM" = no ]; then + echo "COMPAT_SRCS+= compat/arc4random.c" >>$CONFIG_MK + echo "#include \"compat/arc4random.h\"" >>$CONFIG_H +fi + +if [ -z "$ARC4RANDOM_UNIFORM" ]; then + printf "Testing for arc4random_uniform ... " + cat <<EOF >_arc4random_uniform.c +#include <stdlib.h> +int main(void) { + arc4random_uniform(100); + return 0; +} +EOF + if $XCC _arc4random_uniform.c -o _arc4random_uniform 2>&3; then + ARC4RANDOM_UNIFORM=yes + else + ARC4RANDOM_UNIFORM=no + fi + echo "$ARC4RANDOM_UNIFORM" + rm -f _arc4random_uniform.c _arc4random_uniform +fi +if [ "$ARC4RANDOM_UNIFORM" = no ]; then + echo "COMPAT_SRCS+= compat/arc4random_uniform.c" >>$CONFIG_MK + echo "#include \"compat/arc4random_uniform.h\"" >>$CONFIG_H +fi + +if [ -z "$OPEN_MEMSTREAM" ]; then + printf "Testing for open_memstream ... " + cat <<EOF >_open_memstream.c +#include <stdio.h> +int main(void) { + return open_memstream(NULL, NULL) != NULL ? 0 : 1; +} +EOF + if $XCC _open_memstream.c -o _open_memstream 2>&3; then + OPEN_MEMSTREAM=yes + else + OPEN_MEMSTREAM=no + fi + echo "$OPEN_MEMSTREAM" + rm -f _open_memstream.c _open_memstream +fi +if [ "$OPEN_MEMSTREAM" = yes ]; then + echo "#define HAVE_OPEN_MEMSTREAM" >>$CONFIG_H +elif [ "$PRIVSEP" = yes ]; then + echo "WARNING: Ensure that /tmp exists in the privsep users chroot" +fi + +if [ -z "$PIDFILE_LOCK" ]; then + printf "Testing for pidfile_lock ... " + cat <<EOF >_pidfile.c +#include <stdlib.h> +#include <util.h> +int main(void) { + pidfile_lock(NULL); + return 0; +} +EOF + # We only want to link to libutil if it exists in /lib + if $ALLOW_USR_LIBS; then + set -- / + else + set -- $(ls /lib/libutil.so.* 2>/dev/null) + fi + if $XCC _pidfile.c -o _pidfile 2>&3; then + PIDFILE_LOCK=yes + elif [ -e "$1" ] && $XCC _pidfile.c -o _pidfile -lutil 2>&3; then + PIDFILE_LOCK="yes (-lutil)" + LIBUTIL="-lutil" + else + PIDFILE_LOCK=no + fi + echo "$PIDFILE_LOCK" + rm -f _pidfile.c _pidfile +fi +if [ "$PIDFILE_LOCK" = no ]; then + echo "COMPAT_SRCS+= compat/pidfile.c" >>$CONFIG_MK + echo "#include \"compat/pidfile.h\"" >>$CONFIG_H +else + echo "#define HAVE_UTIL_H" >>$CONFIG_H + if [ -n "$LIBUTIL" ]; then + echo "LDADD+= $LIBUTIL" >>$CONFIG_MK + fi +fi + +if [ -z "$SETPROCTITLE" ]; then + printf "Testing for setproctitle ... " + cat << EOF >_setproctitle.c +#include <stdlib.h> +#include <unistd.h> +int main(void) { + setproctitle("foo"); + return 0; +} +EOF + if $XCC _setproctitle.c -o _setproctitle 2>&3; then + SETPROCTITLE=yes + else + SETPROCTITLE=no + fi + echo "$SETPROCTITLE" + rm -f _setproctitle.c _setproctitle +fi +if [ "$SETPROCTITLE" = no ]; then + case "$OS" in + solaris*|sunos*) + echo "$OS has no support for setting process title" + echo "#define setproctitle(...)" >>$CONFIG_H + ;; + *) + echo "COMPAT_SRCS+= compat/setproctitle.c" >>$CONFIG_MK + echo "#include \"compat/setproctitle.h\"" \ + >>$CONFIG_H + ;; + esac +fi + +if [ -z "$STRLCPY" ]; then + printf "Testing for strlcpy ... " + cat <<EOF >_strlcpy.c +#include <string.h> +int main(void) { + const char s1[] = "foo"; + char s2[10]; + strlcpy(s2, s1, sizeof(s2)); + return 0; +} +EOF + if $XCC _strlcpy.c -o _strlcpy 2>&3; then + STRLCPY=yes + else + STRLCPY=no + fi + echo "$STRLCPY" + rm -f _strlcpy.c _strlcpy +fi +if [ "$STRLCPY" = no ]; then + echo "COMPAT_SRCS+= compat/strlcpy.c" >>$CONFIG_MK + echo "#include \"compat/strlcpy.h\"" >>$CONFIG_H +fi + +if [ -z "$STRTOI" ]; then + printf "Testing for strtoi ... " + cat <<EOF >_strtoi.c +#include <stdlib.h> +#include <limits.h> +#include <inttypes.h> +int main(void) { + int e; + strtoi("1234", NULL, 0, 0, INT32_MAX, &e); + return 0; +} +EOF + if $XCC _strtoi.c -o _strtoi 2>&3; then + STRTOI=yes + else + STRTOI=no + fi + echo "$STRTOI" + rm -f _strtoi.c _strtoi +fi +if [ "$STRTOI" = no ]; then + echo "COMPAT_SRCS+= compat/strtoi.c compat/strtou.c" >>$CONFIG_MK + echo "#include \"compat/strtoi.h\"" >>$CONFIG_H +fi + +if [ -z "$CONSTTIME_MEMEQUAL" ]; then + printf "Testing for consttime_memequal ... " + cat <<EOF >_consttime_memequal.c +#include <string.h> +int main(void) { + return consttime_memequal("deadbeef", "deadbeef", 8); +} +EOF + if $XCC _consttime_memequal.c -o _consttime_memequal 2>&3; then + CONSTTIME_MEMEQUAL=yes + else + CONSTTIME_MEMEQUAL=no + fi + echo "$CONSTTIME_MEMEQUAL" + rm -f _consttime_memequal.c _consttime_memequal +fi +if [ "$CONSTTIME_MEMEQUAL" = no ]; then + echo "#include \"compat/consttime_memequal.h\"" \ + >>$CONFIG_H +fi + +if [ -z "$DPRINTF" ]; then + printf "Testing for dprintf ... " + cat <<EOF >_dprintf.c +#include <stdio.h> +int main(void) { + return dprintf(0, "%d", 0); +} +EOF + if $XCC _dprintf.c -o _dprintf 2>&3; then + DPRINTF=yes + else + DPRINTF=no + fi + echo "$DPRINTF" + rm -f _dprintf.c _dprintf +fi +if [ "$DPRINTF" = no ]; then + echo "COMPAT_SRCS+= compat/dprintf.c" >>$CONFIG_MK + echo "#include \"compat/dprintf.h\"" >>$CONFIG_H +fi + +if [ -z "$TAILQ_FOREACH_SAFE" ]; then + printf "Testing for TAILQ_FOREACH_SAFE ... " + cat <<EOF >_queue.c +#include <sys/queue.h> +int main(void) { +#ifndef TAILQ_FOREACH_SAFE +#error TAILQ_FOREACH_SAFE +#endif + return 0; +} +EOF + if $XCC _queue.c -o _queue 2>&3; then + TAILQ_FOREACH_SAFE=yes + TAILQ_FOREACH=yes + else + TAILQ_FOREACH_SAFE=no + fi + echo "$TAILQ_FOREACH_SAFE" + rm -f _queue.c _queue +fi +if [ "$TAILQ_FOREACH_SAFE" = no ] && [ -z "$TAILQ_FOREACH_MUTABLE" ]; then + printf "Testing for TAILQ_FOREACH_MUTABLE ... " + cat <<EOF >_queue.c +#include <sys/queue.h> +int main(void) { +#ifndef TAILQ_FOREACH_MUTABLE +#error TAILQ_FOREACH_MUTABLE +#endif + return 0; +} +EOF + if $XCC _queue.c -o _queue 2>&3; then + TAILQ_FOREACH_MUTABLE=yes + TAILQ_FOREACH_SAFE=yes + TAILQ_FOREACH=yes + echo "#define TAILQ_FOREACH_SAFE TAILQ_FOREACH_MUTABLE" \ + >> $CONFIG_H + else + TAILQ_FOREACH_MUTABLE=no + fi + echo "$TAILQ_FOREACH_MUTABLE" + rm -f _queue.c _queue +fi + + +if [ -z "$TAILQ_CONCAT" ]; then + printf "Testing for TAILQ_CONCAT ..." + cat <<EOF >_queue.c +#include <sys/queue.h> +int main(void) { +#ifndef TAILQ_CONCAT +#error TAILQ_CONCAT +#endif + return 0; +} +EOF + if $XCC _queue.c -o _queue 2>&3; then + TAILQ_CONCAT=yes + TAILQ_FOREACH=yes + else + TAILQ_CONCAT=no + fi + echo "$TAILQ_CONCAT" + rm -f _queue.c _queue +fi + +if [ -z "$TAILQ_FOREACH" ]; then + printf "Testing for TAILQ_FOREACH ... " + cat <<EOF >_queue.c +#include <sys/queue.h> +int main(void) { +#ifndef TAILQ_FOREACH +#error TAILQ_FOREACH +#endif + return 0; +} +EOF + if $XCC _queue.c -o _queue 2>&3; then + TAILQ_FOREACH=yes + else + TAILQ_FOREACH=no + fi + echo "$TAILQ_FOREACH" + rm -f _queue.c _queue +fi + +if [ "$TAILQ_FOREACH_SAFE" = no ] || [ "$TAILQ_CONCAT" = no ]; then + # If we don't include sys/queue.h then clang analyser finds + # too many false positives. + # See http://llvm.org/bugs/show_bug.cgi?id=18222 + # Strictly speaking this isn't needed, but I like it to help + # catch any nasties. + if [ "$TAILQ_FOREACH" = yes ]; then + echo "#include <sys/queue.h>">>$CONFIG_H + fi + echo "#include \"compat/queue.h\"">>$CONFIG_H +else + echo "#define HAVE_SYS_QUEUE_H" >>$CONFIG_H +fi + +if [ -z "$RBTREE" ]; then + printf "Testing for rb_tree_init ... " + cat <<EOF >_rbtree.c +#include <sys/rbtree.h> +static rb_tree_ops_t ops; +int main(void) { + rb_tree_t tree; + rb_tree_init(&tree, &ops); + return 0; +} +EOF + if $XCC _rbtree.c -o _rbtree 2>&3; then + RBTREE=yes + else + RBTREE=no + fi + echo "$RBTREE" + rm -f _rbtree.c _rbtree +fi +if [ "$RBTREE" = no ]; then + echo "#define RBTEST" >>$CONFIG_H + echo "COMPAT_SRCS+= compat/rb.c" >>$CONFIG_MK + echo "#include \"compat/rbtree.h\"" >>$CONFIG_H +else + echo "#define HAVE_SYS_RBTREE_H" >>$CONFIG_H +fi + +if [ -z "$REALLOCARRAY" ]; then + printf "Testing for reallocarray ... " + cat <<EOF >_reallocarray.c +#include <stdlib.h> + +int main(void) { + void *foo = reallocarray(NULL, 0, 0); + return foo == NULL ? 1 : 0; +} +EOF + if $XCC _reallocarray.c -o _reallocarray 2>&3; then + REALLOCARRAY=yes + else + REALLOCARRAY=no + fi + echo "$REALLOCARRAY" + rm -f _reallocarray.c _reallocarray +fi +if [ "$REALLOCARRAY" = no ]; then + echo "COMPAT_SRCS+= compat/reallocarray.c" >>$CONFIG_MK + echo "#include \"compat/reallocarray.h\"">>$CONFIG_H +fi +# Set this for eloop +echo "#define HAVE_REALLOCARRAY" >>$CONFIG_H + +if [ -z "$POLL" ]; then + printf "Testing for ppoll ... " + cat <<EOF >_ppoll.c +#include <poll.h> +#include <stddef.h> +int main(void) { + struct pollfd fds; + return ppoll(&fds, 1, NULL, NULL); +} +EOF + if $XCC _ppoll.c -o _ppoll 2>&3; then + POLL=ppoll + echo "yes" + else + echo "no" + fi + rm -f _ppoll.c _ppoll +fi +if [ -z "$POLL" ]; then + printf "Testing for pollts ... " + cat <<EOF >_pollts.c +#include <poll.h> +#include <stddef.h> +int main(void) { + struct pollfd fds; + return pollts(&fds, 1, NULL, NULL); +} +EOF + if $XCC _pollts.c -o _pollts 2>&3; then + POLL=pollts + echo "yes" + else + echo "no" + fi + rm -f _pollts.c _pollts +fi +if [ -z "$POLL" ]; then + printf "Testing for pselect ... " + cat <<EOF >_pselect.c +#include <sys/select.h> +#include <stdlib.h> +int main(void) { + pselect(0, NULL, NULL, NULL, NULL, NULL); + return 0; +} +EOF + if $XCC _pselect.c -o _pselect 2>&3; then + POLL=pselect + echo "yes" + else + echo "no" + fi + rm -f _pselect.c _pselect +fi +case "$POLL" in +ppoll) + echo "#define HAVE_PPOLL" >>$CONFIG_H + ;; +pollts) + echo "#define HAVE_POLLTS" >>$CONFIG_H + ;; +pselect) + echo "#define HAVE_PSELECT" >>$CONFIG_H + ;; +*) + echo "No suitable polling function is available, not even pselect" >&2 + exit 1 + ;; +esac + +if [ -z "$BE64ENC" ]; then + printf "Testing for be64enc ... " + cat <<EOF >_be64enc.c +#include <sys/endian.h> +#include <stdlib.h> +int main(void) { + be64enc(NULL, 0); + return 0; +} +EOF + if $XCC _be64enc.c -o _be64enc 2>&3; then + BE64ENC=yes + else + BE64ENC=no + fi + echo "$BE64ENC" + rm -f _be64enc.c _be64enc +fi +if [ "$BE64ENC" = no ]; then + echo "#include \"compat/endian.h\"" >>$CONFIG_H +fi + +if [ -z "$FLS64" ]; then + printf "Testing for fls64 ... " + cat <<EOF >_fls64.c +#include <sys/bitops.h> +int main(void) { + return (int)fls64(1337); +} +EOF + if $XCC _fls64.c -o _fls64 2>&3; then + FLS64=yes + else + FLS64=no + fi + echo "$FLS64" + rm -f _fls64.c _fls64 +fi +if [ "$FLS64" = yes ]; then + echo "#define HAVE_SYS_BITOPS_H" >>$CONFIG_H +fi + +# Workaround for DragonFlyBSD import +if [ "$OS" = dragonfly ]; then + echo "#ifdef USE_PRIVATECRYPTO" >>$CONFIG_H + echo "#define HAVE_MD5_H" >>$CONFIG_H + echo "#define SHA2_H <openssl/sha.h>" >>$CONFIG_H + echo "#else" >>$CONFIG_H +fi + +if [ -z "$MD5" ]; then + MD5_LIB= + printf "Testing for MD5Init ... " + cat <<EOF >_md5.c +#include <sys/types.h> +#include <md5.h> +#include <stdlib.h> +int main(void) { + MD5_CTX context; + MD5Init(&context); + return 0; +} +EOF + # We only want to link to libmd if it exists in /lib + if $ALLOW_USR_LIBS; then + set -- / + else + set -- $(ls /lib/libmd.so.* 2>/dev/null) + fi + if $XCC _md5.c -o _md5 2>&3; then + MD5=yes + elif [ -e "$1" ] && $XCC _md5.c -lmd -o _md5 2>&3; then + MD5="yes (-lmd)" + MD5_LIB=-lmd + else + MD5=no + fi + echo "$MD5" + rm -f _md5.c _md5 +fi +if [ "$MD5" = no ]; then + echo "#include \"compat/crypt/md5.h\"" >>$CONFIG_H + echo "MD5_SRC= compat/crypt/md5.c" >>$CONFIG_MK +else + echo "MD5_SRC=" >>$CONFIG_MK + echo "#define HAVE_MD5_H" >>$CONFIG_H + [ -n "$MD5_LIB" ] && echo "LDADD+= $MD5_LIB" >>$CONFIG_MK +fi + +if [ -z "$SHA2_H" ]; then + if [ -z "$SHA2" ] || [ "$SHA2" != no ]; then + printf "Testing for sha2.h ... " + if [ -e /usr/include/sha2.h ]; then + SHA2_H=sha2.h + elif [ -e /usr/include/sha256.h ]; then + SHA2_H=sha256.h + fi + if [ -n "$SHA2_H" ]; then + echo "$SHA2_H" + else + echo "no" + fi + fi +fi + +if [ -z "$SHA2" ]; then + SHA2_LIB= + SHA2_RENAMED= + printf "Testing for SHA256_Init ... " + cat <<EOF >_sha256.c +#include <sys/types.h> +EOF + [ -n "$SHA2_H" ] && echo "#include <$SHA2_H>">>_sha256.c + cat <<EOF >>_sha256.c +#include <stdlib.h> +int main(void) { + SHA256_CTX context; + SHA256_Init(&context); + return 0; +} +EOF + # We only want to link to libmd if it exists in /lib + if $ALLOW_USR_LIBS; then + set -- / + else + set -- $(ls /lib/libmd.so.* 2>/dev/null) + fi + if $XCC _sha256.c -o _sha256 2>&3; then + SHA2=yes + elif [ -e "$1" ] && $XCC _sha256.c -lmd -o _sha256 2>&3; then + SHA2="yes (-lmd)" + SHA2_LIB=-lmd + else + SHA2=no + fi + echo "$SHA2" + rm -f _sha256.c _sha256 + if [ "$SHA2" = no ]; then + # Did OpenBSD really change this? grrrr + printf "Testing for SHA256Init ... " + cat <<EOF >_sha256.c +#include <sys/types.h> +EOF + [ -n "$SHA2_H" ] && echo "#include <$SHA2_H>">>_sha256.c + cat <<EOF >>_sha256.c +#include <stdlib.h> +int main(void) { + SHA2_CTX context; + SHA256Init(&context); + return 0; +} +EOF + # We only want to link to libmd if it exists in /lib + if $ALLOW_USR_LIBS; then + set -- / + else + set -- $(ls /lib/libmd.so.* 2>/dev/null) + fi + if $XCC _sha256.c -o _sha256 2>&3; then + SHA2=yes + SHA2_RENAMED=yes + elif [ -e "$1" ] && $XCC _sha256.c -lmd -o _sha256 2>&3 + then + SHA2="yes (-lmd)" + SHA2_LIB=-lmd + SHA2_RENAMED=yes + else + SHA2=no + fi + echo "$SHA2" + rm -f _sha256.c _sha256 + fi +fi +if [ "$SHA2" = no ]; then + echo "#include \"compat/crypt/sha256.h\"" >>$CONFIG_H + echo "SHA256_SRC= compat/crypt/sha256.c" >>$CONFIG_MK +else + echo "SHA256_SRC=" >>$CONFIG_MK + echo "#define SHA2_H <$SHA2_H>" >>$CONFIG_H + if [ "$SHA2_RENAMED" = yes ]; then + echo "#define SHA256_CTX SHA2_CTX" >>$CONFIG_H + echo "#define SHA256_Init SHA256Init" >>$CONFIG_H + echo "#define SHA256_Update SHA256Update" >>$CONFIG_H + echo "#define SHA256_Final SHA256Final" >>$CONFIG_H + fi + [ -n "$SHA2_LIB" ] && echo "LDADD+= $SHA2_LIB" >>$CONFIG_MK +fi + +# Workarond for DragonFlyBSD import +[ "$OS" = dragonfly ] && echo "#endif" >>$CONFIG_H + +if [ -z "$HMAC" ]; then + HMAC_LIB= + printf "Testing for hmac ... " + cat <<EOF >_hmac.c +#include <stdlib.h> +#include <hmac.h> +int main(void) { + hmac(NULL, NULL, 0, NULL, 0, NULL, 0); + return 0; +} +EOF + if $XCC _hmac.c $MD5_LIB -o _hmac 2>&3; then + HMAC=yes + echo "#define HAVE_HMAC_H" >>$CONFIG_H + else + # Remove this test if NetBSD-8 ships with + # hmac in it's own header and not stdlib.h + cat <<EOF >_hmac.c +#include <stdlib.h> +int main(void) { + hmac(NULL, NULL, 0, NULL, 0, NULL, 0); + return 0; +} +EOF + if $XCC _hmac.c $MD5_LIB -o _hmac 2>&3; then + HMAC=yes + else + HMAC=no + fi + fi + echo "$HMAC" + rm -f _hmac.c _hmac +fi +if [ "$HMAC" = no ]; then + echo "#include \"compat/crypt/hmac.h\"" >>$CONFIG_H + echo "HMAC_SRC= compat/crypt/hmac.c" >>$CONFIG_MK +else + # echo "#define HAVE_HMAC_H" >>$CONFIG_H + echo "HMAC_SRC=" >>$CONFIG_MK +fi + +if [ -z "$AUTH" ] || [ "$AUTH" = yes ]; then + if [ "$HMAC" = no ]; then + echo "CRYPT_SRCS+= \${HMAC_SRC}" >>$CONFIG_MK + fi +fi +if [ -z "$INET6" ] || [ "$INET6" = yes ] || \ + [ -z "$AUTH" ] || [ "$AUTH" = yes ]; then + if [ "$MD5" = no ]; then + echo "CRYPT_SRCS+= \${MD5_SRC}" >>$CONFIG_MK + fi + if [ "$SHA2" = no ]; then + echo "CRYPT_SRCS+= \${SHA256_SRC}" >>$CONFIG_MK + fi +fi + +if [ "$DEV" != no ] && [ "$UDEV" != no ]; then + printf "Checking for libudev ... " + if type "$PKG_CONFIG" >/dev/null 2>&1; then + LIBUDEV_CFLAGS=$("$PKG_CONFIG" --cflags libudev 2>&3) + LIBUDEV_LIBS=$("$PKG_CONFIG" --libs libudev 2>&3) + fi + if [ -n "$LIBUDEV_LIBS" ] && [ "$UDEV" = yes ]; then + echo "yes" + elif [ -n "$LIBUDEV_LIBS" ]; then + case "$OS" in + linux*) echo "yes";; + *) echo "yes (disabled)" + # FreeBSD libudev fails to return a udev device + # with udev_device_new_from_subsystem_sysname + # which breaks our test for device initialisation + LIBUDEV_CFLAGS= + LIBUDEV_LIBS= + ;; + esac + else + echo "no" + fi +fi + +if [ "$DEV" != no ] && [ "$UDEV" != no ] && [ -n "$LIBUDEV_LIBS" ]; then + [ -z "$DEV" ] && DEV=yes + echo "DEV_PLUGINS+= udev" >>$CONFIG_MK + if [ -n "$LIBUDEV_CFLAGS" ]; then + echo "LIBUDEV_CFLAGS= $LIBUDEV_CFLAGS" >>$CONFIG_MK + fi + echo "LIBUDEV_LIBS= $LIBUDEV_LIBS" >>$CONFIG_MK + + printf "Checking udev_monitor_filter_add_match_subsystem_devtype ... " + cat <<EOF >_udev.c +#include <libudev.h> +#include <stdlib.h> +int main(void) { + udev_monitor_filter_add_match_subsystem_devtype(NULL, NULL, NULL); + return 0; +} +EOF + if $XCC $LIBUDEV_CFLAGS _udev.c -o _udev $LIBUDEV_LIBS 2>&3 + then + echo "yes" + else + echo "LIBUDEV_CPPFLAGS+= -DLIBUDEV_NOFILTER" >>$CONFIG_MK + echo "no" + fi + rm -f _udev.c _udev + + printf "Checking udev_device_get_is_initialized ... " + cat <<EOF >_udev.c +#include <libudev.h> +#include <stdlib.h> +int main(void) { + udev_device_get_is_initialized(NULL); + return 0; +} +EOF + if $XCC $LIBUDEV_CFLAGS _udev.c -o _udev $LIBUDEV_LIBS 2>&3 + then + echo "yes" + else + echo "LIBUDEV_CPPFLAGS+= -DLIBUDEV_NOINIT" >>$CONFIG_MK + echo "no" + fi + rm -f _udev.c _udev +elif [ "$DEV" != no ] && [ "$UDEV" != no ] && [ -n "$UDEV" ]; then + echo "udev has been explicitly requested ... aborting" >&2 + exit 1 +fi + +if [ "$DEV" = yes ]; then + echo "DHCPCD_SRCS+= dev.c" >>$CONFIG_MK + echo "CPPFLAGS+= -DPLUGIN_DEV" >>$CONFIG_MK + echo "MKDIRS+= dev" >>$CONFIG_MK + + # So the plugins have access to logerr + echo "LDFLAGS+= -Wl,-export-dynamic" >>$CONFIG_MK + + printf "Testing for dlopen ... " + cat <<EOF >_dlopen.c +#include <dlfcn.h> +#include <stdlib.h> +int main(void) { + void *h = dlopen("/foo/bar", 0); + void (*s)(char *) = dlsym(h, "deadbeef"); + s(dlerror()); + dlclose(h); + return 0; +} +EOF + if $XCC _dlopen.c -o _dlopen 2>&3; then + echo "yes" + elif $XCC _dlopen.c -ldl -o _dlopen 2>&3; then + echo "yes (-ldl)" + echo "LDADD+= -ldl" >>$CONFIG_MK + else + echo "no" + echo "libc for dlopen is required - aborting" + fi + rm -f _dlopen.c _dlopen + $abort && exit 1 +fi + +# Transform for a make file +SERVICEEXISTS=$(echo "$SERVICEEXISTS" | $SED \ + -e 's:\\:\\\\:g' \ + -e 's:\&:\\\&:g' \ + -e 's:\$:\\\\\$\$:g' \ +) +echo "SERVICEEXISTS= $SERVICEEXISTS" >>config.mk +SERVICECMD=$(echo "$SERVICECMD" | $SED \ + -e 's:\\:\\\\:g' \ + -e 's:\&:\\\&:g' \ + -e 's:\$:\\\\\$\$:g' \ +) +echo "SERVICECMD= $SERVICECMD" >>config.mk +SERVICESTATUS=$(echo "$SERVICESTATUS" | $SED \ + -e 's:\\:\\\\:g' \ + -e 's:\&:\\\&:g' \ + -e 's:\$:\\\\\$\$:g' \ +) +echo "SERVICESTATUS= $SERVICESTATUS" >>config.mk +if [ -z "$STATUSARG" ]; then + case "$OS" in + dragonfly*|freebsd*) STATUSARG="onestatus";; + esac +fi +echo "STATUSARG= $STATUSARG" >>config.mk + +HOOKS= +if ! $HOOKSET; then + printf "Checking for ntpd ... " + NTPD=$(_which ntpd) + if [ -n "$NTPD" ]; then + echo "$NTPD (50-ntp.conf)" + else + echo "not found" + fi + printf "Checking for chronyd ... " + CHRONYD=$(_which chronyd) + if [ -n "$CHRONYD" ]; then + echo "$CHRONYD (50-ntp.conf)" + else + echo "not found" + fi + if [ -n "$NTPD" ] || [ -n "$CHRONYD" ]; then + HOOKS="$HOOKS${HOOKS:+ }50-ntp.conf" + fi + # Warn if both are detected + if [ -n "$NTPD" ] && [ -n "$CHRONYD" ]; then + echo "NTP will default to $NTPD" + fi + + printf "Checking for ypbind ... " + YPBIND=$(_which ypbind) + if [ -n "$YPBIND" ]; then + YPHOOK="50-ypbind" + if strings "$YPBIND" | $GREP -q yp\\.conf; then + YPHOOK="50-yp.conf" + YPOS="Linux" + elif strings "$YPBIND" | $GREP -q \\.ypservers; then + YPOS="NetBSD" + echo "YPDOMAIN_DIR= /var/yp" >>$CONFIG_MK + echo "YPDOMAIN_SUFFIX=.ypservers" >>$CONFIG_MK + elif strings "$YPBIND" | $GREP -q /etc/yp; then + YPOS="OpenBSD" + echo "YPDOMAIN_DIR= /etc/yp" >>$CONFIG_MK + echo "YPDOMAIN_SUFFIX=" >>$CONFIG_MK + else + YPOS="FreeBSD" + echo "YPDOMAIN_DIR=" >>$CONFIG_MK + echo "YPDOMAIN_SUFFIX=" >>$CONFIG_MK + fi + echo "$YPBIND ($YPHOOK${YPOS:+ }$YPOS)" + EGHOOKS="$EGHOOKS${EGHOOKS:+ }$YPHOOK" + else + echo "not found" + YPHOOK="50-ypbind" + case "$OS" in + linux*) + YPHOOK="50-yp.conf" + YPOS="Linux" + ;; + freebsd*|dragonfly*) + YPOS="FreeBSD" + echo "YPDOMAIN_DIR=" >>$CONFIG_MK + echo "YPDOMAIN_SUFFIX=" >>$CONFIG_MK + ;; + netbsd*) + YPOS="NetBSD" + echo "YPDOMAIN_DIR= /var/yp" >>$CONFIG_MK + echo "YPDOMAIN_SUFFIX=.ypservers" >>$CONFIG_MK + ;; + openbsd*) + YPOS="OpenBSD" + echo "YPDOMAIN_DIR= /etc/yp" >>$CONFIG_MK + echo "YPDOMAIN_SUFFIX=" >>$CONFIG_MK + ;; + *) + YPHOOK= + ;; + esac + if [ -n "$YPHOOK" ]; then + echo "Assuming ypbind is $YPOS" + EGHOOKS="$EGHOOKS${EGHOOKS:+ }$YPHOOK" + fi + fi +fi + +find_hook() +{ + for h in [0-9][0-9]"-$x" [0-9][0-9]"-$x.in" \ + [0-9][0-9]"-$x.sh" [0-9][0-9]"-$x.sh.in" \ + [0-9][0-9]"-$x.conf" [0-9][0-9]"-$x.conf.in" + do + [ -e "$h" ] && break + done + [ -e "$h" ] || return 1 + echo "${h%%.in}" + return 0 +} + +if cd hooks; then + for x in $HOOKSCRIPTS; do + printf "Finding hook $x ... " + h=$(find_hook "$x") + if [ -z "$h" ]; then + echo "no" + else + echo "$h" + case " $HOOKS " in + *" $h "*) ;; + *) HOOKS="$HOOKS${HOOKS:+ }$h";; + esac + fi + done + for x in $EGHOOKSCRIPTS; do + printf "Finding example hook $x ... " + h=$(find_hook "$x") + if [ -z "$h" ]; then + echo "no" + else + echo "$h" + case " $EGHOOKS " in + *" $h "*) ;; + *) EGHOOKS="$EGHOOKS${EGHOOKS:+ }$h";; + esac + fi + done + cd .. +fi +echo "HOOKSCRIPTS= $HOOKS" >>$CONFIG_MK +echo "EGHOOKSCRIPTS= $EGHOOKS" >>$CONFIG_MK + +echo +echo " SYSCONFDIR = $SYSCONFDIR" +echo " SBINDIR = $SBINDIR" +echo " LIBDIR = $LIBDIR" +echo " LIBEXECDIR = $LIBEXECDIR" +echo " DBDIR = $DBDIR" +echo " RUNDIR = $RUNDIR" +echo " MANDIR = $MANDIR" +echo " DATADIR = $DATADIR" +echo " HOOKSCRIPTS = $HOOKS" +echo " EGHOOKSCRIPTS = $EGHOOKS" +echo " STATUSARG = $STATUSARG" +if [ "$PRIVSEP" = yes ]; then + echo " PRIVSEPUSER = $PRIVSEP_USER" +fi +echo + +rm -f dhcpcd tests/test |
