]> gitweb.fperrin.net Git - iftop.git/blob - configure.ac
Import iftop-1.0pre4
[iftop.git] / configure.ac
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