view configure @ 1693:829716214dbc draft dhcpcd-5.6.0

Improve IPv6 RA support by allowing dhcpcd to manage the address and routes instead of the kernel. dhcpcd will only do this if RA is disabled in the kernel or dhcpcd has been instructed to do this via dhcpcd.conf(5) ipv6ra_own and ipv6ra_own_default directives. Send and process IPv6 Neighbor Solicitions and Adverts to prove router reachability. If a router cannot be reached in this way then it is expired. When debugging, all ND messages are displayed which will create a lot of log spam. To ease packaging, ./configure now accepts LDFLAGS and --enable-static.
author Roy Marples <roy@marples.name>
date Thu, 05 Jul 2012 16:37:41 +0000
parents a904c07953a1
children b951e206ffaa be926d3e5a29
line wrap: on
line source

#!/bin/sh
# Try and be like autotools configure, but without autotools

# Ensure that we do not inherit these from env
HOOKSET=false
ARC4RANDOM=
CLOSEFROM=
GETLINE=
STRLCPY=
OS=
BUILD=
HOST=
TARGET=
DEBUG=
FORK=
STATIC=
INCLUDEDIR=

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;;
	--disable-static) STATIC=no;;
	--enable-static) STATIC=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;;
	--with-hook) HOOKSCRIPTS="$HOOKSCRIPTS${HOOKSCRIPTS:+ }$var";;
	--with-hooks|HOOKSCRIPTS) HOOKSCRIPTS=$var; HOOKSET=true;;
	--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;;
	--serviceexists) SERVICEEXISTS=$var;;
	--servicecmd) SERVICECMD=$var;;
	--servicestatus) SERVICESTATUS=$var;;
	--includedir) eval INCLUDEDIR="$INCLUDEDIR${INCLUDEDIR:+ }$var";;
	--datadir|--infodir) ;; # ignore autotools
	--disable-maintainer-mode|--disable-dependency-tracking) ;;
	--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:=$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}

eval SYSCONFDIR="$SYSCONFDIR"
eval LIBDIR="$LIBDIR"
eval LIBEXECDIR="$LIBEXECDIR"
eval STATEDIR="$STATEDIR"
eval DBDIR="$DBDIR"
eval RUNDIR="$RUNDIR"
eval MANDIR="$MANDIR"

_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`-`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

# Debian and Slackware have linux in different places when dealing with
# autoconf, so we deal with that here.
if [ -z "$OS" ]; then
	case "$TARGET" in
	*-linux-*|linux-*|*-linux|linux) OS=linux;;
	esac
fi

if [ -z "$OS" ]; then
	# Derive OS from cpu-manufacturer-os-kernel
	CPU=${TARGET%%-*}
	REST=${TARGET#*-}
	if [ "$CPU" != "$REST" ]; then
		MANU=${REST%%-*}
		REST=${REST#*-}
		if [ "$MANU" != "$REST" ]; then
			OS=${REST%%-*}
			REST=${REST#*-}
			if [ "$OS" != "$REST" ]; then
				KERNEL=${REST%%-*}
			else
				# 3 tupple
				KERNEL=$OS
				OS=$MANU
				MANU=
			fi
		else
			# 2 tupple
			OS=$MANU
			MANU=
		fi
	fi
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 clang 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
$CC --version | $SED -e '1!d'
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 "$LDFLAGS" ]; then
	echo "LDFLAGS=		$LDFLAGS" >>$CONFIG_MK
fi
if [ "$STATIC" = yes ]; then
	echo "LDFLAGS+=	-static" >>$CONFIG_MK
fi
for x in $INCLUDEDIR; do
	echo "CPPFLAGS+=	-I$x" >>$CONFIG_MK
done

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 "SRCS+=		platform-linux.c" >>$CONFIG_MK
	echo "LDADD+=		-lrt" >>$CONFIG_MK
	;;
kfreebsd)
	echo "CPPFLAGS+=	-D_GNU_SOURCE" >>$CONFIG_MK
	echo "SRCS+=		bpf.c if-bsd.c platform-bsd.c" >>$CONFIG_MK
	echo "COMPAT_SRCS+=	compat/linkaddr.c" >>$CONFIG_MK
	echo "LDADD+=		-lrt" >>$CONFIG_MK
	;;
*)
	echo "SRCS+=		bpf.c if-bsd.c platform-bsd.c" >>$CONFIG_MK
	;;
esac

# 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

# 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) {
	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) {
	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

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>/dev/null; then
		TAILQ_FOREACH_SAFE=yes
	else
		TAILQ_FOREACH_SAFE=no
	fi
	echo "$TAILQ_FOREACH_SAFE"
	rm -f _queue.c _queue
fi
if [ "$TAILQ_FOREACH_SAFE" = no ]; then
	cat <<EOF >>$CONFIG_H
#define	TAILQ_FOREACH_SAFE(var, head, field, next)			\
	for ((var) = TAILQ_FIRST((head));				\
	    (var) && ((next) = TAILQ_NEXT((var), field), 1);		\
	    (var) = (next))
EOF
fi

if [ -z "$SERVICECMD" ]; then
	printf "Checking for OpenRC ... "
	if [ -x /sbin/rc-service ]; then
		SERVICEEXISTS="/sbin/rc-service -e \$1"
		SERVICECMD="/sbin/rc-service \$1 -- -D \$2"
		echo "yes"
	else
		echo "no"
	fi
fi
if [ -z "$SERVICECMD" ]; then
	printf "Checking for invoke-rc.d ... "
	if [ -x /usr/sbin/invoke-rc.d ]; then
		SERVICEEXISTS="/usr/sbin/invoke-rc.d --query --quiet \$1 start >/dev/null 2>&1 || [ \$? = 104 ]"
		SERVICECMD="/usr/sbin/invoke-rc.d \$1 \$2"
		echo "yes"
	else
		echo "no"
	fi
fi
if [ -z "$SERVICECMD" ]; then
	printf "Checking for service ... "
	if [ -x /sbin/service ]; then
		SERVICEEXISTS="/sbin/service \$1 >/dev/null 2>&1"
		SERVICECMD="/sbin/service \$1 \$2"
		echo "yes"
	else
		echo "no"
	fi
fi
if [ -z "$SERVICECMD" ]; then
	for x in /etc/init.d/rc.d /etc/rc.d /etc/init.d; do
		printf "Checking for $x ... "
		if [ -d $x ]; then
			SERVICEEXISTS="[ -x $x/\$1 ]"
			SERVICECMD="$x/\$1 \$2"
			echo "yes"
			break
		else
			echo "no"
		fi
	done
fi
if [ -e /etc/arch-release ]; then
	echo "Overriding service status check for Arch Linux"
	SERVICESTATUS="[ -e /var/run/daemons/\$1 ]"
fi

if [ -z "$SERVICEEXISTS" -o -z "$SERVICECMD" ]; then
	echo "$0: WARNING: No means of interacting with system services detected!"
	SERVICEEXISTS="return 1"
	SERVICECMD="return 1"
fi
if [ -z "$SERVICESTATUS" ]; then
	SERVICESTATUS="service_command \$1 status >/dev/null 2>&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

HOOKS=
if ! $HOOKSET; then
	printf "Checking for ntpd ... "
	NTPD=$(_which ntpd)
	if [ -n "$NTPD" ]; then
		echo "$NTPD (50-ntp.conf)"
		HOOKS="$HOOKS${HOOKS:+ }50-ntp.conf"
	else
		echo "not found"
	fi

	printf "Checking for ypind ... "
	YPBIND=$(_which ypbind)
	if [ -n "$YPBIND" ]; then
		if strings "$YPBIND" | grep -q yp.conf; then
			YPHOOK="50-yp.conf"
		else
			YPHOOK="50-ypbind"
		fi
		echo "$YPBIND ($YPHOOK)"
		HOOKS="$HOOKS${HOOKS:+ }$YPHOOK"
	else
		echo "not found"
	fi
fi

cd dhcpcd-hooks
for x in $HOOKSCRIPTS; do
	printf "Finding hook $x ... "
	for h in [0-9][0-9]"-$x" [0-9][0-9]"-$x.sh" [0-9][0-9]"-$x.conf"; do
		[ -e "$h" ] && break
	done
	if [ ! -e "$h" ]; then
		echo "no"
	else
		echo "$h"
		case " $HOOKS " in
		*" $h "*)	;;
		*)		HOOKS="$HOOKS${HOOKS:+ }$h";;
		esac
	fi
done
cd ..
echo "HOOKSCRIPTS=	$HOOKS" >>$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 "   HOOKSCRIPTS =	$HOOKS"
echo