123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464 |
- dnl
- dnl configure.ac:
- dnl Autoconf input for iftop.
- dnl
- dnl I hate autoconf with a passion. It's an utter pain to write these bloody
- dnl things and even once you have you find yourself testing for more and more
- dnl special cases. But that's OK. Paul is going to maintain it :)
- dnl -- Chris Lightfoot
- dnl
- dnl $Id: configure.ac,v 1.2 2014/01/19 20:28:31 pdw Exp $
- dnl
- dnl To regenerate everything from source, do:
- dnl autoheader
- dnl aclocal
- dnl automake
- dnl autoconf
- dnl Now you should have good sources to make into a tarball and distribute.
- dnl ./configure (perhaps with some arguments)
- dnl make
- dnl Tested with automake 1.9.6-1.14 and autoconf 2.59-2.69.
- dnl
- dnl Boilerplate configuration
- dnl
- AC_INIT([iftop], [1.0pre4], [pdw@ex-parrot.com], [iftop], [http://www.ex-parrot.com/pdw/iftop/])
- AC_CONFIG_AUX_DIR(config)
- AC_CANONICAL_SYSTEM
- AC_CONFIG_HEADERS([config.h])
- AM_INIT_AUTOMAKE
- dnl Make sure we have a C compiler....
- AC_PROG_CC
- AC_HEADER_STDC
- dnl
- dnl Options to configure.
- dnl
- AC_ARG_WITH(resolver,
- [ --with-resolver=TYPE Technique iftop should use for name resolution.
- Valid options are:
- netdb use gethostbyaddr_r in multiple
- threads.
- netdb_1thread use gethostbyaddr_r and
- assume it is not reentrant.
- ares use the MIT ARES asynchronous
- resolver library.
- forking use the REALLY SUCKY forking resolver.
- guess run experiments to guess a
- reasonable value. Only works if you
- aren't cross-compiling. This
- is the default. guess will
- either select netdb or netdb_1thread.
- none don't do name resolution.],
- [resolver=$withval],
- [resolver=guess])
- AC_ARG_WITH(libpcap,
- [ --with-libpcap=WHERE Where the libpcap packet-capture library is found.
- The pcap library should be installed in WHERE/lib,
- and the header file in either WHERE/include or
- WHERE/include/pcap.
- [default=look in standard locations]],
- [libpcap_prefix=$withval],
- [libpcap_prefix=""])
- dnl
- dnl Fairly generic checks.
- dnl
- dnl Checks for system headers.
- AC_CHECK_HEADERS([sgtty.h sys/ioctl.h sys/time.h sys/sockio.h termio.h termios.h unistd.h])
- dnl Checks for typedefs, structures, and compiler characteristics.
- AC_C_CONST
- AC_TYPE_SIZE_T
- AC_HEADER_TIME
- dnl
- dnl Are we on a system that uses the STREAMS low-level DLPI interface?
- dnl
- AC_CHECK_HEADER([sys/dlpi.h],[AC_DEFINE([HAVE_DLPI],1,[Are we running on a STREAMS system with DLPI?])])
- dnl Checks for library functions.
- AC_CHECK_FUNCS(regcomp select strdup strerror strspn)
- AC_SEARCH_LIBS(socket, socket)
- AC_SEARCH_LIBS(log, m)
- AC_CHECK_FUNC(gethostbyname, ,
- [AC_CHECK_LIB(nsl, gethostbyname)] )
- AC_SEARCH_LIBS(inet_aton, [socket nsl])
- AC_SEARCH_LIBS(inet_pton, [socket nsl])
- AC_CHECK_FUNCS(inet_aton inet_pton)
- dnl
- dnl Find integers of known physical size. This is a pain in the arse because
- dnl we can't use AC_CHECK_SIZEOF to find the original variables, since that
- dnl function doesn't permit us to include a header file. Sigh.
- dnl
- for type in u_int8_t u_int16_t u_int32_t ; do
- AC_MSG_CHECKING([size of $type])
- AC_RUN_IFELSE([AC_LANG_SOURCE([
- #include <sys/types.h>
- #include <stdio.h>
- int main() {
- $type dummy;
- FILE *f=fopen("conftestval", "w");
- if (!f) exit(1);
- fprintf(f, "%d\n", sizeof($1));
- exit(0);
- }
- ])], [
- x=`cat conftestval`
- eval "size_$type=$x"
- AC_MSG_RESULT([$x])
- ], [
- eval "size_$type=0"
- AC_MSG_RESULT([unknown type])
- ], [
- eval "size_$type=0"
- AC_MSG_RESULT([can't determine when cross-compiling])
- ])
- done
- dnl Groan. Have to do things this way so that autoheader can do its thing....
- AC_DEFINE_UNQUOTED(SIZEOF_U_INT8_T, [$size_u_int8_t], [size of u_int8_t])
- AC_DEFINE_UNQUOTED(SIZEOF_U_INT16_T, [$size_u_int16_t], [size of u_int16_t])
- AC_DEFINE_UNQUOTED(SIZEOF_U_INT32_T, [$size_u_int32_t], [size of u_int32_t])
- dnl If we already have these types, don't piss about any more....
- if test $size_u_int8_t != 1 || test $size_u_int16_t != 2 || test $size_u_int32_t != 4 ; then
- dnl XXXif test $size_u_int8_t != 1 -o $size_u_int16_t != 2 -o $size_u_int32_t != 4 ; then
- do_int_types=1
- AC_CHECK_HEADERS(
- stdint.h dnl C99
- sys/inttypes.h, dnl Solaris
- [do_int_types=0; break])
- if test $do_int_types = 1 ; then
- dnl No C99 int types, so figure them out from basic types.
- AC_CHECK_SIZEOF(unsigned short int)
- AC_CHECK_SIZEOF(unsigned int)
- AC_CHECK_SIZEOF(unsigned long int)
- else
- dnl Just use the C99 ones.
- AC_DEFINE(HAVE_C99_INTS, 1, [C99 fixed-width int types available])
- fi
- fi
- dnl
- dnl Name resolution.
- dnl
- dnl This is complicated because we need some sort of reentrant mechanism for
- dnl name resolution. Naturally, UNIX vendors have come up with a variety of
- dnl incompatible schemes for this, many of which don't work at all.
- dnl
- dnl First, the default resolver, which uses getnameinfo or gethostbyaddr_r. If
- dnl not available, we fall back to gethostbyaddr. We could fall back to ARES,
- dnl but that's probably not available on typical machines.
- dnl If we've been asked to guess, remember that fact in specified_resolver.
- dnl From this point on, resolver is our preferred resolver given the
- dnl experiments we've done so far, or "guess" if we have no idea.
- specified_resolver=$resolver
- if test x$specified_resolver = xguess ; then
- dnl Best possibility is getnameinfo.
- use_getnameinfo=0
- AC_SEARCH_LIBS(getnameinfo, [nsl], [use_getnameinfo=1])
- dnl XXX For the moment, don't use getnameinfo, since it isn't actually
- dnl thread safe on, e.g., NetBSD.
- use_getnameinfo=0
- if test $use_getnameinfo = 1 ; then
- dnl Done.
- AC_DEFINE(USE_GETNAMEINFO, 1, [use getnameinfo for name resolution])
- else
- dnl Best hope is netdb, which presently means gethostbyaddr_r.
- resolver=netdb
- fi
- fi
- if test x$resolver = xnetdb ; then
- dnl Can use gethostbyaddr_r?
- AC_SEARCH_LIBS(gethostbyaddr_r, [nsl], , [resolver=guess])
- if test x$resolver = xguess && test x$specified_resolver != xguess ; then
- dnl They wanted gethostbyaddr_r, but they can't have it, so stop.
- AC_MSG_ERROR([no library defines gethostbyaddr_r])
- fi
- fi
- dnl We still might do gethostbyaddr_r. Figure out whether we have
- dnl glibc-style or Solaris-style gethostbyaddr_r (or neither...).
- dnl Separate determining how to call gethostbyaddr_r from testing
- dnl whether it works so we can support cross-compilation.
- if test x$resolver = xnetdb ; then
- AC_MSG_CHECKING([how to call gethostbyaddr_r])
- dnl Try 7 arguments returning a struct hostent*.
- AC_LINK_IFELSE([AC_LANG_SOURCE([`cat config/hostentp_ghba_r.c`])],
- [AC_MSG_RESULT([7 args])
- ghba_args=8
- AC_DEFINE(GETHOSTBYADDR_R_RETURNS_HOSTENT_P, 1,
- [7-argument gethostbyaddr_r returns struct hostent*])], [
- dnl Try 8 arguments returning an int.
- AC_LINK_IFELSE([AC_LANG_SOURCE([`cat config/int_ghba_r.c`])],
- [AC_MSG_RESULT([8 args, int return])
- ghba_args=8
- AC_DEFINE(GETHOSTBYADDR_R_RETURNS_INT, 1,
- [8-argument gethostbyaddr_r returns int])], [
- dnl Neither.
- AC_MSG_RESULT([don't know how])
- resolver=guess])])
- if test x$resolver = xguess && test x$specified_resolver != xguess ; then
- dnl They wanted gethostbyaddr_r, but they can't have it, so stop.
- AC_MSG_ERROR([gethostbyaddr_r has no known calling convention])
- fi
- fi
- dnl If we still want to do gethostbyaddr_r, and we aren't
- dnl cross-compiling, test it.
- if test x$resolver = xnetdb ; then
- if test x$ghba_args = x8 ; then
- testfile=int_ghba_r
- else
- testfile=hostentp_ghba_r
- fi
- AC_MSG_CHECKING(gethostbyaddr_r usability)
- AC_RUN_IFELSE([AC_LANG_SOURCE([`cat config/$testfile.c`])],
- [AC_MSG_RESULT([yes])],
- [AC_MSG_RESULT([no])
- resolver=guess],
- [AC_MSG_RESULT([can't test because we are cross-compiling])])
- if test x$resolver = xguess ; then
- if test x$specified_resolver = xguess ; then
- AC_MSG_RESULT([gethostbyaddr_r doesn't work, so we'll try something else])
- else
- dnl They wanted gethostbyaddr_r, but it doesn't work, so stop.
- AC_MSG_ERROR([gethostbyaddr_r doesn't work])
- fi
- fi
- fi
- dnl We found a gethostbyaddr_r we know how to use and which seems to
- dnl work.
- if test x$resolver = xnetdb ; then
- AC_DEFINE(USE_GETHOSTBYADDR_R, 1, [use gethostbyaddr_r for name resolution])
- fi
- dnl They may have asked for ares.
- if test x$resolver = xares ; then
- dnl See if ares is to hand....
- AC_SEARCH_LIBS(ares_init, [ares], [
- AC_DEFINE(USE_ARES, 1, [use ARES for name resolution])
- ], [
- dnl They asked for ares, but we can't give it to them, so stop.
- AC_MSG_ERROR([can't find ARES. Re-run configure and ask for a different resolver.])])
- fi
- dnl Last thing to try if we haven't decided yet is netdb_1thread.
- if test x$resolver = xguess ; then
- resolver=netdb_1thread
- fi
- dnl Ugh. Both the single-threaded and the forking resolvers use gethostbyaddr.
- if test x$resolver = xnetdb_1thread || test x$resolver = xforking ; then
- AC_SEARCH_LIBS(gethostbyaddr, [nsl], , [
- AC_MSG_ERROR([gethostbyaddr is not available. You will have to
- recompile with no name resolution at all.])])
- if test x$resolver = xnetdb_1thread ; then
- AC_MSG_WARN([using single-threaded resolver with gethostbyaddr
- Consider obtaining ARES or a machine with a working gethostbyaddr_r.])
- AC_DEFINE(USE_GETHOSTBYADDR, 1, [use gethostbyaddr for name resolution])
- else
- AC_DEFINE(USE_FORKING_RESOLVER, 1, [use a REALLY SUCKY forking resolver for name resolution])
- fi
- fi
- dnl Otherwise, no resolver at all. Boo hoo.
- dnl
- dnl Find libpcap.
- dnl
- if test x$libpcap_prefix = x ; then
- libpcap_prefix="/usr /usr/local /opt /software"
- fi
- AC_MSG_CHECKING([where to find pcap.h])
- foundpcaph=0
- oldCPPFLAGS=$CPPFLAGS
- for test_prefix in "" $libpcap_prefix ; do
- for x in "" /pcap ; do
- if test x$test_prefix != x ; then
- CPPFLAGS="$oldCPPFLAGS -I$test_prefix/include$x"
- fi
- AC_TRY_CPP([
- #include <pcap.h>
- ], [
- AC_MSG_RESULT([$test_prefix/include$x])
- foundpcaph=1
- break
- ])
- done
- if test $foundpcaph = 1 ; then
- break
- fi
- done
- if test $foundpcaph = 0 ; then
- AC_MSG_RESULT([no idea])
- AC_MSG_ERROR([can't find pcap.h
- You're not going to get very far without libpcap.])
- else
- dnl assume that -lpcap is under $test_prefix/lib
- if test x$test_prefix != x ; then
- LDFLAGS="$LDFLAGS -L$test_prefix/lib"
- fi
- AC_CHECK_LIB(pcap, pcap_open_live, , [
- AC_MSG_ERROR([can't find libpcap
- You're not going to get very far without libpcap.])
- ])
- fi
- foundpcap=0
- AC_CHECK_HEADERS([pcap.h pcap/pcap.h], [
- foundpcap=1
- break
- ])
- if test $foundpcap = 0 ; then
- AC_MSG_ERROR([can't find pcap.h
- You're not going to get very far without libpcap.])
- fi
- dnl
- dnl Curses. Really, we need ncurses or something similarly advanced, since
- dnl we use the (apparently obscure) mvchgat function. Unfortunately, there's
- dnl a solid chance that mvchgat is a macro, so we can't just use
- dnl AC_SEARCH_LIBS....
- dnl
- AC_MSG_CHECKING([for a curses library containing mvchgat])
- oldLIBS=$LIBS
- for curseslib in ncursesw curses ncurses ; do
- LIBS="$oldLIBS -l$curseslib"
- AC_TRY_LINK([
- #include <$curseslib.h>
- ], [
- mvchgat(0, 0, 1, A_REVERSE, 0, NULL)
- ], [
- foundcurseslib=$curseslib
- break
- ])
- done
- if test x$foundcurseslib = x ; then
- AC_MSG_RESULT([none found])
- AC_MSG_ERROR([Curses! Foiled again!
- (Can't find a curses library supporting mvchgat.)
- Consider installing ncurses.])
- else
- AC_MSG_RESULT([-l$foundcurseslib])
- fi
- dnl
- dnl POSIX threads. Different systems like different combinations of flags,
- dnl libraries, etc. We use a test program to figure this stuff out.
- dnl
- AC_MSG_CHECKING([POSIX threads compilation])
- thrfail=1
- oldCFLAGS=$CFLAGS
- oldLIBS=$LIBS
- for flag in "" -mt -pthread -thread ; do
- CFLAGS="$oldCFLAGS $flag"
- for lib in "" -lpthread "-lpthread -lposix4" ; do
- LIBS="$oldLIBS $lib"
- AC_LINK_IFELSE([AC_LANG_SOURCE([`cat config/pthread.c`])], [
- foundthrlib=$lib
- foundthrflag=$flag
- thrfail=0
- break
- ])
- done
- if test $thrfail = 0 ; then
- break
- fi
- done
- if test $thrfail = 1 ; then
- AC_MSG_RESULT([no idea])
- AC_MSG_ERROR([can't figure out how to compile with POSIX threads
- If your system actually supports POSIX threads, this means we've messed up.])
- fi
- AC_MSG_RESULT([CFLAGS=$foundthrflag and LIBS=$foundthrlib])
- AC_MSG_CHECKING([POSIX threads usability])
- AC_RUN_IFELSE([AC_LANG_SOURCE([`cat config/pthread.c`])],
- [AC_MSG_RESULT([yes])],
- [AC_MSG_ERROR(
- [it fails. We probably guessed the wrong CFLAGS.])],
- [AC_MSG_RESULT([can't test because we are cross-compiling])])
- dnl
- dnl Are we on a system (like Solaris) that requires promiscuous mode in order to
- dnl see any outgoing packets?
- dnl
- AC_MSG_CHECKING([if we need to enable promiscuous mode by default])
- enable_default_promiscuous="no"
- case "$host_os" in
- solaris*) enable_default_promiscuous="yes" ;;
- esac
- AC_ARG_ENABLE(default-promiscuous,
- [ --enable-default-promiscuous If enabled, iftop will operate in promiscuous mode
- to capture outgoing packets])
- AC_MSG_RESULT([$enable_default_promiscuous])
- if test x"$enable_default_promiscuous" = x"yes"; then
- AC_DEFINE([NEED_PROMISCUOUS_FOR_OUTGOING],1,[Enable default promiscuous mode to capture outgoing packets])
- fi
- dnl
- dnl Wahey! This might even work.
- dnl
- AC_SUBST(ac_aux_dir)
- AC_OUTPUT(Makefile config/Makefile)
- if echo $PACKAGE_VERSION | grep 'pre' > /dev/null ; then
- AC_MSG_WARN([
- ******************************************************************************
- This is a pre-release version. Pre-releases are subject to limited
- announcements, and therefore limited circulation, as a means of testing
- the more widely circulated final releases.
- Please do not be surprised if this release is broken, and if it is broken, do
- not assume that someone else has spotted it. Instead, please drop a note on
- the mailing list, or a brief email to me on pdw@ex-parrot.com
- Thank you for taking the time to be the testing phase of this development
- process.
- Paul Warren
- ******************************************************************************
- ])
- fi
|