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