[doc] Add "--disable-doc" to configure
[jleu-quagga.git] / configure.ac
blobd7d8a2f3ed382046244a22cc4673d6889926181e
1 ##
2 ## Configure template file for Quagga.
3 ## autoconf will generate configure script.
4 ##
5 ##  Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
6 ##  Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
7 ##
8 ## $Id$
9 AC_PREREQ(2.53)
11 AC_INIT(Quagga, 0.99.13, [http://bugzilla.quagga.net])
12 AC_CONFIG_SRCDIR(lib/zebra.h)
14 dnl -----------------------------------
15 dnl Get hostname and other information.
16 dnl -----------------------------------
17 AC_CANONICAL_BUILD()
18 AC_CANONICAL_HOST()
19 AC_CANONICAL_TARGET()
21 AM_INIT_AUTOMAKE(1.6)
22 AM_CONFIG_HEADER(config.h)
24 AC_CHECK_PROG([GAWK],[gawk],[gawk],[not-in-PATH])
25 if test "x$GAWK" = "xnot-in-PATH" ; then
26         AC_MSG_ERROR([GNU awk is required for lib/memtype.h made by memtypes.awk.
27 BSD awk complains: awk: gensub doesn't support backreferences (subst "\1") ])
29 AC_ARG_VAR([GAWK],[GNU AWK])
31 AC_SYS_LARGEFILE
33 dnl default is to match previous behavior
34 exampledir=${sysconfdir}
35 AC_ARG_ENABLE([exampledir],
36           AC_HELP_STRING([--enable-exampledir],
37                          [specify alternate directory for examples]),
38                          exampledir="$enableval",)
39 dnl XXX add --exampledir to autoconf standard directory list somehow
40 AC_SUBST(exampledir)
42 dnl default is to match previous behavior
43 pkgsrcrcdir=""
44 pkgsrcdir=""
45 AC_ARG_ENABLE([pkgsrcrcdir],
46           AC_HELP_STRING([--enable-pkgsrcrcdir],
47                          [specify directory for rc.d scripts]),
48                          pkgsrcrcdir="$enableval"; pkgsrcdir="pkgsrc",)
49 dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
50 AC_SUBST(pkgsrcdir)
51 AC_SUBST(pkgsrcrcdir)
53 dnl ------------
54 dnl Check CFLAGS
55 dnl ------------
56 AC_ARG_WITH(cflags,
57 [  --with-cflags           Set CFLAGS for use in compilation.])
58 if test "x$with_cflags" != "x" ; then
59   CFLAGS="$with_cflags" ; cflags_specified=yes ;
60 elif test -n "$CFLAGS" ; then
61   cflags_specified=yes ;
64 dnl --------------------
65 dnl Check CC and friends
66 dnl --------------------
67 AC_LANG([C])
68 AC_PROG_CC
69 AC_PROG_CPP
70 AM_PROG_CC_C_O
71 AC_PROG_EGREP
73 dnl autoconf 2.59 appears not to support AC_PROG_SED
74 dnl AC_PROG_SED
75 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
77 dnl ------------------------------------------------------------------
78 dnl Intel compiler check. Although Intel tries really hard to make icc
79 dnl look like gcc, there are some differences. It's very verbose with
80 dnl -Wall and it doesn't support the individual -W options.
81 dnl ------------------------------------------------------------------
82 if test "x${GCC}" = "xyes" ; then
83   COMPILER="GCC"
84   AC_MSG_CHECKING([whether we are using the Intel compiler])
85   AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
86       [AC_MSG_RESULT([no])],
87       [COMPILER="ICC"
88        AC_MSG_RESULT([yes])]
89   )
90 else
91   AC_MSG_CHECKING([whether we are using SunPro compiler])
92   AC_EGREP_CPP([^__SUNPRO_C.*0x5(7|8|9)], ["__SUNPRO_C" __SUNPRO_C],
93       [AC_MSG_RESULT([no])],
94       [COMPILER="SUNPRO"
95        AC_MSG_RESULT([yes])]
96   )
99 dnl ---------------------------------------------
100 dnl If CLFAGS doesn\'t exist set default value
101 dnl AC_PROG_CC will have set minimal default
102 dnl already, eg "-O2 -g" for gcc, "-g" for others
103 dnl (Wall is gcc specific... have to make sure
104 dnl  gcc is being used before setting it)
106 dnl Intel icc 8.0 also sets __GNUC__, 
107 dnl but doesn't support all these fancy -W options.
108 dnl Intel compiler warnings we ignore:
109 dnl 279: controlling expression is constant.
110 dnl 869: parameter "xxx" was never referenced - to avoid massive warnings
111 dnl      about "self", "vty", "argc" and "argv" never referenced in DEFUN
112 dnl      macro.
113 dnl 981: operands are evaluated in unspecified order.
115 dnl Sun Studio 10 / SunPro 5.7 is also supported,
116 dnl so lets set some sane CFLAGS for it.
117 dnl ---------------------------------------------
119 AC_MSG_CHECKING([whether to set a default CFLAGS])
120 if test "x${cflags_specified}" = "x" ; then
121   case ${COMPILER} in
122     "ICC")
123         CFLAGS="-Os -g -Wall -wd 279,869,981"
124         AC_MSG_RESULT([Intel default])
125         ;;
126     "GCC")
127         CFLAGS="-Os -fno-omit-frame-pointer -g -std=gnu99 -Wall"
128         CFLAGS="${CFLAGS} -Wsign-compare -Wpointer-arith"
129         CFLAGS="${CFLAGS} -Wbad-function-cast -Wwrite-strings"
130         CFLAGS="${CFLAGS} -Wmissing-prototypes -Wmissing-declarations"
131         CFLAGS="${CFLAGS} -Wchar-subscripts -Wcast-qual"
132         # TODO: conditionally addd -Wpacked if handled
133         AC_MSG_RESULT([gcc default])
134         ;;
135     "SUNPRO")
136         CFLAGS="-xO4 -v -g -xspace -xcode=pic32 -xstrconst -xc99"
137         AC_MSG_RESULT([SunPro default])
138         ;;
139     *)
140         AC_MSG_RESULT([unknown compiler])
141         ;;
142   esac
143 else
144   AC_MSG_RESULT([CFLAGS supplied by user])
147 dnl --------------
148 dnl Check programs
149 dnl --------------
150 AC_PROG_INSTALL
151 AC_PROG_LN_S
152 AC_PROG_MAKE_SET
153 AC_CHECK_TOOL(AR, ar)
155 dnl ---------------------------
156 dnl We, perhaps unfortunately,
157 dnl depend on GNU Make specific
158 dnl constructs.
159 dnl Give the user a warning if
160 dnl not GNU Make.
161 dnl ---------------------------
162 AC_CACHE_CHECK([if ${MAKE-make} is GNU make], [quagga_cv_gnu_make],
163         [quagga_cv_gnu_make=no
164          if ${MAKE-make} --version 2>/dev/null | \
165                 grep '^GNU Make ' >/dev/null ; then
166                 quagga_cv_gnu_make=yes;
167          fi
168         ]
171 dnl -----------------
172 dnl System extensions
173 dnl -----------------
174 AC_GNU_SOURCE
176 dnl -------
177 dnl libtool
178 dnl -------
179 AC_PROG_LIBTOOL
181 dnl ----------------------
182 dnl Packages configuration
183 dnl ----------------------
184 AC_ARG_ENABLE(vtysh,
185 [  --enable-vtysh          include integrated vty shell for Quagga])
186 AC_ARG_ENABLE(ipv6,
187 [  --disable-ipv6          turn off IPv6 related features and daemons])
188 AC_ARG_ENABLE(doc,
189 [  --disable-doc           do not build docs])
190 AC_ARG_ENABLE(zebra,
191 [  --disable-zebra         do not build zebra daemon])
192 AC_ARG_ENABLE(bgpd,
193 [  --disable-bgpd          do not build bgpd])
194 AC_ARG_ENABLE(ripd,
195 [  --disable-ripd          do not build ripd])
196 AC_ARG_ENABLE(ripngd,
197 [  --disable-ripngd        do not build ripngd])
198 AC_ARG_ENABLE(ospfd,
199 [  --disable-ospfd         do not build ospfd])
200 AC_ARG_ENABLE(ospf6d,
201 [  --disable-ospf6d        do not build ospf6d])
202 AC_ARG_ENABLE(watchquagga,
203 [  --disable-watchquagga   do not build watchquagga])
204 AC_ARG_ENABLE(isisd,
205 [  --enable-isisd          build isisd])
206 AC_ARG_ENABLE(solaris,
207 [  --enable-solaris          build solaris])
208 AC_ARG_ENABLE(bgp-announce,
209 [  --disable-bgp-announce, turn off BGP route announcement])
210 AC_ARG_ENABLE(netlink,
211 [  --enable-netlink        force to use Linux netlink interface])
212 AC_ARG_ENABLE(broken-aliases,
213 [  --enable-broken-aliases enable aliases as distinct interfaces for Linux 2.2.X])
214 AC_ARG_WITH(crypto,
215 [  --without-crypto        do not use libcrypto in SNMP])
216 AC_ARG_ENABLE(snmp,
217 [  --enable-snmp           enable SNMP support])
218 AC_ARG_WITH(libpam,
219 [  --with-libpam           use libpam for PAM support in vtysh])
220 AC_ARG_ENABLE(tcp-zebra,
221 [  --enable-tcp-zebra      enable TCP/IP socket connection between zebra and protocol daemon])
222 AC_ARG_ENABLE(opaque-lsa,
223 [  --enable-opaque-lsa     enable OSPF Opaque-LSA with OSPFAPI support (RFC2370)])
224 AC_ARG_ENABLE(ospfapi,
225 [  --disable-ospfapi       do not build OSPFAPI to access the OSPF LSA Database, 
226                           (this is the default if --enable-opaque-lsa is not set)])
227 AC_ARG_ENABLE(ospfclient,
228 [  --disable-ospfclient    do not build OSPFAPI client for OSPFAPI, 
229                           (this is the default if --disable-ospfapi is set)])
230 AC_ARG_ENABLE(ospf-te,
231 [  --enable-ospf-te        enable Traffic Engineering Extension to OSPF])
232 AC_ARG_ENABLE(multipath,
233 [  --enable-multipath=ARG  enable multipath function, ARG must be digit])
234 AC_ARG_ENABLE(user,
235   AC_HELP_STRING([--enable-user=user], [user to run Quagga suite as (default quagga)]))
236 AC_ARG_ENABLE(group,
237   AC_HELP_STRING([--enable-group=group], [group to run Quagga suite as (default quagga)]))
238 AC_ARG_ENABLE(vty_group,
239 [  --enable-vty-group=ARG  set vty sockets to have specified group as owner])
240 AC_ARG_ENABLE(configfile_mask,
241 [  --enable-configfile-mask=ARG  set mask for config files])
242 AC_ARG_ENABLE(logfile_mask,
243 [  --enable-logfile-mask=ARG     set mask for log files])
245 AC_ARG_ENABLE(rtadv,
246 [  --disable-rtadv               disable IPV6 router advertisement feature])
247 AC_ARG_ENABLE(irdp,
248 [  --enable-irdp                 enable IRDP server support in zebra])
249 AC_ARG_ENABLE(isis_topology,
250 [  --enable-isis-topology        enable IS-IS topology generator])
251 AC_ARG_ENABLE(capabilities,
252 [  --disable-capabilities        disable using POSIX capabilities])
253 AC_ARG_ENABLE(gcc_ultra_verbose,
254 [  --enable-gcc-ultra-verbose    enable ultra verbose GCC warnings])
255 AC_ARG_ENABLE(linux24_tcp_md5,
256 [  --enable-linux24-tcp-md5  enable support for old, Linux-2.4 RFC2385 patch])
257 AC_ARG_ENABLE(gcc-rdynamic,
258 [  --enable-gcc-rdynamic   enable gcc linking with -rdynamic for better backtraces])
259 AC_ARG_ENABLE(time-check,
260 [  --disable-time-check          disable slow thread warning messages])
261 AC_ARG_ENABLE(pcreposix,
262 [  --enable-pcreposix          enable using PCRE Posix libs for regex functions])
264 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
265   CFLAGS="${CFLAGS} -W -Wcast-qual -Wstrict-prototypes"
266   CFLAGS="${CFLAGS} -Wmissing-declarations -Wmissing-noreturn"
267   CFLAGS="${CFLAGS} -Wmissing-format-attribute -Wunreachable-code"
268   CFLAGS="${CFLAGS} -Wpacked -Wpadded"
271 if test x"${enable_gcc_rdynamic}" = x"yes" ; then
272   LDFLAGS="${LDFLAGS} -rdynamic"
275 if test x"${enable_time_check}" != x"no" ; then
276   if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
277     AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
278   else
279     AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
280   fi
283 if test "${enable_broken_aliases}" = "yes"; then
284   if test "${enable_netlink}" = "yes"
285   then
286     AC_MSG_FAILURE([Sorry you can not use netlink with broken aliases])
287   fi
288   AC_DEFINE(HAVE_BROKEN_ALIASES,,Broken Alias)
289   enable_netlink=no
292 if test "${enable_tcp_zebra}" = "yes"; then
293   AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
296 if test "${enable_opaque_lsa}" = "yes"; then
297   AC_DEFINE(HAVE_OPAQUE_LSA,,OSPF Opaque LSA)
300 if test "${enable_ospf_te}" = "yes"; then
301   AC_DEFINE(HAVE_OPAQUE_LSA,,OSPF Opaque LSA)
302   AC_DEFINE(HAVE_OSPF_TE,,OSPF TE)
305 if test "${enable_linux24_tcp_md5}" = "yes"; then
306   AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
309 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
310 if test "${enable_rtadv}" != "no"; then
311   AC_MSG_RESULT(yes)
312   AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
313 else
314   AC_MSG_RESULT(no)
317 if test "${enable_irdp}" = "yes"; then
318   AC_DEFINE(HAVE_IRDP,, IRDP )
321 if test "${enable_isisd}" = "yes" && test "${enable_isis_topology}" = yes; then
322   AC_DEFINE(TOPOLOGY_GENERATE,,Enable IS-IS topology generator code)
323   ISIS_TOPOLOGY_INCLUDES="-I./topology"
324   ISIS_TOPOLOGY_DIR="topology"
325   ISIS_TOPOLOGY_LIB="./topology/libtopology.a"
328 AC_SUBST(ISIS_TOPOLOGY_INCLUDES)
329 AC_SUBST(ISIS_TOPOLOGY_DIR)
330 AC_SUBST(ISIS_TOPOLOGY_LIB)
332 if test "${enable_user}" = "yes" || test x"${enable_user}" = x""; then
333   enable_user="quagga"
334 elif test "${enable_user}" = "no"; then
335   enable_user="root"
338 if test "${enable_group}" = "yes" || test x"${enable_group}" = x""; then
339   enable_group="quagga"
340 elif test "${enable_group}" = "no"; then
341   enable_group="root"
344 if test x"${enable_vty_group}" = x"yes" ; then
345   AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
346 elif test x"${enable_vty_group}" != x""; then
347   if test x"${enable_vty_group}" != x"no"; then
348     AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
349   fi
351 AC_SUBST([enable_user])
352 AC_SUBST([enable_group])
353 AC_SUBST([enable_vty_group])
354 AC_DEFINE_UNQUOTED(QUAGGA_USER, "${enable_user}", Quagga User)
355 AC_DEFINE_UNQUOTED(QUAGGA_GROUP, "${enable_group}", Quagga Group)
357 enable_configfile_mask=${enable_configfile_mask:-0600}
358 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
360 enable_logfile_mask=${enable_logfile_mask:-0600}
361 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
363 MULTIPATH_NUM=1
365 case "${enable_multipath}" in
366   [[0-9]|[1-9][0-9]])
367     MULTIPATH_NUM="${enable_multipath}"
368     ;;
369   "")
370     ;;
371   *)           
372     AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
373     ;;
374 esac
376 AC_SUBST(MULTIPATH_NUM)
378 dnl ------------------------------------
379 dnl Check C keywords and standard  types
380 dnl ------------------------------------
381 AC_C_CONST
382 AC_C_INLINE
383 AC_C_RESTRICT
384 AC_C_VOLATILE
385 AC_HEADER_STDC
386 AC_HEADER_TIME
387 AC_HEADER_SYS_WAIT
388 dnl AC_TYPE_PID_T
389 AC_TYPE_UID_T
390 AC_TYPE_MODE_T
391 AC_TYPE_SIZE_T
392 AC_TYPE_SIGNAL
393 AC_STRUCT_TM
395 dnl -------------------------
396 dnl Check other header files.
397 dnl -------------------------
398 AC_CHECK_HEADERS([stropts.h sys/ksym.h sys/times.h sys/select.h \
399         sys/types.h linux/version.h netdb.h asm/types.h \
400         sys/param.h limits.h signal.h libutil.h \
401         sys/socket.h netinet/in.h time.h sys/time.h])
403 dnl Utility macro to avoid retyping includes all the time
404 m4_define([QUAGGA_INCLUDES],
405 [#ifdef SUNOS_5
406 #define _XPG4_2
407 #define __EXTENSIONS__
408 #endif
409 #include <stdio.h>
410 #if STDC_HEADERS
411 # include <stdlib.h>
412 # include <stddef.h>
413 #else
414 # if HAVE_STDLIB_H
415 #  include <stdlib.h>
416 # endif
417 #endif
418 #if HAVE_SYS_TYPES_H
419 # include <sys/types.h>
420 #endif
421 /* sys/conf.h depends on param.h on FBSD at least */
422 #if HAVE_SYS_PARAM_H
423 # include <sys/param.h>
424 #endif
425 /* Required for MAXSIG */
426 #if HAVE_SIGNAL_H
427 # include <signal.h>
428 #endif
429 #if HAVE_SYS_SOCKET_H
430 # include <sys/socket.h>
431 #endif
432 #if HAVE_NETINET_IN_H
433 # include <netinet/in.h>
434 #endif
435 #ifdef TIME_WITH_SYS_TIME
436 # include <sys/time.h>
437 # include <time.h>
438 #else
439 # ifdef HAVE_SYS_TIME_H
440 #  include <sys/time.h>
441 # else
442 #  include <time.h>
443 # endif
444 #endif /* TIME_WITH_SYS_TIME */
445 ])dnl
447 AC_CHECK_HEADERS([sys/un.h net/if.h netinet/in_systm.h netinet/in_var.h \
448         net/if_dl.h net/if_var.h net/netopt.h net/route.h \
449         inet/nd.h arpa/inet.h netinet/ip_icmp.h \
450         fcntl.h stddef.h sys/ioctl.h syslog.h wchar.h wctype.h \
451         sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
452         [], [], QUAGGA_INCLUDES)
454 AC_CHECK_HEADERS([ucontext.h], [], [],
455 [#ifndef __USE_GNU
456 #define __USE_GNU
457 #endif /* __USE_GNU */
458 QUAGGA_INCLUDES
461 m4_define([QUAGGA_INCLUDES],
462 QUAGGA_INCLUDES
463 [#if HAVE_NET_IF_H
464 # include <net/if.h>
465 #endif
466 #if HAVE_SYS_UN_H
467 # include <sys/un.h>
468 #endif
469 #if HAVE_NETINET_IN_SYSTM_H
470 # include <netinet/in_systm.h>
471 #endif
472 #if HAVE_NETINET_IN_VAR_H
473 # include <netinet/in_var.h>
474 #endif
475 #if HAVE_NET_IF_DL_H
476 # include <net/if_dl.h>
477 #endif
478 #if HAVE_NET_IF_VAR_H
479 # include <net/if_var.h>
480 #endif
481 #if HAVE_NET_NETOPT_H
482 # include <net/netopt.h>
483 #endif
484 #if HAVE_NET_ROUTE_H
485 # include <net/route.h>
486 #endif
487 #if HAVE_INET_ND_H
488 # include <inet/nd.h>
489 #endif
490 #if HAVE_ARPA_INET_H
491 # include <arpa/inet.h>
492 #endif
493 /* Required for IDRP */
494 #if HAVE_NETINET_IP_ICMP_H
495 # include <netinet/ip_icmp.h>
496 #endif
497 ])dnl
499 dnl V6 headers are checked below, after we check for v6
501 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
502 case "$host" in
503   [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
504       opsys=sol2-6
505       AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
506       AC_DEFINE(SUNOS_5, 1, SunOS 5)
507       AC_CHECK_LIB(xnet, main)
508       CURSES=-lcurses
509   ;;
510   [*-sunos5.[8-9]] \
511   | [*-sunos5.1[0-9]] \
512   | [*-sunos5.1[0-9].[0-9]] \
513   | [*-solaris2.[8-9]] \
514   | [*-solaris2.1[0-9]] \
515   | [*-solaris2.1[0-9].[0-9]])
516       opsys=sol8
517       AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
518       AC_DEFINE(SUNOS_5, 1, [SunOS 5])
519       AC_CHECK_LIB(socket, main)
520       AC_CHECK_LIB(nsl, main)
521       AC_CHECK_LIB(umem, main)
522       AC_CHECK_FUNCS([printstack],
523         [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
524          AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
525         ])
526       CURSES=-lcurses
527   ;;
528   *-sunos5* | *-solaris2*)
529       AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
530       AC_CHECK_LIB(socket, main)
531       AC_CHECK_LIB(nsl, main)
532       CURSES=-lcurses
533   ;;
534   *-linux*)
535       opsys=gnu-linux
536       AC_DEFINE(GNU_LINUX,,GNU Linux)
537   ;;
538   *-nec-sysv4*)
539       AC_CHECK_LIB(nsl, gethostbyname)
540       AC_CHECK_LIB(socket, socket)
541   ;;
542   *-openbsd*)
543       opsys=openbsd
544       AC_DEFINE(OPEN_BSD,,OpenBSD)
545   ;;
546   *-bsdi*)
547       opsys=bsdi
548       OTHER_METHOD="mtu_kvm.o"
549       AC_CHECK_LIB(kvm, main)
550   ;;
551   *-irix6.5)
552       opsys=irix
553       AC_DEFINE(IRIX_65,,IRIX 6.5)
554   ;;
555 esac
557 dnl ---------------------
558 dnl Integrated VTY option
559 dnl ---------------------
560 case "${enable_vtysh}" in
561   "yes") VTYSH="vtysh";
562          AC_DEFINE(VTYSH,,VTY shell)
563          AC_PATH_PROG(PERL, perl)
564 dnl      Vtysh uses libreadline, which looks for termcap functions at
565 dnl      configure time.  We follow readlines search order.
566 dnl      The required procedures are in libtermcap on NetBSD, in
567 dnl      [TODO] on Linux, and in [TODO] on Solaris.
568          AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
569            [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
570              [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
571                [AC_CHECK_LIB(ncurses, tputs, 
572                              LIBREADLINE="$LIBREADLINE -lncurses")]
573               )]
574             )]
575           )
576          AC_CHECK_LIB(readline, main, LIBREADLINE="$LIBREADLINE -lreadline",,
577                       "$LIBREADLINE")
578          if test $ac_cv_lib_readline_main = no; then
579            AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
580          fi
581          AC_CHECK_HEADER(readline/history.h)
582          if test $ac_cv_header_readline_history_h = no;then
583            AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
584          fi
585          AC_CHECK_LIB(readline, rl_completion_matches, 
586                       LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
587          if test $ac_cv_lib_readline_rl_completion_matches = no; then
588            AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
589          fi
590          ;;
591   "no" ) VTYSH="";;
592   *    ) ;;
593 esac
594 AC_SUBST(LIBREADLINE)
596 dnl ----------
597 dnl PAM module
598 dnl ----------
599 if test "$with_libpam" = "yes"; then
600   AC_CHECK_HEADER([security/pam_misc.h],
601     [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
602      AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
603      pam_conv_func="misc_conv"
604     ],
605     [], QUAGGA_INCLUDES)
606   AC_CHECK_HEADER([security/openpam.h],
607     [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
608      AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
609      pam_conv_func="openpam_ttyconv"
610     ],
611     [], QUAGGA_INCLUDES)
612   if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
613     AC_MSG_WARN([*** pam support will not be built ***])
614     with_libpam="no"
615   fi
618 if test "$with_libpam" = "yes"; then
619 dnl took this test from proftpds configure.in and suited to our needs
620 dnl -------------------------------------------------------------------------
622 dnl This next check looks funky due to a linker problem with some versions
623 dnl of the PAM library.  Prior to 0.72 release, the Linux PAM shared library
624 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
625 dnl with RedHat 6.2 and Debian 2.2 or better.
626 AC_CHECK_LIB(pam, pam_start,
627   [AC_CHECK_LIB(pam, $pam_conv_func,
628     [AC_DEFINE(USE_PAM,,Use PAM for authentication)
629      LIBPAM="-lpam"],
630     [AC_DEFINE(USE_PAM,,Use PAM for authentication)
631      LIBPAM="-lpam -lpam_misc"]
632     )
633   ],
635   [AC_CHECK_LIB(pam, pam_end,
636     [AC_CHECK_LIB(pam, $pam_conv_func,
637       [AC_DEFINE(USE_PAM,,Use PAM for authentication)
638        LIBPAM="-lpam -ldl"],
639       [AC_DEFINE(USE_PAM,,Use PAM for authentication)
640        LIBPAM="-lpam -ldl -lpam_misc"]
641      )
642   ],AC_MSG_WARN([*** pam support will not be built ***]),
643   [-ldl])
644   ]
647 AC_SUBST(LIBPAM)
649 dnl -------------------------------
650 dnl Endian-ness check
651 dnl -------------------------------
652 AC_WORDS_BIGENDIAN
654 dnl -------------------------------
655 dnl check the size in byte of the C
656 dnl -------------------------------
657 dnl AC_CHECK_SIZEOF(char)
658 dnl AC_CHECK_SIZEOF(int)
659 dnl AC_CHECK_SIZEOF(short)
660 dnl AC_CHECK_SIZEOF(long)
662 dnl ----------------------------
663 dnl check existance of functions
664 dnl ----------------------------
665 AC_FUNC_CHOWN
666 AC_FUNC_FNMATCH
667 AC_FUNC_FORK
668 AC_FUNC_MALLOC
669 AC_FUNC_MEMCMP
670 AC_FUNC_MKTIME
671 AC_FUNC_STRFTIME
672 AC_FUNC_REALLOC
673 AC_FUNC_STAT
674 AC_FUNC_SELECT_ARGTYPES
675 AC_FUNC_STRFTIME
676 dnl Avoid AC_FUNC_STRNLEN because it pulls in AC_SYSTEM_EXTENSIONS which
677 dnl can lead to strange side effects.  So we just check for strnlen
678 dnl directly, see below.
679 dnl AC_FUNC_STRNLENdnl
680 AC_FUNC_VPRINTF
682 dnl -------------------------------
683 dnl bgpd needs pow() and hence libm
684 dnl -------------------------------
685 TMPLIBS="$LIBS"
686 AC_CHECK_HEADER([math.h],
687   [AC_CHECK_LIB([m], [pow],
688     [LIBM="-lm"
689      LIBS="$LIBS $LIBM"
690      AC_DEFINE(HAVE_LIBM,, Have libm)
691      AC_CHECK_FUNCS(pow,[],[LIBM=""])
692     ])
694 if test x"$LIBM" = x ; then
695   AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
697 LIBS="$TMPLIBS"
698 AC_SUBST(LIBM)
700 dnl ---------------
701 dnl other functions
702 dnl ---------------
703 AC_CHECK_FUNCS([dup2 ftruncate getcwd gethostbyname getpagesize gettimeofday \
704         inet_ntoa inet_aton strnlen \
705         memchr memmove memset select socket \
706         strcasecmp strchr strcspn strdup strerror \
707         strncasecmp strndup strrchr strspn strstr \
708         strtol strtoul strlcat strlcpy \
709         daemon snprintf vsnprintf \
710         if_nametoindex if_indextoname getifaddrs \
711         uname fcntl])
713 AC_CHECK_FUNCS(setproctitle, ,
714   [AC_CHECK_LIB(util, setproctitle, 
715      [LIBS="$LIBS -lutil"
716       AC_DEFINE(HAVE_SETPROCTITLE,, Have setproctitle)
717      ]
718    )
719   ]
722 dnl ------------------------------------
723 dnl Determine routing get and set method
724 dnl ------------------------------------
725 AC_MSG_CHECKING(zebra between kernel interface method)
726 if test x"$opsys" = x"gnu-linux"; then
727   if test "${enable_netlink}" = "yes";then
728     AC_MSG_RESULT(netlink)
729     RT_METHOD=rt_netlink.o
730     AC_DEFINE(HAVE_NETLINK,,netlink)
731     netlink=yes
732   elif test "${enable_netlink}" = "no"; then
733     AC_MSG_RESULT(ioctl)
734     RT_METHOD=rt_ioctl.o
735     netlink=no
736   else
737     AC_MSG_RESULT(netlink)
738     RT_METHOD=rt_netlink.o
739     AC_DEFINE(HAVE_NETLINK,,netlink)
740     netlink=yes
741   fi
742 elif test x"$opsys" = x"sol2-6";then
743   AC_MSG_RESULT(Route socket)
744   KERNEL_METHOD="kernel_socket.o"
745   RT_METHOD="rt_socket.o"
746 elif test x"$opsys" = x"sol8";then
747   AC_MSG_RESULT(Route socket)
748   KERNEL_METHOD="kernel_socket.o"
749   RT_METHOD="rt_socket.o"
750 elif test "$opsys" = "irix" ; then
751   AC_MSG_RESULT(Route socket)
752   KERNEL_METHOD="kernel_socket.o"
753   RT_METHOD="rt_socket.o"
754 else
755   AC_TRY_RUN([#include <errno.h>
756 #include <sys/types.h>
757 #include <sys/socket.h>
759 main ()
761   int ac_sock;
763   ac_sock = socket (AF_ROUTE, SOCK_RAW, 0);
764   if (ac_sock < 0 && errno == EINVAL)
765     exit (1);
766   exit (0);
768   [KERNEL_METHOD=kernel_socket.o
769    RT_METHOD=rt_socket.o
770    AC_MSG_RESULT(socket)],
771   [RT_METHOD=rt_ioctl.o
772    AC_MSG_RESULT(ioctl)],
773   [KERNEL_METHOD=kernel_socket.o
774    RT_METHOD=rt_socket.o
775    AC_MSG_RESULT(socket)])
777 AC_SUBST(RT_METHOD)
778 AC_SUBST(KERNEL_METHOD)
779 AC_SUBST(OTHER_METHOD)
781 dnl --------------------------
782 dnl Determine IS-IS I/O method
783 dnl --------------------------
784 AC_CHECK_HEADER(net/bpf.h)
785 AC_CHECK_HEADER(sys/dlpi.h)
786 AC_MSG_CHECKING(zebra IS-IS I/O method)
787 if test x"$opsys" = x"gnu-linux"; then
788   AC_MSG_RESULT(pfpacket)
789   ISIS_METHOD=isis_pfpacket.o
790 elif test x"$opsys" = x"sol2-6" -o x"$opsys" = x"sol8"; then
791   AC_MSG_RESULT(DLPI)
792   ISIS_METHOD="isis_dlpi.o"
793 else
794   if test $ac_cv_header_net_bpf_h = no; then
795     if test $ac_cv_header_sys_dlpi_h = no; then
796       AC_MSG_RESULT(none)
797       AC_MSG_WARN([*** IS-IS support will not be built ***])
798       ISISD=""
799     else
800       AC_MSG_RESULT(DLPI)
801     fi
802     ISIS_METHOD="isis_dlpi.o"
803   else
804     AC_MSG_RESULT(BPF)
805     ISIS_METHOD="isis_bpf.o"
806   fi
808 AC_SUBST(ISIS_METHOD)
810 dnl ------------------------------------
811 dnl check for broken CMSG_FIRSTHDR macro
812 dnl ------------------------------------
813 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
814 AC_RUN_IFELSE([AC_LANG_SOURCE([[
815 #ifdef SUNOS_5
816 #define _XPG4_2
817 #define __EXTENSIONS__
818 #endif
819 #ifdef HAVE_STDLIB_H
820 # include <stdlib.h>
821 #endif
822 #ifdef HAVE_SYS_TYPES_H
823 #include <sys/types.h>
824 #endif
825 #ifdef HAVE_SYS_SOCKET_H
826 #include <sys/socket.h>
827 #endif
829 main()
831   struct msghdr msg;
832   char buf[4];
834   msg.msg_control = buf;
835   msg.msg_controllen = 0;
837   if (CMSG_FIRSTHDR(&msg) != NULL)
838     exit(0);
839   exit (1);
840 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
841 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
843 dnl ------------------------------
844 dnl check kernel route read method
845 dnl ------------------------------
846 AC_CACHE_CHECK([route read method], [quagga_cv_rtread_method],
847 [if test "x$netlink" = xyes; then
848   quagga_cv_rtread_method="netlink"
849 else
850 for quagga_cv_rtread_method in /proc/net/route /dev/ip /dev/null;
852   test x`ls $quagga_cv_rtread_method 2>/dev/null` = x"$quagga_cv_rtread_method" && break
853 done
854 case $quagga_cv_rtread_method in
855   "/proc/net/route") quagga_cv_rtread_method="proc";;
856   "/dev/ip")
857                      case "$host" in
858                        *-freebsd*)    quagga_cv_rtread_method="sysctl";;
859                        *)             quagga_cv_rtread_method="getmsg";;
860                      esac;;
861         *)
862                      quagga_cv_rtread_method="sysctl";;
863 esac
864 fi])
865 RTREAD_METHOD=rtread_${quagga_cv_rtread_method}.o
866 AC_SUBST(RTREAD_METHOD)
868 dnl -----------------------------
869 dnl check interface lookup method
870 dnl -----------------------------
871 IOCTL_METHOD=ioctl.o
872 AC_MSG_CHECKING(interface looking up method)
873 if test "$netlink" = yes; then
874   AC_MSG_RESULT(netlink)
875   IF_METHOD=if_netlink.o
876 elif test "$opsys" = "sol2-6";then
877   AC_MSG_RESULT(Solaris GIF)
878   IF_METHOD=if_ioctl.o
879 elif test "$opsys" = "sol8";then
880   AC_MSG_RESULT(Solaris GLIF)
881   IF_METHOD=if_ioctl_solaris.o
882   IOCTL_METHOD=ioctl_solaris.o
883 elif test "$opsys" = "irix" ; then
884   AC_MSG_RESULT(IRIX)
885   IF_METHOD=if_ioctl.o
886 elif test "$opsys" = "openbsd";then
887   AC_MSG_RESULT(openbsd)
888   IF_METHOD=if_ioctl.o
889 elif grep NET_RT_IFLIST /usr/include/sys/socket.h >/dev/null 2>&1; then
890   AC_MSG_RESULT(sysctl)
891     IF_METHOD=if_sysctl.o
892     AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
893 else
894     AC_MSG_RESULT(ioctl)
895     IF_METHOD=if_ioctl.o
897 AC_SUBST(IF_METHOD)
898 AC_SUBST(IOCTL_METHOD)
900 dnl ---------------------------------------------------------------
901 dnl figure out how to specify an interface in multicast sockets API
902 dnl ---------------------------------------------------------------
903 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], QUAGGA_INCLUDES)
905 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
906 AC_TRY_COMPILE([#ifdef HAVE_SYS_PARAM_H
907 #include <sys/param.h>
908 #endif],[#if (defined(__FreeBSD__) && ((__FreeBSD_version >= 500022 && __FreeBSD_version < 700000) || (__FreeBSD_version < 500000 && __FreeBSD_version >= 440000))) || (defined(__NetBSD__) && defined(__NetBSD_Version__) && __NetBSD_Version__ >= 106010000)
909   return (0);
910 #else
911   #error No support for BSD struct ip_mreq hack detected
912 #endif],[AC_MSG_RESULT(yes)
913 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
914 AC_MSG_RESULT(no))
916 dnl ---------------------------------------------------------------
917 dnl figure out how to check link-state
918 dnl ---------------------------------------------------------------
919 AC_CHECK_HEADER([net/if.h],
920   [AC_CHECK_HEADER( [net/if_media.h],
921     [m4_define([LINK_DETECT_INCLUDES],
922       QUAGGA_INCLUDES
923       [#include <net/if_media.h>
924     ])
925     AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
926       AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
927       [], LINK_DETECT_INCLUDES)], 
928     [],
929     QUAGGA_INCLUDES)], 
930   [], QUAGGA_INCLUDES )
932 dnl ------------------------
933 dnl TCP_MD5SIG socket option
934 dnl ------------------------
936 AC_CHECK_HEADER([netinet/tcp.h], 
937    [m4_define([MD5_INCLUDES],
938       QUAGGA_INCLUDES
939       [#include <netinet/tcp.h>
940     ])
941     AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
942    [],
943    QUAGGA_INCLUDES)
944 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
945   AC_CHECK_HEADER([linux/tcp.h],
946        [m4_define([MD5_INCLUDES],
947           QUAGGA_INCLUDES
948           [#include <linux/tcp.h>
949         ])
950        AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
953 dnl -----------------------
954 dnl check proc file system.
955 dnl -----------------------
956 if test "$netlink" != yes; then
957   if test -r /proc/net/dev; then
958     AC_DEFINE(HAVE_PROC_NET_DEV,,/proc/net/dev)
959     IF_PROC=if_proc.o
960   fi
961   if test -r /proc/net/if_inet6; then
962     AC_DEFINE(HAVE_PROC_NET_IF_INET6,,/proc/net/if_inet6)
963     IF_PROC=if_proc.o
964   fi
966 AC_SUBST(IF_PROC)
968 dnl -----------------------------
969 dnl check ipforward detect method
970 dnl -----------------------------
971 AC_CACHE_CHECK([ipforward method], [quagga_cv_ipforward_method],
972 [for quagga_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null;
974   test x`ls $quagga_cv_ipforward_method 2>/dev/null` = x"$quagga_cv_ipforward_method" && break
975 done
976 case $quagga_cv_ipforward_method in
977   "/proc/net/snmp")  quagga_cv_ipforward_method="proc";;
978   "/dev/ip")         
979                      case "$host" in
980                        *-nec-sysv4*)  quagga_cv_ipforward_method="ews";;
981                        *-freebsd*)    quagga_cv_ipforward_method="sysctl";;
982                        *)             quagga_cv_ipforward_method="solaris";;
983                      esac;;
984   *)                 quagga_cv_ipforward_method="sysctl";;
985 esac])
986 IPFORWARD=ipforward_${quagga_cv_ipforward_method}.o
987 AC_SUBST(IPFORWARD)
989 AC_CHECK_FUNCS(getaddrinfo, [have_getaddrinfo=yes], [have_getaddrinfo=no])
991 dnl ----------
992 dnl IPv6 check
993 dnl ----------
994 AC_MSG_CHECKING(whether does this OS have IPv6 stack)
995 if test "${enable_ipv6}" = "no"; then
996   AC_MSG_RESULT(disabled)
997 else
998 dnl ----------
999 dnl INRIA IPv6
1000 dnl ----------
1001   if grep IPV6_INRIA_VERSION /usr/include/netinet/in.h >/dev/null 2>&1; then
1002     zebra_cv_ipv6=yes
1003     AC_DEFINE(HAVE_IPV6,1,INRIA IPv6)
1004     AC_DEFINE(INRIA_IPV6,1,INRIA IPv6)
1005     RIPNGD="ripngd"
1006     OSPF6D="ospf6d"
1007     LIB_IPV6=""
1008     AC_MSG_RESULT(INRIA IPv6)
1009 dnl ---------
1010 dnl KAME IPv6
1011 dnl ---------
1012   elif grep WIDE /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1013     zebra_cv_ipv6=yes
1014     AC_DEFINE(HAVE_IPV6,1,KAME IPv6)
1015     AC_DEFINE(KAME,1,KAME IPv6)
1016     RIPNGD="ripngd"
1017     OSPF6D="ospf6d"
1018     if test -d /usr/local/v6/lib -a -f /usr/local/v6/lib/libinet6.a; then
1019       LIB_IPV6="-L/usr/local/v6/lib -linet6"
1020     fi
1021     AC_MSG_RESULT(KAME)
1022 dnl -------------------------
1023 dnl MUSICA IPv6
1024 dnl  default host check
1025 dnl  It is not used by Kheops
1026 dnl -------------------------
1027   elif grep MUSICA /usr/include6/netinet6/in6.h >/dev/null 2>&1; then
1028     zebra_cv_ipv6=yes
1029     AC_DEFINE(HAVE_IPV6,1,Musicia IPv6)
1030     AC_DEFINE(MUSICA,1,Musica IPv6 stack)
1031     AC_DEFINE(KAME,1,KAME IPv6 stack)
1032     RIPNGD="ripngd"
1033     OSPF6D="ospf6d"
1034     if test -d /usr/local/v6/lib -a -f /usr/local/v6/lib/libinet6.a; then
1035       LIB_IPV6="-L/usr/local/v6/lib -linet6"
1036     fi
1037     AC_MSG_RESULT(MUSICA)
1038 dnl ---------
1039 dnl NRL check
1040 dnl ---------
1041   elif grep NRL /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1042     zebra_cv_ipv6=yes
1043     AC_DEFINE(HAVE_IPV6,1,NRL IPv6)
1044     AC_DEFINE(NRL,1,NRL)
1045     RIPNGD="ripngd"
1046     OSPF6D="ospf6d"
1047     if test x"$opsys" = x"bsdi";then
1048       AC_DEFINE(BSDI_NRL,,BSDI)
1049       AC_MSG_RESULT(BSDI_NRL)
1050     else
1051       AC_MSG_RESULT(NRL)
1052     fi
1053 dnl ------------------------------------
1054 dnl Solaris 9, 10 and potentially higher
1055 dnl ------------------------------------
1056   elif test x"$opsys" = x"sol8"; then
1057     zebra_cv_ipv6=yes;
1058     AC_DEFINE(HAVE_IPV6, 1, IPv6)
1059     AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
1060     RIPNGD="ripngd"
1061     OSPF6D="ospf6d"
1062     AC_MSG_RESULT(Solaris IPv6)
1063 dnl ----------
1064 dnl Linux IPv6
1065 dnl ----------
1066   elif test "${enable_ipv6}" = "yes"; then
1067     AC_EGREP_CPP(yes, [
1068       #include <linux/version.h>
1069       /* 2.1.128 or later */
1070       #if LINUX_VERSION_CODE >= 0x020180
1071       yes
1072       #endif],
1073       [zebra_cv_ipv6=yes
1074        zebra_cv_linux_ipv6=yes
1075        AC_MSG_RESULT(Linux IPv6)])
1076   else
1077     if test x`ls /proc/net/ipv6_route 2>/dev/null` = x"/proc/net/ipv6_route"
1078      then
1079       zebra_cv_ipv6=yes
1080       zebra_cv_linux_ipv6=yes
1081       AC_MSG_RESULT(Linux IPv6)
1082     fi
1083   fi
1085   if test "$zebra_cv_linux_ipv6" = "yes";then
1086     AC_MSG_CHECKING(whether libc has IPv6 support)
1087     AC_TRY_LINK([#include <netinet/in.h>
1088     ],[ int a; a = (int) in6addr_any.s6_addr[0]; if (a != 12345) return a; ],
1089     [AC_MSG_RESULT(yes)
1090       zebra_cv_ipv6=yes
1091       zebra_cv_linux_ipv6=yes],
1092     [AC_MSG_RESULT(no)
1093       zebra_cv_ipv6=no
1094       zebra_cv_linux_ipv6=no])
1095   fi
1097   if test "$zebra_cv_linux_ipv6" = "yes";then
1098     AC_MSG_CHECKING(for GNU libc >= 2.1)
1099     AC_DEFINE(HAVE_IPV6,1,Linux IPv6)
1100     AC_EGREP_CPP(yes, [
1101 #include <features.h>
1102 #if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
1103   yes
1104 #endif], 
1105       [glibc=yes
1106        AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
1107        AC_MSG_RESULT(yes)], 
1108       AC_MSG_RESULT(no)
1109     )
1110     RIPNGD="ripngd"
1111     OSPF6D="ospf6d"
1112     if test "$glibc" != "yes"; then
1113       INCLUDES="-I/usr/inet6/include"
1114       if test x`ls /usr/inet6/lib/libinet6.a 2>/dev/null` != x;then
1115          LIB_IPV6="-L/usr/inet6/lib -linet6"
1116       fi
1117     fi
1118   fi
1120 dnl -----------------------
1121 dnl Set IPv6 related values
1122 dnl -----------------------
1123   LIBS="$LIB_IPV6 $LIBS"
1124   AC_SUBST(LIB_IPV6)
1126   if test x"$RIPNGD" = x""; then
1127     AC_MSG_RESULT(IPv4 only)
1128   fi
1131 dnl ------------------
1132 dnl IPv6 header checks
1133 dnl ------------------
1134 if test "x${zebra_cv_ipv6}" = "xyes"; then
1135 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h netinet/icmp6.h \
1136         netinet6/in6_var.h netinet6/nd6.h], [], [],
1137         QUAGGA_INCLUDES)
1140 m4_define([QUAGGA_INCLUDES],dnl
1141 QUAGGA_INCLUDES
1142 [#if HAVE_NETINET6_IN6_H
1143 #include <netinet6/in6.h>
1144 #endif
1145 #if HAVE_NETINET_IN6_VAR_H
1146 #include <netinet/in6_var.h>
1147 #endif
1148 #if HAVE_NETINET_ICMP6_H
1149 # include <netinet/icmp6.h>
1150 #endif
1151 #if HAVE_NETINET6_IN6_VAR_H
1152 # include <netinet6/in6_var.h>
1153 #endif
1154 #if HAVE_NETINET6_ND6_H
1155 # include <netinet6/nd6.h>
1156 #endif
1157 ])dnl
1159 dnl disable doc check
1160 if test "${enable_doc}" = "no";then
1161   DOC=""
1162 else
1163   DOC="doc"
1166 dnl --------------------
1167 dnl Daemon disable check
1168 dnl --------------------
1169 if test "${enable_zebra}" = "no";then
1170   ZEBRA=""
1171 else
1172   ZEBRA="zebra"
1175 if test "${enable_bgpd}" = "no";then
1176   BGPD=""
1177 else
1178   BGPD="bgpd"
1181 if test "${enable_ripd}" = "no";then
1182   RIPD=""
1183 else
1184   RIPD="ripd"
1187 if test "${enable_ospfd}" = "no";then
1188   OSPFD=""
1189 else
1190   OSPFD="ospfd"
1193 if test "${enable_watchquagga}" = "no";then
1194   WATCHQUAGGA=""
1195 else
1196   WATCHQUAGGA="watchquagga"
1199 OSPFCLIENT=""
1200 if test "${enable_opaque_lsa}" = "yes"; then
1201   if test "${enable_ospfapi}" != "no";then
1202     AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1204     if test "${enable_ospfclient}" != "no";then
1205       OSPFCLIENT="ospfclient"
1206     fi
1207   fi
1211 case "${enable_ripngd}" in
1212   "yes") RIPNGD="ripngd";;
1213   "no" ) RIPNGD="";;
1214   *    ) ;;
1215 esac
1217 case "${enable_ospf6d}" in
1218   "yes") OSPF6D="ospf6d";;
1219   "no" ) OSPF6D="";;
1220   *    ) ;;
1221 esac
1223 case "${enable_isisd}" in
1224   "yes") ISISD="isisd";;
1225   "no" ) ISISD="";;
1226   *    ) ;;
1227 esac
1229 # XXX Perhaps auto-enable on Solaris, but that's messy for cross builds.
1230 case "${enable_solaris}" in
1231   "yes") SOLARIS="solaris";;
1232   "no" ) SOLARIS="";;
1233   *    ) ;;
1234 esac
1236 if test "${enable_bgp_announce}" = "no";then
1237   AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1238 else
1239   AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1242 AC_SUBST(DOC)
1243 AC_SUBST(ZEBRA)
1244 AC_SUBST(BGPD)
1245 AC_SUBST(RIPD)
1246 AC_SUBST(RIPNGD)
1247 AC_SUBST(OSPFD)
1248 AC_SUBST(OSPF6D)
1249 AC_SUBST(WATCHQUAGGA)
1250 AC_SUBST(ISISD)
1251 AC_SUBST(SOLARIS)
1252 AC_SUBST(VTYSH)
1253 AC_SUBST(INCLUDES)
1254 AC_SUBST(CURSES)
1255 AC_SUBST(OSPFCLIENT)
1256 AC_SUBST(OSPFAPI)
1257 AC_CHECK_LIB(c, inet_ntop, [AC_DEFINE(HAVE_INET_NTOP,,inet_ntop)])
1258 AC_CHECK_LIB(c, inet_pton, [AC_DEFINE(HAVE_INET_PTON,,inet_pton)])
1259 AC_CHECK_LIB(crypt, crypt)
1260 AC_CHECK_LIB(resolv, res_init)
1262 dnl ---------------------------------------------------
1263 dnl BSD/OS 4.1 define inet_XtoY function as __inet_XtoY
1264 dnl ---------------------------------------------------
1265 AC_CHECK_FUNC(__inet_ntop, AC_DEFINE(HAVE_INET_NTOP,,__inet_ntop))
1266 AC_CHECK_FUNC(__inet_pton, AC_DEFINE(HAVE_INET_PTON,,__inet_pton))
1267 AC_CHECK_FUNC(__inet_aton, AC_DEFINE(HAVE_INET_ATON,,__inet_aton))
1269 dnl ---------------------------
1270 dnl check system has PCRE regexp
1271 dnl ---------------------------
1272 if test "x$enable_pcreposix" = "xyes"; then
1273   AC_CHECK_LIB(pcreposix, pcreposix_regexec, ,[enable_pcreposix=no
1274   AC_MSG_WARN([*** falling back to other regex library ***]) ])
1277 if test "x$enable_pcreposix" != "xyes"; then
1278 dnl ---------------------------
1279 dnl check system has GNU regexp
1280 dnl ---------------------------
1281 AC_MSG_CHECKING(whether system has GNU regex)
1282 AC_CHECK_LIB(c, regexec,
1283 [AC_DEFINE(HAVE_GNU_REGEX,,GNU regexp library)
1284  LIB_REGEX=""],
1285 [LIB_REGEX="regex.o"])
1287 AC_SUBST(HAVE_LIBPCREPOSIX)
1288 AC_SUBST(LIB_REGEX)
1290 dnl ------------------
1291 dnl check Net-SNMP library
1292 dnl ------------------
1293 if test "${enable_snmp}" = "yes"; then
1294     if test "$with_crypto" != "no"; then
1295         LIBS="${LIBS} -lcrypto";
1296     fi
1297     AC_CHECK_LIB(netsnmp, asn_parse_int,
1298         [AC_DEFINE(HAVE_NETSNMP,,Net SNMP) 
1299          AC_DEFINE(HAVE_SNMP,,SNMP)
1300          LIBS="${LIBS} -lnetsnmp"],
1301         [AC_MSG_ERROR([--enable-snmp given, but cannot find support for SNMP])])
1303     AC_CHECK_HEADER([net-snmp/net-snmp-config.h],
1304         [],
1305         [AC_MSG_ERROR([--enable-snmp given, but cannot find net-snmp-config.h])],
1306         QUAGGA_INCLUDES)
1307     AC_SUBST(SNMP_INCLUDES)
1310 dnl ---------------------------
1311 dnl sockaddr and netinet checks
1312 dnl ---------------------------
1313 AC_CHECK_TYPES([struct sockaddr, struct sockaddr_in,
1314         struct sockaddr_in6, struct sockaddr_un, struct sockaddr_dl,
1315         socklen_t,
1316         struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1317         struct nd_opt_adv_interval, struct rt_addrinfo,
1318         struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1319         [], [], QUAGGA_INCLUDES)
1321 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1322         struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1323         struct sockaddr_in6.sin6_scope_id,
1324         struct if6_aliasreq.ifra_lifetime,
1325         struct nd_opt_adv_interval.nd_opt_ai_type],
1326         [], [], QUAGGA_INCLUDES)
1328 dnl ---------------------------
1329 dnl IRDP/pktinfo/icmphdr checks
1330 dnl ---------------------------
1331 AC_CHECK_TYPES([struct in_pktinfo], 
1332  [AC_CHECK_TYPES([struct icmphdr],
1333    [if test "${enable_irdp}" != "no"; then
1334       AC_DEFINE(HAVE_IRDP,, IRDP)
1335     fi],
1336    [if test "${enable_irdp}" = "yes"; then
1337       AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1338     fi], [QUAGGA_INCLUDES])],
1339  [if test "${enable_irdp}" = "yes"; then
1340     AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1341   fi], [QUAGGA_INCLUDES])
1343 dnl --------------------------------------
1344 dnl checking for getrusage struct and call
1345 dnl --------------------------------------
1346 AC_MSG_CHECKING(whether getrusage is available)
1347 AC_TRY_COMPILE([#include <sys/resource.h>
1348 ],[struct rusage ac_x; getrusage (RUSAGE_SELF, &ac_x);],
1349 [AC_MSG_RESULT(yes)
1350  AC_DEFINE(HAVE_RUSAGE,,rusage)],
1351  AC_MSG_RESULT(no))
1353 dnl --------------------------------------
1354 dnl checking for clock_time monotonic struct and call
1355 dnl --------------------------------------
1356 AC_CHECK_DECL(CLOCK_MONOTONIC,
1357         [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1358          AC_DEFINE(HAVE_MONOTONIC_CLOCK,, Have monotonic clock)
1359 ], [AC_MSG_RESULT(no)], [QUAGGA_INCLUDES])
1361 dnl -------------------
1362 dnl capabilities checks
1363 dnl -------------------
1364 if test "${enable_capabilities}" != "no"; then
1365   AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1366   AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1367     [AC_MSG_RESULT(yes)
1368      AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1369      quagga_ac_keepcaps="yes"],
1370      AC_MSG_RESULT(no)
1371   )
1372   if test x"${quagga_ac_keepcaps}" = x"yes"; then
1373     AC_CHECK_HEADERS(sys/capability.h)
1374   fi
1375   if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1376     AC_CHECK_LIB(cap, cap_init, 
1377       [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1378        LIBCAP="-lcap"
1379        quagga_ac_lcaps="yes"]
1380     )
1381   else
1382     AC_CHECK_HEADERS(priv.h,
1383      [AC_MSG_CHECKING(Solaris style privileges are available)
1384       AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1385           [AC_MSG_RESULT(yes)
1386            AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1387            quagga_ac_scaps="yes"],
1388            AC_MSG_RESULT(no)
1389       )
1390      ]
1391    )
1392   fi
1393   if test x"${quagga_ac_scaps}" = x"yes" \
1394        -o x"${quagga_ac_lcaps}" = x"yes"; then
1395     AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1396   fi
1398 AC_SUBST(LIBCAP)
1400 dnl ---------------------------
1401 dnl check for glibc 'backtrace'
1402 dnl --------------------------- 
1403 if test "${glibc}" = "yes"; then
1404    AC_CHECK_HEADER([execinfo.h],
1405     [AC_CHECK_FUNC([backtrace],
1406         [AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1407          AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1408         ])
1409     ])
1412 dnl -----------------------------------------
1413 dnl check for malloc mallinfo struct and call
1414 dnl this must try and link using LIBS, in
1415 dnl order to check no alternative allocator
1416 dnl has been specified, which might not provide
1417 dnl mallinfo, e.g. such as Umem on Solaris.
1418 dnl -----------------------------------------
1419 AC_CHECK_HEADER([malloc.h],
1420  [AC_MSG_CHECKING(whether mallinfo is available)
1421   AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1422                         [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1423       [AC_MSG_RESULT(yes)
1424        AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1425        AC_MSG_RESULT(no)
1426   )
1427  ], [], QUAGGA_INCLUDES)
1429 dnl ----------
1430 dnl configure date
1431 dnl ----------
1432 CONFDATE=`date '+%Y%m%d'`
1433 AC_SUBST(CONFDATE)
1435 dnl Conditionally enable PIE support for GNU toolchains.
1436 AC_ARG_ENABLE(pie, AS_HELP_STRING([--disable-pie], [Do not build tools as a Position Independent Executables]))
1437 if test "$enable_pie" != "no"; then
1438   AC_CACHE_CHECK([whether $CC accepts PIE flags], [ap_cv_cc_pie], [
1439     save_CFLAGS=$CFLAGS
1440     save_LDFLAGS=$LDFLAGS
1441     CFLAGS="$CFLAGS -fPIE"
1442     LDFLAGS="$LDFLAGS -pie"
1443     AC_LINK_IFELSE([AC_LANG_SOURCE([[static int foo[30000]; int main () { return 0; }]])],
1444       [ap_cv_cc_pie=yes], [ap_cv_cc_pie=no]
1445     )
1446     CFLAGS=$save_CFLAGS
1447     LDFLAGS=$save_LDFLAGS
1448   ])
1449   if test "$ap_cv_cc_pie" = "yes"; then
1450     PICFLAGS="-fPIE"
1451     PILDFLAGS="-pie"
1452   fi
1455 AC_SUBST(PICFLAGS)
1456 AC_SUBST(PILDFLAGS)
1458 dnl ------------------------------
1459 dnl set paths for state directory
1460 dnl ------------------------------
1461 AC_MSG_CHECKING(directory to use for state file)
1462 if test "${prefix}" = "NONE"; then
1463   quagga_statedir_prefix="";
1464 else
1465   quagga_statedir_prefix=${prefix}
1467 if test "${localstatedir}" = '${prefix}/var'; then
1468   for QUAGGA_STATE_DIR in ${quagga_statedir_prefix}/var/run dnl
1469                         ${quagga_statedir_prefix}/var/adm dnl
1470                         ${quagga_statedir_prefix}/etc dnl
1471                         /var/run        dnl
1472                         /var/adm        dnl
1473                         /etc            dnl
1474                         /dev/null;
1475   do
1476     test -d $QUAGGA_STATE_DIR && break
1477   done
1478   quagga_statedir=$QUAGGA_STATE_DIR
1479 else
1480   quagga_statedir=${localstatedir}
1482 if test $quagga_statedir = "/dev/null"; then
1483     AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1485 AC_MSG_RESULT(${quagga_statedir})
1486 AC_SUBST(quagga_statedir)
1488 AC_DEFINE_UNQUOTED(PATH_ZEBRA_PID, "$quagga_statedir/zebra.pid",zebra PID)
1489 AC_DEFINE_UNQUOTED(PATH_RIPD_PID, "$quagga_statedir/ripd.pid",ripd PID)
1490 AC_DEFINE_UNQUOTED(PATH_RIPNGD_PID, "$quagga_statedir/ripngd.pid",ripngd PID)
1491 AC_DEFINE_UNQUOTED(PATH_BGPD_PID, "$quagga_statedir/bgpd.pid",bgpd PID)
1492 AC_DEFINE_UNQUOTED(PATH_OSPFD_PID, "$quagga_statedir/ospfd.pid",ospfd PID)
1493 AC_DEFINE_UNQUOTED(PATH_OSPF6D_PID, "$quagga_statedir/ospf6d.pid",ospf6d PID)
1494 AC_DEFINE_UNQUOTED(PATH_ISISD_PID, "$quagga_statedir/isisd.pid",isisd PID)
1495 AC_DEFINE_UNQUOTED(PATH_WATCHQUAGGA_PID, "$quagga_statedir/watchquagga.pid",watchquagga PID)
1496 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$quagga_statedir/zserv.api",zebra api socket)
1497 AC_DEFINE_UNQUOTED(ZEBRA_VTYSH_PATH, "$quagga_statedir/zebra.vty",zebra vty socket)
1498 AC_DEFINE_UNQUOTED(RIP_VTYSH_PATH, "$quagga_statedir/ripd.vty",rip vty socket)
1499 AC_DEFINE_UNQUOTED(RIPNG_VTYSH_PATH, "$quagga_statedir/ripngd.vty",ripng vty socket)
1500 AC_DEFINE_UNQUOTED(BGP_VTYSH_PATH, "$quagga_statedir/bgpd.vty",bgpd vty socket)
1501 AC_DEFINE_UNQUOTED(OSPF_VTYSH_PATH, "$quagga_statedir/ospfd.vty",ospfd vty socket)
1502 AC_DEFINE_UNQUOTED(OSPF6_VTYSH_PATH, "$quagga_statedir/ospf6d.vty",ospf6d vty socket)
1503 AC_DEFINE_UNQUOTED(ISIS_VTYSH_PATH, "$quagga_statedir/isisd.vty",isisd vty socket)
1504 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$quagga_statedir",daemon vty directory)
1506 dnl -------------------------------
1507 dnl Quagga sources should always be 
1508 dnl current wrt interfaces. Dont
1509 dnl allow deprecated interfaces to
1510 dnl be exposed.
1511 dnl -------------------------------
1512 AC_DEFINE(QUAGGA_NO_DEPRECATED_INTERFACES, 1, Hide deprecated interfaces)
1514 dnl ---------------------------
1515 dnl Check htonl works correctly
1516 dnl ---------------------------
1517 AC_MSG_CHECKING(for working htonl)
1518 AC_CACHE_VAL(ac_cv_htonl_works,
1519  [AC_LINK_IFELSE([AC_LANG_PROGRAM([QUAGGA_INCLUDES],[htonl (0);])],
1520                 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1523 AC_MSG_RESULT($ac_cv_htonl_works)
1525 AC_CONFIG_FILES([Makefile lib/Makefile zebra/Makefile ripd/Makefile 
1526           ripngd/Makefile bgpd/Makefile ospfd/Makefile watchquagga/Makefile
1527           ospf6d/Makefile isisd/Makefile vtysh/Makefile doc/Makefile 
1528           ospfclient/Makefile tests/Makefile m4/Makefile redhat/Makefile
1529           pkgsrc/Makefile
1530           redhat/quagga.spec 
1531           lib/version.h
1532           doc/defines.texi
1533           isisd/topology/Makefile
1534           pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1535           pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh])
1536 AC_CONFIG_FILES([solaris/Makefile])
1538 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1539 ## Hack, but working solution to avoid rebuilding of quagga.info.
1540 ## It's already in CVS until texinfo 4.7 is more common.
1541 AC_OUTPUT
1543 echo "
1544 Quagga configuration
1545 --------------------
1546 quagga version          : ${PACKAGE_VERSION}
1547 host operationg system  : ${host_os}
1548 source code location    : ${srcdir}
1549 compiler                : ${CC}
1550 compiler flags          : ${CFLAGS}
1551 make                    : ${MAKE-make}
1552 includes                : ${INCLUDES} ${SNMP_INCLUDES}
1553 linker flags            : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1554 state file directory    : ${quagga_statedir}
1555 config file directory   : `eval echo \`echo ${sysconfdir}\``
1556 example directory       : `eval echo \`echo ${exampledir}\``
1557 user to run as          : ${enable_user}
1558 group to run as         : ${enable_group}
1559 group for vty sockets   : ${enable_vty_group}
1560 config file mask        : ${enable_configfile_mask}
1561 log file mask           : ${enable_logfile_mask}
1563 The above user and group must have read/write access to the state file
1564 directory and to the config files in the config file directory."
1566 if test x"$quagga_cv_gnu_make" = x"no"; then echo "
1567 Warning: The ${MAKE-make} programme detected, either in your path or
1568 via the MAKE variable, is not GNU Make. GNU make may be installed as
1569 gmake on some systems. and is required to complete a build of Quagga
1570 " > /dev/stderr