Annotation of embedaddon/iftop/configure.ac, revision 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>