#!/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 RBTREE= OS= BUILD= HOST= HOSTCC= TARGET= PREFIX=/usr INCLUDEDIR= DEBUG= POLL= 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;; --prefix) PREFIX=$var;; --sysconfdir) SYSCONFDIR=$var;; --bindir|--sbindir) SBINDIR=$var;; --libexecdir) LIBEXECDIR=$var;; --statedir|--localstatedir) STATEDIR=$var;; --dbdir) DBDIR=$var;; --rundir|--runstatedir) RUNDIR=$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;; --build) BUILD=$var;; --host) HOST=$var; HOSTCC=$var-;; --target) TARGET=$var;; --libdir) LIBDIR=$var;; --with-poll) POLL="$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 < if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory 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} _which() { x="$(which "$1" 2>/dev/null)" if [ $? = 0 -a -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 parpd for ... $OS" rm -f $CONFIG_H $CONFIG_MK echo "# $OS" >$CONFIG_MK echo "/* $OS */" >$CONFIG_H if [ "$PREFIX" = /usr ]; then : ${SYSCONFDIR:=/etc} else : ${SYSCONFDIR:=$PREFIX/etc} fi : ${SBINDIR:=$PREFIX/sbin} : ${STATEDIR:=/var} : ${RUNDIR:=$STATEDIR/run} : ${MANDIR:=${PREFIX:-/usr}/share/man} eval SYSCONFDIR="$SYSCONFDIR" eval SBINDIR="$SBINDIR" eval RUNDIR="$RUNDIR" eval MANDIR="$MANDIR" echo "#ifndef SYSCONFDIR" >>$CONFIG_H for x in SYSCONFDIR SBINDIR 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 "MANDIR= $MANDIR" >>$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" -a "$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 if [ "$STATIC" = yes ]; then echo "LDFLAGS+= -static" >>$CONFIG_MK fi if [ -z "$DEBUG" -a -d .git ]; then printf "Found git checkout ... " DEBUG=yes fi if [ -n "$DEBUG" -a "$DEBUG" != no -a "$DEBUG" != false ]; then echo "Adding debugging CFLAGS" cat <>$CONFIG_MK CFLAGS+= -g -Wall -Wextra 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 else echo "CPPFLAGS+= -DNDEBUG" >>$CONFIG_MK fi case "$OS" in linux*) echo "SRC_PF= lpf.c" >>$CONFIG_MK ;; *) echo "SRC_PF= bpf.c" >>$CONFIG_MK ;; esac 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 <_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 "$CC does not create executables" >&2 exit 1 fi [ "$CC" != cc ] && echo "CC= $CC" >>$CONFIG_MK $CC --version | $SED -e '1!d' abort=false # We require the libc to support non standard functions, like getifaddrs printf "Testing for getifaddrs ... " cat <_getifaddrs.c #include #include 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 clock_gettime ... " cat <_clock_gettime.c #include 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 for inet_ntoa ... " cat <_inet_ntoa.c #include #include 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 "$STRLCPY" ]; then printf "Testing for strlcpy ... " cat <_strlcpy.c #include 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 "$TAILQ_FOREACH_SAFE" ]; then printf "Testing for TAILQ_FOREACH_SAFE ... " cat <_queue.c #include 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 <_queue.c #include 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_FOREACH" ]; then printf "Testing for TAILQ_FOREACH ... " cat <_queue.c #include 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 ]; 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 ">>$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 <_rbtree.c #include 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 "$POLL" ]; then printf "Testing for kqueue1 ... " cat <_kqueue.c #include #include int main(void) { return kqueue1(0); } EOF if $XCC _kqueue.c -o _kqueue 2>&3; then POLL=kqueue1 echo "yes" else echo "no" fi rm -f _kqueue.c _kqueue fi if [ -z "$POLL" ]; then printf "Testing for kqueue ... " cat <_kqueue.c #include #include int main(void) { return kqueue(); } EOF if $XCC _kqueue.c -o _kqueue 2>&3; then POLL=kqueue echo "yes" else echo "no" fi rm -f _kqueue.c _kqueue fi if [ -z "$POLL" ]; then printf "Testing for epoll ... " cat <_epoll.c #ifdef __linux__ #include #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37) #error kernel has buggy epoll_wait timeout #endif #endif #include #include int main(void) { epoll_create1(EPOLL_CLOEXEC); epoll_pwait(-1, NULL, 0, 0, NULL); return 0; } EOF if $XCC _epoll.c -o _epoll 2>&3; then POLL=epoll echo "#define HAVE_EPOLL" >>$CONFIG_MK echo "yes" else echo "no" fi rm -f _epoll.c _epoll fi if [ -z "$POLL" ]; then printf "Testing for pselect ... " cat <_pselect.c #include #include 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 kqueue1) echo "#define HAVE_KQUEUE" >>$CONFIG_H echo "#define HAVE_KQUEUE1" >>$CONFIG_H ;; kqueue) echo "#define HAVE_KQUEUE" >>$CONFIG_H ;; epoll) echo "#define HAVE_EPOLL" >>$CONFIG_H ;; pollts) echo "#define HAVE_POLLTS" >>$CONFIG_H ;; ppoll) echo "#define HAVE_PPOLL" >>$CONFIG_H ;; pselect) echo "#define HAVE_PSELECT" >>$CONFIG_H ;; *) echo "No suitable polling function is available, not even pselect" >&2 exit 1 ;; esac echo echo " SYSCONFDIR = $SYSCONFDIR" echo " SBINDIR = $SBINDIR" echo " RUNDIR = $RUNDIR" echo " MANDIR = $MANDIR" echo rm -f parpd