File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / iftop / configure.ac
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 18 14:04:50 2016 UTC (7 years, 7 months ago) by misho
Branches: iftop, MAIN
CVS tags: v1_0rc4, HEAD
iftop 1.0pre4

    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.1.1.1 2016/10/18 14:04:50 misho 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>