blob: 951088b624fe86bae474567ed5a484f9b0994893 [file] [log] [blame]
#!/bin/sh
# Try and be like autotools configure, but without autotools
ARC4RANDOM=
CLOSEFROM=
GETLINE=
STRLCPY=
for x; do
opt=${x%%=*}
var=${x#*=}
case "$opt" in
--os|OS) OS=$var;;
--with-cc|CC) CC=$var;;
--debug) DEBUG=$var;;
--disable-debug) DEBUG=no;;
--enable-debug) DEBUG=yes;;
--fork) FORK=$var;;
--disable-fork) FORK=no;;
--enable-fork) FORK=yes;;
--prefix) PREFIX=$var;;
--sysconfdir) SYSCONFDIR=$var;;
--bindir|--sbindir) SBINDIR=$var;;
--libexecdir) LIBEXECDIR=$var;;
--statedir|--localstatedir) STATEDIR=$var;;
--dbdir) DBDIR=$var;;
--rundir) RUNDIR=$var;;
--mandir) MANDIR=$var;;
--with-ccopts|CFLAGS) CFLAGS=$var;;
CPPFLAGS) CPPFLAGS=$var;;
--build) BUILD=$var;;
--host) HOST=$var;;
--target) TARGET=$var;;
--libdir) LIBDIR=$var;;
--without-arc4random) ARC4RANDOM=no;;
--without-closefrom) CLOSEFROM=no;;
--without-getline) GETLINE=no;;
--without-strlcpy) STRLCPY=no;;
--datadir|--infodir) ;; # ignore autotools
--help) echo "See the README file for available options"; exit 0;;
*) echo "$0: WARNING: unknown option $opt" >&2;;
esac
done
: ${SED:=sed}
: ${FORK:=yes}
: ${PREFIX:=}
: ${SYSCONFDIR:=$PREFIX/etc}
: ${SBINDIR:=$PREFIX/sbin}
: ${LIBDIR:=$PREFIX/lib}
: ${LIBEXECDIR:=$PREFIX/libexec}
: ${STATEDIR:=/var}
: ${DBDIR:=$STATEDIR/db}
: ${RUNDIR:=$STATEDIR/run}
: ${MANDIR:=${PREFIX:-/usr}/share/man}
_which()
{
x="$(which "$1" 2>/dev/null)"
if [ -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
BUILD=`uname -m`-unknown-`uname -s | tr '[:upper:]' '[:lower:]'`
fi
if [ -z "$HOST" ]; then
[ -z "$TARGET" ] && TARGET=$BUILD
HOST=$TARGET
fi
if [ -z "$TARGET" ]; then
[ -z "$HOST" ] && HOST=$BUILD
TARGET=$HOST
fi
if [ -z "$OS" ]; then
# Derive OS from cpu-manufacturer-os-kernel
CPU=${TARGET%%-*}
REST=${TARGET#*-}
MANU=${REST%%-*}
REST=${REST#*-}
OS=${REST%%-*}
REST=${REST#*-}
KERNEL=${REST%%-*}
fi
echo "Configuring dhcpcd for ... $OS"
rm -f $CONFIG_H $CONFIG_MK
echo "# $OS" >$CONFIG_MK
echo "/* $OS */" >$CONFIG_H
for x in SYSCONFDIR SBINDIR 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 "LIBDIR= $LIBDIR" >>$CONFIG_MK
echo "MANDIR= $MANDIR" >>$CONFIG_MK
if [ -z "$CC" ]; then
printf "Looking for compiler ... "
for b in $TARGET- ""; do
for cc in gcc pcc icc cc; do
if type $b$cc >/dev/null 2>&1; then
CC=$b$cc
echo "$CC"
break
fi
done
[ -n "$CC" ] && break
done
if [ -z "$CC" ]; then
echo
echo "no suitable compiler found - aborting" >&2
exit 1
fi
else
echo "Using compiler $CC"
fi
echo "CC= $CC" >>$CONFIG_MK
if [ -n "$CFLAGS" ]; then
echo "CFLAGS= $CFLAGS" >>$CONFIG_MK
fi
if [ -n "$CPPLAGS" ]; then
echo "CPPLAGS= $CPPLAGS" >>$CONFIG_MK
fi
if [ -n "$DEBUG" -a "$DEBUG" != no -a "$DEBUG" != false ]; then
echo "Enabling memory debugging"
echo "CPPFLAGS+= -DDEBUG_MEMORY" >>$CONFIG_MK
elif [ -z "$DEBUG" -a -d .git ]; then
printf "Found git ... "
DEBUG=yes
else
DEBUG=no
fi
if [ "$DEBUG" != no -a "$DEBUG" != false ]; then
echo "Adding debugging CFLAGS"
cat <<EOF >>$CONFIG_MK
CFLAGS+= -Wall -Wextra -Wimplicit -Wshadow -Wformat=2
CFLAGS+= -Wmissing-prototypes -Wmissing-declarations
CFLAGS+= -Wmissing-noreturn -Wmissing-format-attribute
CFLAGS+= -Wredundant-decls -Wnested-externs
CFLAGS+= -Winline -Wwrite-strings -Wcast-align -Wcast-qual
CFLAGS+= -Wpointer-arith
CFLAGS+= -Wdeclaration-after-statement -Wsequence-point
CFLAGS+= -fno-common
EOF
fi
if [ -n "$FORK" -a "$FORK" != yes -a "$FORK" != true ]; then
echo "There is no fork"
echo "CPPFLAGS+= -DTHERE_IS_NO_FORK" >>$CONFIG_MK
fi
case "$OS" in
linux)
echo "CPPFLAGS+= -D_BSD_SOURCE -D_XOPEN_SOURCE=600" >>$CONFIG_MK
echo "SRCS+= if-linux.c if-linux-wireless.c lpf.c" >>$CONFIG_MK
echo "LDADD+= -lrt" >>$CONFIG_MK
;;
*)
echo "SRCS+= bpf.c if-bsd.c" >>$CONFIG_MK
;;
esac
# 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
fi
# Add CPPFLAGS and CFLAGS to CC for testing features
XCC="$CC `$SED -n -e 's/CPPLAGS+=*\(.*\)/\1/p' $CONFIG_MK`"
XCC="$XCC `$SED -n -e 's/CFLAGS+=*\(.*\)/\1/p' $CONFIG_MK`"
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
if $XCC _getifaddrs.c -o _getifaddrs 2>/dev/null; then
echo "yes"
else
echo "no"
echo "libc support for getifaddrs is required - aborting" >&2
abort=true
fi
rm -f _getifaddrs.c _getifaddrs
$abort && exit 1
if [ -z "$ARC4RANDOM" ]; then
printf "Testing for arc4random ... "
cat <<EOF >_arc4random.c
#include <stdlib.h>
int main(void) {
uint32_t r = arc4random();
return 0;
}
EOF
if $XCC _arc4random.c -o _arc4random 2>/dev/null; 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 "$CLOSEFROM" ]; then
printf "Testing for closefrom ... "
cat <<EOF >_closefrom.c
#include <unistd.h>
int main(void) {
int r = closefrom(3);
return 0;
}
EOF
if $XCC _closefrom.c -o _closefrom 2>/dev/null; then
CLOSEFROM=yes
else
CLOSEFROM=no
fi
echo "$CLOSEFROM"
rm -f _closefrom.c _closefrom
fi
if [ "$CLOSEFROM" = no ]; then
echo "COMPAT_SRCS+= compat/closefrom.c" >>$CONFIG_MK
echo "#include \"compat/closefrom.h\"" >>$CONFIG_H
fi
if [ -z "$GETLINE" ]; then
printf "Testing for getline ... "
cat <<EOF >_getline.c
#define _GNU_SOURCE
#include <stdio.h>
int main(void) {
char *buf = NULL;
size_t n = 0;
getline(&buf, &n, stdin);
return 0;
}
EOF
if $XCC _getline.c -o _getline 2>/dev/null; then
GETLINE=yes
else
GETLINE=no
fi
echo "$GETLINE"
rm -f _getline.c _getline
fi
if [ "$GETLINE" = no ]; then
echo "COMPAT_SRCS+= compat/getline.c" >>$CONFIG_MK
echo "#include \"compat/getline.h\"" >>$CONFIG_H
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>/dev/null; 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
echo
echo " SYSCONFDIR = $SYSCONFDIR"
echo " SBINDIR = $SBINDIR"
echo " LIBDIR = $LIBDIR"
echo " LIBEXECDIR = $LIBEXECDIR"
echo " DBDIR = $DBDIR"
echo " RUNDIR = $RUNDIR"
echo " MANDIR = $MANDIR"
echo