LIBDHCPCD=no
WITH_GTK=
NOTIFY=yes
+INCLUDEDIR=
for x; do
opt=${x%%=*}
--debug) DEBUG=$var;;
--disable-debug) DEBUG=no;;
--enable-debug) DEBUG=yes;;
- --prefix) PREFIX=$var;;
+ --prefix) prefix=$var;;
--sysconfdir) SYSCONFDIR=$var;;
--bindir) BINDIR=$var;;
--libexecdir) LIBEXECDIR=$var;;
--host) HOST=$var;;
--target) TARGET=$var;;
--libdir) LIBDIR=$var;;
+ --includedir) eval INCLUDEDIR="$INCLUDEDIR${INCLUDEDIR:+ }$var";;
--datadir|--infodir) ;; # ignore autotools
+ --disable-maintainer-mode|--disable-dependency-tracking) ;;
--icondir) ICONDIR=$var;;
--with-gtk|--with-gtk+) WITH_GTK=${var:-yes};;
--without-gtk|--without-gtk+) WITH_GTK=no;;
+ --with-qt) WITH_QT=${var:-yes};;
+ --without-qt) WITH_QT=no;;
--enable-notification) NOTIFY=yes;;
--disable-notification) NOTIFY=no;;
--help) echo "See the README file for available options"; exit 0;;
: ${INSTALL:=install}
: ${SED:=sed}
-: ${PREFIX:=/usr/local}
+: ${PREFIX:=${prefix:=/usr/local}}
: ${SYSCONFDIR:=$PREFIX/etc}
: ${BINDIR:=$PREFIX/bin}
: ${LIBEXECDIR:=$PREFIX/libexec}
: ${ICONDIR:=$PREFIX/share/dhcpcd/icons}
+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)"
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
+ # autoconf target triplet: cpu-vendor-os
+ BUILD=$(uname -m)-unknown-$(uname -s | tr '[:upper:]' '[:lower:]')
fi
+: ${HOST:=$BUILD}
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%%-*}
+ 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
+ # Special case
+ case "$OS" in
+ gnu*) OS=hurd;; # No HURD support as yet
+ esac
fi
-echo "Configuring dhcpcd-ui for ... $OS"
+echo "Configuring dhcpcd for ... $OS"
rm -f $CONFIG_H $CONFIG_MK
echo "# $OS" >$CONFIG_MK
echo "/* $OS */" >$CONFIG_H
[ $l -gt 2 ] && t=" "
echo "#define $x$t \"$v\"" >>$CONFIG_H
done
+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
+# Always obey CC.
+# However, if CC is not specified and we are given GNU style
+# --host or --build targets the expectation is we try and match that
+# to a compiler.
+if [ -n "$CC" ]; then
+ HOSTCC=
else
- echo "Using compiler $CC"
+ CC=cc
+ _COMPILERS="cc clang gcc pcc icc"
+fi
+if [ -n "$HOSTCC" ]; 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
-echo "CC= $CC" >>$CONFIG_MK
-if [ -z "$CFLAGS" ]; then
- CFLAGS="-O2"
+echo "Using compiler .. $CC"
+cat <<EOF >_test.c
+int main(void) {
+ return 0;
+}
+EOF
+_CC=false
+if $CC _test.c -o _test >/dev/null 2>&1; then
+ [ -x _test ] && _CC=true
fi
-echo "CFLAGS= $CFLAGS" >>$CONFIG_MK
-if [ -n "$CPPLAGS" ]; then
- echo "CPPLAGS= $CPPLAGS" >>$CONFIG_MK
+rm -f _test.c _test
+if ! $_CC; then
+ echo "$CC does not create executables"
+ exit 1
+fi
+[ "$CC" != cc ] && echo "CC= $CC" >>$CONFIG_MK
+$CC --version | $SED -e '1!d'
+
+# 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 "$LDFLAGS" ]; then
+ echo "LDFLAGS=" >>$CONFIG_MK
+ echo "LDFLAGS+= $LDFLAGS" >>$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 ... "
+for x in $INCLUDEDIR; do
+ echo "CPPFLAGS+= -I$x" >>$CONFIG_MK
+done
+
+if [ -z "$DEBUG" -a -f .fslckout ]; then
+ printf "Found fossil checkout ... "
DEBUG=yes
- echo "LDADD+= -Wl,-rpath=../libdhcpcd" >>$CONFIG_MK
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+= -g -Wall -Wextra -Wshadow -Wformat=2
CFLAGS+= -Wmissing-prototypes -Wmissing-declarations
CFLAGS+= -Wmissing-noreturn -Wmissing-format-attribute
-CFLAGS+= -Wredundant-decls -Wnested-externs
+CFLAGS+= -Wnested-externs
CFLAGS+= -Winline -Wwrite-strings -Wcast-align -Wcast-qual
-CFLAGS+= -Wpointer-arith
-CFLAGS+= -Wdeclaration-after-statement -Wsequence-point
-CFLAGS+= -fno-common
+CFLAGS+= -Wpointer-arith -Wstrict-overflow
+CFLAGS+= -Wdeclaration-after-statement
+CFLAGS+= -Wconversion
EOF
+ case "$OS" in
+ mirbsd*|openbsd*);; # OpenBSD has many redundant decs in system headers
+ *) echo "CFLAGS+= -Wredundant-decls" >>$CONFIG_MK;;
+ esac
+else
+ # Disable assertations
+ echo "CFLAGS+= -DNDEBUG" >>$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`"
+if [ -z "$GETTEXT" ]; then
+ printf "Testing for gettext ... "
+ cat <<EOF >_gettext.c
+#include <libintl.h>
+int main(void) {
+ gettext("foo");
+ return 0;
+}
+EOF
+ LIB_INTL=
+ if $XCC _gettext.c -o _gettext 2>/dev/null; then
+ GETTEXT=yes
+ elif $XCC _gettext.c -o _gettext -lintl 2>/dev/null; then
+ GETTEXT="yes (-lintl)"
+ LIB_INTL=-lintl
+ else
+ GETTEXT=no
+ fi
+ echo "$GETTEXT"
+ rm -f _gettext.c _gettext
+fi
+if [ "$GETTEXT" != no ]; then
+ echo "#define HAS_GETTEXT" >>$CONFIG_H
+ echo "LIB_INTL= $LIB_INTL" >>$CONFIG_MK
+fi
+
if [ -z "$STRLCPY" ]; then
printf "Testing for strlcpy ... "
cat <<EOF >_strlcpy.c
rm -f _strlcpy.c _strlcpy
fi
if [ "$STRLCPY" = no ]; then
- echo "#define strlcpy(dst, src, n) snprintf(dst, n, \"%s\", src)" \
- >>$CONFIG_H
+ echo "#define strlcpy(dst, src, n) " \
+ "((size_t)snprintf(dst, n, \"%s\", src))" \
+ >>$CONFIG_H
fi
if [ -z "$LIBDIR" ]; then
fi
echo "LIB_DHCPCD= $x" >>$CONFIG_MK
-# Get DBus CFLAGS
-DBUS_CFLAGS=$(pkg-config --cflags dbus-1) || exit 1
-DBUS_LIBS=$(pkg-config --libs dbus-1) || exit 1
-echo "DBus CFLAGS=$DBUS_CFLAGS"
-echo "DBus LIBS=$DBUS_LIBS"
-echo "DBUS_CFLAGS= $DBUS_CFLAGS" >>$CONFIG_MK
-echo "DBUS_LIBS= $DBUS_LIBS" >>$CONFIG_MK
+# Due to our use of pkg-config, pass --as-needed to ld so we only link
+# what we actually need.
+echo "LDADD+= -Wl,--as-needed" >>$CONFIG_MK
UI=
if [ "$WITH_GTK" = yes -o -z "$WITH_GTK" ]; then
- PKG="dbus-1 gtk+-2.0"
+ if pkg-config --cflags gtk+-2.0 >/dev/null 2>&1; then
+ WITH_GTK="gtk+-2.0"
+ elif pkg-config --cflags gtk+-3.0 >/dev/null 2>&1; then
+ WITH_GTK="gtk+-3.0"
+ fi
+elif [ -n "$WITH_GTK" -a "$WITH_GTK" != no ]; then
+ if ! pkg-config --cflags $WITH_GTK >/dev/null; then
+ echo "$0: no suitable GTK+ library has been found" >&2
+ exit 1
+ fi
+fi
+
+if [ -n "$WITH_GTK" -a "$WITH_GTK" != no ]; then
+ PKG="$WITH_GTK"
if [ "$NOTIFY" = yes ]; then
PKG="$PKG${PKG:+ }libnotify"
echo "NOTIFY= -DNOTIFY" >>$CONFIG_MK
UI="$UI${UI:+ }dhcpcd-gtk"
fi
+DHCPCD_QT=false
+if [ "WITH_QT" = yes -o -z "$WITH_QT" ]; then
+ if type qmake >/dev/null 2>&1; then
+ UI="$UI${UI+ }dhcpcd-qt"
+ DHCPCD_QT=true
+ fi
+elif [ -n "$WITH_QT" -a "$WITH_QT" != no ]; then
+ if type qmake >/dev/null 2>&1; then
+ UI="$UI${UI+ }dhcpcd-qt"
+ DHCPCD_QT=true
+ else
+ echo "$0: no suitable QT library has been found" >&2
+ exit 1
+ fi
+fi
+
if [ -z "$UI" ]; then
- echo "no UI is available, not building." >&2
+ echo "$0: no UI is available, not building." >&2
exit 1
fi
echo "UI= $UI" >>config.mk
echo " BINDIR = $BINDIR"
echo " LIBDIR = $LIBDIR"
echo " ICONDIR = $ICONDIR"
+echo " MANDIR = $MANDIR"
echo " UI = $UI"
echo
echo "MKDIR= \${TOPDIR}/mk" >>$CONFIG_MK
+
+if $DHCPCD_QT; then
+ if ! (cd src/dhcpcd-qt; qmake dhcpcd-qt.pro); then
+ echo "$0: failed to configure dhcpcd-qt" >&2
+ exit 1
+ fi
+fi