Annotation of embedaddon/iftop/configure.ac, revision 1.1.1.1

1.1       misho       1: dnl
                      2: dnl configure.ac:
                      3: dnl Autoconf input for iftop.
                      4: dnl
                      5: dnl I hate autoconf with a passion. It's an utter pain to write these bloody
                      6: dnl things and even once you have you find yourself testing for more and more
                      7: dnl special cases. But that's OK. Paul is going to maintain it :)
                      8: dnl     -- Chris Lightfoot
                      9: dnl
                     10: dnl $Id: configure.ac,v 1.2 2014/01/19 20:28:31 pdw Exp $
                     11: dnl
                     12: dnl To regenerate everything from source, do:
                     13: dnl    autoheader
                     14: dnl    aclocal
                     15: dnl    automake
                     16: dnl    autoconf
                     17: dnl Now you should have good sources to make into a tarball and distribute.
                     18: dnl    ./configure     (perhaps with some arguments)
                     19: dnl    make
                     20: dnl Tested with automake 1.9.6-1.14 and autoconf 2.59-2.69.
                     21: dnl
                     22: dnl Boilerplate configuration
                     23: dnl
                     24: 
                     25: AC_INIT([iftop], [1.0pre4], [pdw@ex-parrot.com], [iftop], [http://www.ex-parrot.com/pdw/iftop/])
                     26: 
                     27: AC_CONFIG_AUX_DIR(config)
                     28: 
                     29: AC_CANONICAL_SYSTEM
                     30: 
                     31: AC_CONFIG_HEADERS([config.h])
                     32: AM_INIT_AUTOMAKE
                     33: 
                     34: dnl Make sure we have a C compiler....
                     35: AC_PROG_CC
                     36: AC_HEADER_STDC
                     37: 
                     38: dnl
                     39: dnl Options to configure.
                     40: dnl
                     41: 
                     42: AC_ARG_WITH(resolver,
                     43:     [  --with-resolver=TYPE    Technique iftop should use for name resolution.  
                     44:                           Valid options are:
                     45:                          netdb          use gethostbyaddr_r in multiple
                     46:                                         threads.
                     47:                          netdb_1thread  use gethostbyaddr_r and
                     48:                                         assume it is not reentrant.
                     49:                          ares           use the MIT ARES asynchronous
                     50:                                         resolver library.
                     51:                          forking        use the REALLY SUCKY forking resolver.
                     52:                          guess          run experiments to guess a
                     53:                                         reasonable value.  Only works if you
                     54:                                         aren't cross-compiling.  This
                     55:                                         is the default.  guess will
                     56:                                         either select netdb or netdb_1thread.
                     57:                          none           don't do name resolution.],
                     58:     [resolver=$withval],
                     59:     [resolver=guess])
                     60: 
                     61: AC_ARG_WITH(libpcap,
                     62:     [  --with-libpcap=WHERE    Where the libpcap packet-capture library is found.
                     63:                           The pcap library should be installed  in WHERE/lib,
                     64:                           and the header file in either WHERE/include or
                     65:                           WHERE/include/pcap.
                     66:                           [default=look in standard locations]],
                     67:     [libpcap_prefix=$withval],
                     68:     [libpcap_prefix=""])
                     69: 
                     70: dnl
                     71: dnl Fairly generic checks.
                     72: dnl
                     73: 
                     74: dnl Checks for system headers.
                     75: AC_CHECK_HEADERS([sgtty.h sys/ioctl.h sys/time.h sys/sockio.h termio.h termios.h unistd.h])
                     76: 
                     77: dnl Checks for typedefs, structures, and compiler characteristics.
                     78: AC_C_CONST
                     79: AC_TYPE_SIZE_T
                     80: AC_HEADER_TIME
                     81: 
                     82: dnl
                     83: dnl Are we on a system that uses the STREAMS low-level DLPI interface?
                     84: dnl
                     85: 
                     86: AC_CHECK_HEADER([sys/dlpi.h],[AC_DEFINE([HAVE_DLPI],1,[Are we running on a STREAMS system with DLPI?])])
                     87: 
                     88: dnl Checks for library functions.
                     89: AC_CHECK_FUNCS(regcomp select strdup strerror strspn)
                     90: 
                     91: AC_SEARCH_LIBS(socket, socket)
                     92: AC_SEARCH_LIBS(log, m)
                     93: AC_CHECK_FUNC(gethostbyname, ,
                     94:        [AC_CHECK_LIB(nsl, gethostbyname)] )
                     95: 
                     96: AC_SEARCH_LIBS(inet_aton, [socket nsl])
                     97: AC_SEARCH_LIBS(inet_pton, [socket nsl])
                     98: AC_CHECK_FUNCS(inet_aton inet_pton)
                     99: 
                    100: dnl
                    101: dnl Find integers of known physical size. This is a pain in the arse because
                    102: dnl we can't use AC_CHECK_SIZEOF to find the original variables, since that
                    103: dnl function doesn't permit us to include a header file. Sigh.
                    104: dnl
                    105: 
                    106: for type in u_int8_t u_int16_t u_int32_t ; do
                    107:     AC_MSG_CHECKING([size of $type])
                    108:     AC_RUN_IFELSE([AC_LANG_SOURCE([
                    109: #include <sys/types.h>
                    110: #include <stdio.h>
                    111: int main() {
                    112:     $type dummy;
                    113:     FILE *f=fopen("conftestval", "w");
                    114:     if (!f) exit(1);
                    115:     fprintf(f, "%d\n", sizeof($1));
                    116:     exit(0);
                    117: }
                    118:     ])], [
                    119:         x=`cat conftestval`
                    120:         eval "size_$type=$x"
                    121:         AC_MSG_RESULT([$x])
                    122:     ], [
                    123:         eval "size_$type=0"
                    124:         AC_MSG_RESULT([unknown type])
                    125:     ], [
                    126:         eval "size_$type=0"
                    127:         AC_MSG_RESULT([can't determine when cross-compiling])
                    128:     ])
                    129: done
                    130: 
                    131: dnl Groan. Have to do things this way so that autoheader can do its thing....
                    132: AC_DEFINE_UNQUOTED(SIZEOF_U_INT8_T,  [$size_u_int8_t],  [size of u_int8_t])
                    133: AC_DEFINE_UNQUOTED(SIZEOF_U_INT16_T, [$size_u_int16_t], [size of u_int16_t])
                    134: AC_DEFINE_UNQUOTED(SIZEOF_U_INT32_T, [$size_u_int32_t], [size of u_int32_t])
                    135: 
                    136: dnl If we already have these types, don't piss about any more....
                    137: 
                    138: if test $size_u_int8_t != 1 || test $size_u_int16_t != 2 || test $size_u_int32_t != 4 ; then
                    139: dnl XXXif test $size_u_int8_t != 1 -o $size_u_int16_t != 2 -o $size_u_int32_t != 4 ; then
                    140:     do_int_types=1
                    141:     AC_CHECK_HEADERS(
                    142:         stdint.h             dnl C99
                    143:         sys/inttypes.h,      dnl Solaris
                    144:         [do_int_types=0; break])
                    145: 
                    146:     if test $do_int_types = 1 ; then
                    147:         dnl No C99 int types, so figure them out from basic types.
                    148:         AC_CHECK_SIZEOF(unsigned short int)
                    149:         AC_CHECK_SIZEOF(unsigned int)
                    150:         AC_CHECK_SIZEOF(unsigned long int)
                    151:     else
                    152:         dnl Just use the C99 ones.
                    153:         AC_DEFINE(HAVE_C99_INTS, 1, [C99 fixed-width int types available])
                    154:     fi
                    155: fi
                    156: 
                    157: dnl
                    158: dnl Name resolution.
                    159: dnl
                    160: dnl This is complicated because we need some sort of reentrant mechanism for
                    161: dnl name resolution. Naturally, UNIX vendors have come up with a variety of
                    162: dnl incompatible schemes for this, many of which don't work at all.
                    163: dnl
                    164: 
                    165: dnl First, the default resolver, which uses getnameinfo or gethostbyaddr_r. If
                    166: dnl not available, we fall back to gethostbyaddr. We could fall back to ARES,
                    167: dnl but that's probably not available on typical machines.
                    168: 
                    169: dnl If we've been asked to guess, remember that fact in specified_resolver.
                    170: dnl From this point on, resolver is our preferred resolver given the
                    171: dnl experiments we've done so far, or "guess" if we have no idea.
                    172: specified_resolver=$resolver
                    173: if test x$specified_resolver = xguess ; then
                    174:     dnl Best possibility is getnameinfo.
                    175:     use_getnameinfo=0
                    176:     AC_SEARCH_LIBS(getnameinfo, [nsl], [use_getnameinfo=1])
                    177: 
                    178:     dnl XXX For the moment, don't use getnameinfo, since it isn't actually
                    179:     dnl thread safe on, e.g., NetBSD.
                    180:     use_getnameinfo=0
                    181: 
                    182:     if test $use_getnameinfo = 1 ; then
                    183:         dnl Done.
                    184:         AC_DEFINE(USE_GETNAMEINFO, 1, [use getnameinfo for name resolution])
                    185:     else
                    186:        dnl Best hope is netdb, which presently means gethostbyaddr_r.
                    187:        resolver=netdb
                    188:     fi
                    189: fi
                    190: 
                    191: if test x$resolver = xnetdb ; then
                    192:     dnl Can use gethostbyaddr_r?
                    193:     AC_SEARCH_LIBS(gethostbyaddr_r, [nsl], , [resolver=guess])
                    194:     if test x$resolver = xguess && test x$specified_resolver != xguess ; then
                    195:        dnl They wanted gethostbyaddr_r, but they can't have it, so stop.
                    196:        AC_MSG_ERROR([no library defines gethostbyaddr_r])
                    197:     fi
                    198: fi
                    199: 
                    200: dnl We still might do gethostbyaddr_r.  Figure out whether we have
                    201: dnl glibc-style or Solaris-style gethostbyaddr_r (or neither...).
                    202: dnl Separate determining how to call gethostbyaddr_r from testing
                    203: dnl whether it works so we can support cross-compilation.            
                    204: if test x$resolver = xnetdb ; then
                    205:     AC_MSG_CHECKING([how to call gethostbyaddr_r])
                    206:     dnl Try 7 arguments returning a struct hostent*.
                    207:     AC_LINK_IFELSE([AC_LANG_SOURCE([`cat config/hostentp_ghba_r.c`])],
                    208:                    [AC_MSG_RESULT([7 args])
                    209:                    ghba_args=8
                    210:                    AC_DEFINE(GETHOSTBYADDR_R_RETURNS_HOSTENT_P, 1,
                    211:                     [7-argument gethostbyaddr_r returns struct hostent*])], [
                    212:     dnl Try 8 arguments returning an int.
                    213:     AC_LINK_IFELSE([AC_LANG_SOURCE([`cat config/int_ghba_r.c`])],
                    214:                    [AC_MSG_RESULT([8 args, int return])
                    215:                    ghba_args=8
                    216:                    AC_DEFINE(GETHOSTBYADDR_R_RETURNS_INT, 1,
                    217:                     [8-argument gethostbyaddr_r returns int])], [
                    218:     dnl Neither.
                    219:     AC_MSG_RESULT([don't know how])
                    220:     resolver=guess])])
                    221:     if test x$resolver = xguess && test x$specified_resolver != xguess ; then
                    222:        dnl They wanted gethostbyaddr_r, but they can't have it, so stop.
                    223:        AC_MSG_ERROR([gethostbyaddr_r has no known calling convention])
                    224:     fi
                    225: fi
                    226: 
                    227: dnl If we still want to do gethostbyaddr_r, and we aren't
                    228: dnl cross-compiling, test it.
                    229: if test x$resolver = xnetdb ; then
                    230:     if test x$ghba_args = x8 ; then
                    231:        testfile=int_ghba_r
                    232:     else
                    233:        testfile=hostentp_ghba_r
                    234:     fi
                    235:     AC_MSG_CHECKING(gethostbyaddr_r usability)
                    236:     AC_RUN_IFELSE([AC_LANG_SOURCE([`cat config/$testfile.c`])],
                    237:                   [AC_MSG_RESULT([yes])],
                    238:                  [AC_MSG_RESULT([no])
                    239:                   resolver=guess],
                    240:                  [AC_MSG_RESULT([can't test because we are cross-compiling])])
                    241:     if test x$resolver = xguess ; then
                    242:         if test x$specified_resolver = xguess ; then
                    243:            AC_MSG_RESULT([gethostbyaddr_r doesn't work, so we'll try something else])
                    244:         else
                    245:            dnl They wanted gethostbyaddr_r, but it doesn't work, so stop.
                    246:            AC_MSG_ERROR([gethostbyaddr_r doesn't work])
                    247:         fi
                    248:     fi
                    249: fi
                    250: 
                    251: dnl We found a gethostbyaddr_r we know how to use and which seems to
                    252: dnl work.
                    253: if test x$resolver = xnetdb ; then
                    254:     AC_DEFINE(USE_GETHOSTBYADDR_R, 1, [use gethostbyaddr_r for name resolution])
                    255: fi
                    256: 
                    257: dnl They may have asked for ares.
                    258: if test x$resolver = xares ; then
                    259:     dnl See if ares is to hand....
                    260:     AC_SEARCH_LIBS(ares_init, [ares], [
                    261:         AC_DEFINE(USE_ARES, 1, [use ARES for name resolution])
                    262:         ], [
                    263:         dnl They asked for ares, but we can't give it to them, so stop.
                    264:         AC_MSG_ERROR([can't find ARES.  Re-run configure and ask for a different resolver.])])
                    265: fi
                    266: 
                    267: dnl Last thing to try if we haven't decided yet is netdb_1thread.
                    268: if test x$resolver = xguess ; then
                    269:    resolver=netdb_1thread
                    270: fi
                    271: 
                    272: dnl Ugh. Both the single-threaded and the forking resolvers use gethostbyaddr.
                    273: if test x$resolver = xnetdb_1thread || test x$resolver = xforking ; then
                    274:     AC_SEARCH_LIBS(gethostbyaddr, [nsl], , [
                    275:         AC_MSG_ERROR([gethostbyaddr is not available.  You will have to 
                    276:   recompile with no name resolution at all.])])
                    277: 
                    278:     if test x$resolver = xnetdb_1thread ; then
                    279:         AC_MSG_WARN([using single-threaded resolver with gethostbyaddr
                    280:   Consider obtaining ARES or a machine with a working gethostbyaddr_r.])
                    281:         AC_DEFINE(USE_GETHOSTBYADDR, 1, [use gethostbyaddr for name resolution])
                    282:     else
                    283:         AC_DEFINE(USE_FORKING_RESOLVER, 1, [use a REALLY SUCKY forking resolver for name resolution])
                    284:     fi
                    285: fi
                    286: 
                    287: dnl Otherwise, no resolver at all. Boo hoo.
                    288: 
                    289: dnl
                    290: dnl Find libpcap.
                    291: dnl
                    292: 
                    293: if test x$libpcap_prefix = x ; then
                    294:     libpcap_prefix="/usr /usr/local /opt /software"
                    295: fi
                    296: 
                    297: AC_MSG_CHECKING([where to find pcap.h])
                    298: foundpcaph=0
                    299: oldCPPFLAGS=$CPPFLAGS
                    300: for test_prefix in "" $libpcap_prefix ; do
                    301:     for x in "" /pcap ; do
                    302:         if test x$test_prefix != x ; then
                    303:             CPPFLAGS="$oldCPPFLAGS -I$test_prefix/include$x"
                    304:         fi
                    305:         AC_TRY_CPP([
                    306: #include <pcap.h>
                    307:         ], [
                    308:         AC_MSG_RESULT([$test_prefix/include$x])
                    309:         foundpcaph=1
                    310:         break
                    311:         ])
                    312:     done
                    313:     if test $foundpcaph = 1 ; then
                    314:         break
                    315:     fi
                    316: done
                    317: 
                    318: if test $foundpcaph = 0 ; then
                    319:     AC_MSG_RESULT([no idea])
                    320:     AC_MSG_ERROR([can't find pcap.h
                    321:   You're not going to get very far without libpcap.])
                    322: else
                    323:     dnl assume that -lpcap is under $test_prefix/lib
                    324:     if test x$test_prefix != x ; then
                    325:         LDFLAGS="$LDFLAGS -L$test_prefix/lib"
                    326:     fi
                    327:     AC_CHECK_LIB(pcap, pcap_open_live, , [
                    328:             AC_MSG_ERROR([can't find libpcap
                    329:   You're not going to get very far without libpcap.])
                    330:         ])
                    331: fi
                    332: 
                    333: foundpcap=0
                    334: AC_CHECK_HEADERS([pcap.h pcap/pcap.h], [
                    335:     foundpcap=1
                    336:     break
                    337:     ])
                    338: 
                    339: if test $foundpcap = 0 ; then
                    340:     AC_MSG_ERROR([can't find pcap.h
                    341:   You're not going to get very far without libpcap.])
                    342: fi
                    343: 
                    344: dnl
                    345: dnl Curses. Really, we need ncurses or something similarly advanced, since
                    346: dnl we use the (apparently obscure) mvchgat function. Unfortunately, there's
                    347: dnl a solid chance that mvchgat is a macro, so we can't just use
                    348: dnl AC_SEARCH_LIBS....
                    349: dnl
                    350: 
                    351: AC_MSG_CHECKING([for a curses library containing mvchgat])
                    352: oldLIBS=$LIBS
                    353: for curseslib in ncursesw curses ncurses ; do
                    354:     LIBS="$oldLIBS -l$curseslib"
                    355:     AC_TRY_LINK([
                    356: #include <$curseslib.h>
                    357:         ], [
                    358:         mvchgat(0, 0, 1, A_REVERSE, 0, NULL)
                    359:         ], [
                    360:         foundcurseslib=$curseslib
                    361:         break
                    362:         ])
                    363: done
                    364: 
                    365: if test x$foundcurseslib = x ; then
                    366:     AC_MSG_RESULT([none found])
                    367:     AC_MSG_ERROR([Curses! Foiled again!
                    368:   (Can't find a curses library supporting mvchgat.)
                    369:   Consider installing ncurses.])
                    370: else
                    371:     AC_MSG_RESULT([-l$foundcurseslib])
                    372: fi
                    373: 
                    374: 
                    375: dnl
                    376: dnl POSIX threads. Different systems like different combinations of flags,
                    377: dnl libraries, etc. We use a test program to figure this stuff out.
                    378: dnl
                    379: 
                    380: AC_MSG_CHECKING([POSIX threads compilation])
                    381: thrfail=1
                    382: oldCFLAGS=$CFLAGS
                    383: oldLIBS=$LIBS
                    384: for flag in "" -mt -pthread -thread ; do
                    385:     CFLAGS="$oldCFLAGS $flag"
                    386:     for lib in "" -lpthread "-lpthread -lposix4" ; do
                    387:         LIBS="$oldLIBS $lib"
                    388:         AC_LINK_IFELSE([AC_LANG_SOURCE([`cat config/pthread.c`])], [
                    389:             foundthrlib=$lib
                    390:             foundthrflag=$flag
                    391:             thrfail=0
                    392:             break
                    393:             ])
                    394:     done
                    395:     if test $thrfail = 0 ; then
                    396:         break
                    397:     fi
                    398: done
                    399: 
                    400: if test $thrfail = 1 ; then
                    401:     AC_MSG_RESULT([no idea])
                    402:     AC_MSG_ERROR([can't figure out how to compile with POSIX threads
                    403:   If your system actually supports POSIX threads, this means we've messed up.])
                    404: fi
                    405: 
                    406: AC_MSG_RESULT([CFLAGS=$foundthrflag and LIBS=$foundthrlib])
                    407: AC_MSG_CHECKING([POSIX threads usability])
                    408: AC_RUN_IFELSE([AC_LANG_SOURCE([`cat config/pthread.c`])],
                    409:              [AC_MSG_RESULT([yes])],
                    410:               [AC_MSG_ERROR(
                    411:               [it fails.  We probably guessed the wrong CFLAGS.])],
                    412:              [AC_MSG_RESULT([can't test because we are cross-compiling])])
                    413: 
                    414: dnl
                    415: dnl Are we on a system (like Solaris) that requires promiscuous mode in order to
                    416: dnl see any outgoing packets?
                    417: dnl
                    418: 
                    419: AC_MSG_CHECKING([if we need to enable promiscuous mode by default])
                    420: 
                    421: enable_default_promiscuous="no"
                    422: 
                    423: case "$host_os" in
                    424: solaris*) enable_default_promiscuous="yes" ;;
                    425: esac
                    426: 
                    427: AC_ARG_ENABLE(default-promiscuous,
                    428:        [  --enable-default-promiscuous If enabled, iftop will operate in promiscuous mode 
                    429:                           to capture outgoing packets])
                    430: 
                    431: AC_MSG_RESULT([$enable_default_promiscuous])
                    432: 
                    433: if test x"$enable_default_promiscuous" = x"yes"; then
                    434:        AC_DEFINE([NEED_PROMISCUOUS_FOR_OUTGOING],1,[Enable default promiscuous mode to capture outgoing packets])
                    435: fi
                    436: 
                    437: dnl
                    438: dnl Wahey! This might even work.
                    439: dnl
                    440: 
                    441: AC_SUBST(ac_aux_dir)
                    442: 
                    443: AC_OUTPUT(Makefile config/Makefile)
                    444: 
                    445: if echo $PACKAGE_VERSION | grep 'pre' > /dev/null ; then 
                    446:        AC_MSG_WARN([
                    447: ******************************************************************************
                    448: 
                    449: This is a pre-release version.  Pre-releases are subject to limited 
                    450: announcements, and therefore limited circulation, as a means of testing
                    451: the more widely circulated final releases.  
                    452: 
                    453: Please do not be surprised if this release is broken, and if it is broken, do
                    454: not assume that someone else has spotted it.  Instead, please drop a note on
                    455: the mailing list, or a brief email to me on pdw@ex-parrot.com
                    456: 
                    457: Thank you for taking the time to be the testing phase of this development
                    458: process.
                    459: 
                    460: Paul Warren
                    461: 
                    462: ******************************************************************************
                    463: ])
                    464: fi

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>