Update portability notes.
[darkstat] / configure.ac
index ebe3107..11ee1bb 100644 (file)
@@ -1,34 +1,11 @@
-AC_INIT(darkstat, 3.0.0-git)
+# Need at least 2.64 for PACKAGE_URL
+AC_PREREQ([2.64])
+AC_INIT(darkstat, 3.0.0-git, , , https://unix4lyfe.org/darkstat/)
 AC_CONFIG_SRCDIR([darkstat.c])
 AC_CONFIG_HEADER([config.h])
 
 RULE="------------------------------------------------------------"
 
-# Let user specify CHROOT_DIR, or else autodetect it, or else die.
-AC_ARG_WITH(chroot-dir, AS_HELP_STRING([--with-chroot-dir],
- [specify the chroot directory (default: /var/empty)]),
- [if test "x$withval" = "xyes"; then
-   AC_MSG_ERROR([please specify --with-chroot-dir=/path/to/darkstat/chroot])
-  fi
-  _chd="$withval"],
- [# Find an "empty" directory to serve as the chroot.
-  _chd="/var/empty"
-  AC_MSG_CHECKING([for $_chd])
-  if test -d $_chd ; then
-   AC_MSG_RESULT(found it)
-  else
-   AC_MSG_RESULT(not there)
-   _chd="/var/lib/empty"
-   AC_MSG_CHECKING([for $_chd])
-   if test -d $_chd ; then
-    AC_MSG_RESULT(found it)
-   else
-    AC_MSG_RESULT(not there either)
-    AC_MSG_ERROR([please specify --with-chroot-dir=/path/to/darkstat/chroot])
-   fi
-  fi])
-AC_DEFINE_UNQUOTED(CHROOT_DIR, "$_chd", [Default chroot directory.])
-
 # Allow configure-time override of PRIVDROP_USER.
 AC_ARG_WITH(privdrop-user, AS_HELP_STRING([--with-privdrop-user],
  [specify which user to drop privileges to (default: nobody)]),
@@ -40,6 +17,34 @@ AC_DEFINE_UNQUOTED(PRIVDROP_USER, "$_pdu", [User to privdrop to.])
 AC_PROG_INSTALL
 AC_PROG_CC
 
+# Compiler's language features.
+AC_C_RESTRICT
+
+m4_pattern_allow([^AM_DEFAULT_VERBOSITY$])
+AC_ARG_ENABLE([silent-rules],
+[  --enable-silent-rules          less verbose build output (undo: 'make V=1')
+  --disable-silent-rules         verbose build output (undo: 'make V=0')])
+case $enable_silent_rules in
+no)  AM_DEFAULT_VERBOSITY=1;;
+*)   AM_DEFAULT_VERBOSITY=0;;
+esac
+AC_SUBST([AM_DEFAULT_VERBOSITY])
+
+# Let user disable debugging symbols so we create smaller binaries.
+AC_MSG_CHECKING(if we want debug code)
+AC_ARG_ENABLE(debug, AS_HELP_STRING([--disable-debug],
+ [turn off debugging code and asserts]),
+ [if test "x$enableval" = "xno" ; then
+   CFLAGS="$CFLAGS -DNDEBUG -g0"
+   AC_MSG_RESULT(nope)
+  elif test "x$enableval" = "xyes" ; then
+   AC_MSG_RESULT(sure)
+  else
+   CFLAGS="$CFLAGS -g$enableval"
+   AC_MSG_RESULT(sure ($enableval))
+  fi],
+ [AC_MSG_RESULT(sure)])
+
 # Augment CFLAGS for fun.
 echo "int main(void){return 1;}" > conftest.$ac_ext
 
@@ -53,108 +58,39 @@ else
  CFLAGS="$save_cflags"
 fi
 
-AC_ARG_ENABLE(mad-warnings, AS_HELP_STRING([--enable-mad-warnings],
- [turn on lots of compile-time warnings, this needs GCC and is only
- really useful for development]),
+AC_MSG_CHECKING(if your C compiler has a link-time optimizer)
+if test x$GCC = xyes; then
+ save_cflags="$CFLAGS"
+ CFLAGS="-flto $CFLAGS"
+ if (eval $ac_link) 2>/dev/null; then
+  AC_MSG_RESULT(sure does)
+ else
+  AC_MSG_RESULT(no)
+  CFLAGS="$save_cflags"
+ fi
+else
+ AC_MSG_RESULT(skipped)
+fi
+
+AC_ARG_ENABLE(warnings, AS_HELP_STRING([--enable-warnings],
+ [turn on lots of compile-time warnings,
+  these are only useful for development]),
  [if test "x$enableval" = "xyes" ; then
-   AC_MSG_CHECKING(if your C compiler throws mad warnings)
+   AC_MSG_CHECKING(if your C compiler has gcc-like --extra-warnings)
    save_cflags="$CFLAGS"
-   CFLAGS="$CFLAGS -fdiagnostics-show-option \
--Wabi \
--Waddress \
--Waggregate-return \
--Wall \
--Warray-bounds \
--Wbad-function-cast \
--Wcast-align \
--Wcast-qual \
--Wchar-subscripts \
--Wclobbered \
--Wcomment \
--Wcoverage-mismatch \
--Wdeclaration-after-statement \
--Wdisabled-optimization \
--Wempty-body \
--Wextra \
--Wfloat-equal \
--Wformat \
--Wformat=2 \
--Wformat-nonliteral \
--Wformat-security \
--Wformat-y2k \
--Wignored-qualifiers \
--Wimplicit \
--Wimplicit-function-declaration \
--Wimplicit-int \
--Winit-self \
--Winline \
--Winvalid-pch \
--Wlogical-op \
--Wlong-long \
--Wmain \
--Wmissing-braces \
--Wmissing-declarations \
--Wmissing-field-initializers \
--Wmissing-format-attribute \
--Wmissing-include-dirs \
--Wmissing-noreturn \
--Wmissing-parameter-type \
--Wmissing-prototypes \
--Wnested-externs \
--Wnonnull \
--Wold-style-declaration \
--Wold-style-definition \
--Wpacked \
--Wpacked-bitfield-compat \
--Wparentheses \
--Wpointer-arith \
--Wpointer-sign \
--Wredundant-decls \
--Wreturn-type \
--Wsequence-point \
--Wshadow \
--Wsign-compare \
--Wstrict-aliasing -fstrict-aliasing \
--Wstrict-overflow=5 -fstrict-overflow \
--Wstrict-prototypes \
--Wswitch \
--Wswitch-default \
--Wswitch-enum \
--Wsync-nand \
--Wtrigraphs \
--Wtype-limits \
--Wundef \
--Wuninitialized \
--Wunknown-pragmas \
--Wunsafe-loop-optimizations \
--Wunused \
--Wunused-function \
--Wunused-label \
--Wunused-parameter \
--Wunused-value \
--Wunused-variable \
--Wvariadic-macros \
--Wvla \
--Wvolatile-register-var \
--Wwrite-strings \
-"
-
-# the above are valid for gcc version 4.4.3
-# we skip:
-#-pedantic
-#-Wc++-compat
-#-Wconversion
-#-Wfatal-errors
-#-Wpadded
-#-Wsign-conversion
-#-Wstack-protector
-#-Wsystem-headers
-#-Wtraditional
-#-Wtraditional-conversion
-#-Wunreachable-code
+   CFLAGS="$CFLAGS -fdiagnostics-show-option --all-warnings --extra-warnings"
+   if (eval $ac_link) 2>/dev/null; then
+    AC_MSG_RESULT(yes)
+   else
+    AC_MSG_RESULT(no)
+    CFLAGS="$save_cflags"
+   fi
 
+   AC_MSG_CHECKING(if your C compiler has clang-like -Weverything)
+   save_cflags="$CFLAGS"
+   CFLAGS="$CFLAGS -Weverything"
    if (eval $ac_link) 2>/dev/null; then
-    AC_MSG_RESULT(sure does)
+    AC_MSG_RESULT(yes)
    else
     AC_MSG_RESULT(no)
     CFLAGS="$save_cflags"
@@ -173,10 +109,9 @@ $RULE
 I can't link to zlib.  You really can't have a modern
 operating system without zlib.
 
-If you are using a package-based operating system (like
-something with RPMs), see if there is a zlib-devel package
-that you can install, to provide the zlib headers and
-libraries.
+On Debian or a derivative, try: sudo apt-get install zlib1g-dev
+
+On an RPM system, see if there is a zlib-devel package.
 
 $RULE
 END
@@ -186,11 +121,24 @@ END
 
 # Check for Solaris.
 # Must do at least socket and nsl before checking for libpcap.
-AC_CHECK_LIB(nsl, gethostbyname)
-AC_CHECK_LIB(socket, socket)
-AC_CHECK_LIB(resolv, inet_aton)
+AC_SEARCH_LIBS(gethostbyname, [nsl], [],
+  [AC_MSG_ERROR([gethostbyname() not found])])
+AC_SEARCH_LIBS(socket, [socket], [],
+  [AC_MSG_ERROR([socket() not found])])
+AC_SEARCH_LIBS(hstrerror, [resolv], [],
+  [AC_MSG_ERROR([hstrerror() not found])])
+
+# Solaris need sys/filio.h for FIONBIO
+AC_CHECK_HEADERS(sys/filio.h)
+
+# This is the modern way.  Older systems use the ioctl method.
+AC_SEARCH_LIBS(getifaddrs, [c],
+  [AC_CHECK_HEADERS(ifaddrs.h)])
+
 
 
+# Some OSes (Solaris) need sys/sockio.h for SIOCGIFADDR
+AC_CHECK_HEADERS(sys/sockio.h)
 
 # Check for libpcap
 AC_ARG_WITH(pcap, AS_HELP_STRING([--with-pcap=DIR],
@@ -227,33 +175,26 @@ if test -n "$PCAP_BROKEN" ; then
  cat <<END_MSG
 $RULE
 
-darkstat absolutely requires libpcap to be installed.  If
-it's installed into a prefix that isn't being picked up by
+darkstat absolutely requires libpcap to be installed.  On Debian
+systems, apt-get install libpcap-dev.  On RPM systems like RedHat, try
+installing the libpcap-devel package.
+
+If libpcap is installed into a prefix that isn't being picked up by
 configure, for example /usr/local, re-run configure and add
 --with-pcap=/usr/local
 
-If you are using a package-based operating system (like
-something with RPMs), see if there is a pcap-devel or
-libpcap-devel package that you can install, to provide the
-pcap headers and libraries.
-
-Failing all of the above, go to http://www.tcpdump.org/ and
-download the source distribution of libpcap and build it
-yourself.
+Failing all of the above, go to http://www.tcpdump.org/ and download the
+source distribution of libpcap and build it yourself.
 
 $RULE
 END_MSG
  AC_MSG_ERROR([can't find usable libpcap])
 fi
 
-
-
-# A real OS will have setproctitle()
-AC_CHECK_LIB(c, setproctitle,
+# If not in libc, we might find these in libbsd.
+AC_SEARCH_LIBS(setproctitle, [bsd],
  AC_DEFINE(HAVE_SETPROCTITLE, 1,
   [Define to 1 if you have setproctitle().]))
-
-# A real OS will have safe string functions
 AC_SEARCH_LIBS(strlcpy, [bsd],
  AC_DEFINE(HAVE_STRLCPY, 1,
   [Define to 1 if you have strlcpy().]))
@@ -261,18 +202,10 @@ AC_SEARCH_LIBS(strlcat, [bsd],
  AC_DEFINE(HAVE_STRLCAT, 1,
   [Define to 1 if you have strlcat().]))
 
-AC_CHECK_LIB(c, strtonum,
- AC_DEFINE(HAVE_STRTONUM, 1,
-  [Define to 1 if you have strtonum(3).]))
-
-# Some OSes (Solaris) need sys/sockio.h for SIOCGIFADDR
-AC_CHECK_HEADERS(sys/sockio.h)
-
-# Some OSes (Solaris) need sys/filio.h for FIONBIO
-AC_CHECK_HEADERS(sys/filio.h)
+AC_CHECK_HEADERS(bsd/string.h)
+AC_CHECK_HEADERS(bsd/unistd.h)
 
-# GNU/kfreebsd needs net/if_ether.h for ETH_P_IPV6
-AC_CHECK_HEADERS(net/if_ether.h)
+AC_SEARCH_LIBS(clock_gettime, rt)
 
 AC_CONFIG_FILES([Makefile darkstat.8])
 AC_OUTPUT