[bgpd] Trim memory usage of BGP routes
[jleu-quagga.git] / configure.ac
blobb24ab916341e5d93eab231dfd37ad82c78395162
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.7, [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_PROG_CC
64 AC_PROG_CPP
66 AC_PROG_EGREP
68 dnl autoconf 2.59 appears not to support AC_PROG_SED
69 dnl AC_PROG_SED
70 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
72 dnl ------------------------------------------------------------------
73 dnl Intel compiler check. Although Intel tries really hard to make icc
74 dnl look like gcc, there are some differences. It's very verbose with
75 dnl -Wall and it doesn't support the individual -W options.
76 dnl ------------------------------------------------------------------
77 if test "x${GCC}" = "xyes" ; then
78   COMPILER="GCC"
79   AC_MSG_CHECKING([whether we are using the Intel compiler])
80   AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
81       [AC_MSG_RESULT([no])],
82       [COMPILER="ICC"
83        AC_MSG_RESULT([yes])]
84   )
85 else
86   AC_MSG_CHECKING([whether we are using SunPro compiler])
87   AC_EGREP_CPP([^__SUNPRO_C.*0x5(7|8|9)], ["__SUNPRO_C" __SUNPRO_C],
88       [AC_MSG_RESULT([no])],
89       [COMPILER="SUNPRO"
90        AC_MSG_RESULT([yes])]
91   )
94 dnl ---------------------------------------------
95 dnl If CLFAGS doesn\'t exist set default value
96 dnl AC_PROG_CC will have set minimal default
97 dnl already, eg "-O2 -g" for gcc, "-g" for others
98 dnl (Wall is gcc specific... have to make sure
99 dnl  gcc is being used before setting it)
101 dnl Intel icc 8.0 also sets __GNUC__, 
102 dnl but doesn't support all these fancy -W options.
103 dnl Intel compiler warnings we ignore:
104 dnl 279: controlling expression is constant.
105 dnl 869: parameter "xxx" was never referenced - to avoid massive warnings
106 dnl      about "self", "vty", "argc" and "argv" never referenced in DEFUN
107 dnl      macro.
108 dnl 981: operands are evaluated in unspecified order.
110 dnl Sun Studio 10 / SunPro 5.7 is also supported,
111 dnl so lets set some sane CFLAGS for it.
112 dnl ---------------------------------------------
114 AC_MSG_CHECKING([whether to set a default CFLAGS])
115 if test "x${cflags_specified}" = "x" ; then
116   case ${COMPILER} in
117     "ICC")
118         CFLAGS="-Os -g -Wall -wd 279,869,981"
119         AC_MSG_RESULT([Intel default])
120         ;;
121     "GCC")
122         CFLAGS="-Os -fno-omit-frame-pointer -g -std=gnu99 -Wall"
123         CFLAGS="${CFLAGS} -Wsign-compare -Wpointer-arith"
124         CFLAGS="${CFLAGS} -Wbad-function-cast -Wwrite-strings"
125         CFLAGS="${CFLAGS} -Wmissing-prototypes -Wmissing-declarations"
126         CFLAGS="${CFLAGS} -Wchar-subscripts -Wcast-qual"
127         # TODO: conditionally addd -Wpacked if handled
128         AC_MSG_RESULT([gcc default])
129         ;;
130     "SUNPRO")
131         CFLAGS="-xO4 -v -g -xspace -xcode=pic32 -xstrconst -xc99"
132         AC_MSG_RESULT([SunPro default])
133         ;;
134     *)
135         AC_MSG_RESULT([unknown compiler])
136         ;;
137   esac
138 else
139   AC_MSG_RESULT([CFLAGS supplied by user])
142 dnl --------------
143 dnl Check programs
144 dnl --------------
145 AC_PROG_INSTALL
146 AC_PROG_MAKE_SET
147 AC_CHECK_TOOL(AR, ar)
148 AC_CHECK_TOOL(RANLIB, ranlib, :)
150 dnl ---------------------------
151 dnl We, perhaps unfortunately,
152 dnl depend on GNU Make specific
153 dnl constructs.
154 dnl Give the user a warning if
155 dnl not GNU Make.
156 dnl ---------------------------
157 AC_CACHE_CHECK([if ${MAKE-make} is GNU make], [quagga_cv_gnu_make],
158         [quagga_cv_gnu_make=no
159          if ${MAKE-make} --version 2>/dev/null | \
160                 grep '^GNU Make ' >/dev/null ; then
161                 quagga_cv_gnu_make=yes;
162          fi
163         ]
166 dnl ---------
167 dnl AIX check
168 dnl ---------
169 AC_AIX
171 dnl -------
172 dnl libtool
173 dnl -------
174 AC_PROG_LIBTOOL
176 dnl ----------------------
177 dnl Packages configuration
178 dnl ----------------------
179 AC_ARG_ENABLE(vtysh,
180 [  --enable-vtysh          include integrated vty shell for Quagga])
181 AC_ARG_ENABLE(ipv6,
182 [  --disable-ipv6          turn off IPv6 related features and daemons])
183 AC_ARG_ENABLE(zebra,
184 [  --disable-zebra         do not build zebra daemon])
185 AC_ARG_ENABLE(bgpd,
186 [  --disable-bgpd          do not build bgpd])
187 AC_ARG_ENABLE(ripd,
188 [  --disable-ripd          do not build ripd])
189 AC_ARG_ENABLE(ripngd,
190 [  --disable-ripngd        do not build ripngd])
191 AC_ARG_ENABLE(ospfd,
192 [  --disable-ospfd         do not build ospfd])
193 AC_ARG_ENABLE(ospf6d,
194 [  --disable-ospf6d        do not build ospf6d])
195 AC_ARG_ENABLE(watchquagga,
196 [  --disable-watchquagga   do not build watchquagga])
197 AC_ARG_ENABLE(isisd,
198 [  --enable-isisd          build isisd])
199 AC_ARG_ENABLE(bgp-announce,
200 [  --disable-bgp-announce, turn off BGP route announcement])
201 AC_ARG_ENABLE(netlink,
202 [  --enable-netlink        force to use Linux netlink interface])
203 AC_ARG_ENABLE(broken-aliases,
204 [  --enable-broken-aliases enable aliases as distinct interfaces for Linux 2.2.X])
205 AC_ARG_ENABLE(snmp,
206 [  --enable-snmp           enable SNMP support])
207 AC_ARG_WITH(libpam,
208 [  --with-libpam           use libpam for PAM support in vtysh])
209 AC_ARG_ENABLE(tcp-zebra,
210 [  --enable-tcp-zebra      enable TCP/IP socket connection between zebra and protocol daemon])
211 AC_ARG_ENABLE(opaque-lsa,
212 [  --enable-opaque-lsa     enable OSPF Opaque-LSA with OSPFAPI support (RFC2370)])
213 AC_ARG_ENABLE(ospfapi,
214 [  --disable-ospfapi       do not build OSPFAPI to access the OSPF LSA Database, 
215                           (this is the default if --enable-opaque-lsa is not set)])
216 AC_ARG_ENABLE(ospfclient,
217 [  --disable-ospfclient    do not build OSPFAPI client for OSPFAPI, 
218                           (this is the default if --disable-ospfapi is set)])
219 AC_ARG_ENABLE(ospf-te,
220 [  --enable-ospf-te        enable Traffic Engineering Extension to OSPF])
221 AC_ARG_ENABLE(multipath,
222 [  --enable-multipath=ARG  enable multipath function, ARG must be digit])
223 AC_ARG_ENABLE(quagga_user,
224 [  --enable-user=ARG       user to run Quagga suite as (default quagga)])
225 AC_ARG_ENABLE(quagga_group,
226 [  --enable-group=ARG      group to run Quagga suite as (default quagga)])
227 AC_ARG_ENABLE(vty_group,
228 [  --enable-vty-group=ARG  set vty sockets to have specified group as owner])
229 AC_ARG_ENABLE(configfile_mask,
230 [  --enable-configfile-mask=ARG  set mask for config files])
231 AC_ARG_ENABLE(logfile_mask,
232 [  --enable-logfile-mask=ARG     set mask for log files])
234 AC_ARG_ENABLE(rtadv,
235 [  --disable-rtadv               disable IPV6 router advertisement feature])
236 AC_ARG_ENABLE(irdp,
237 [  --enable-irdp                 enable IRDP server support in zebra])
238 AC_ARG_ENABLE(isis_topology,
239 [  --enable-isis-topology        enable IS-IS topology generator])
240 AC_ARG_ENABLE(capabilities,
241 [  --disable-capabilities        disable using POSIX capabilities])
242 AC_ARG_ENABLE(gcc_ultra_verbose,
243 [  --enable-gcc-ultra-verbose    enable ultra verbose GCC warnings])
244 AC_ARG_ENABLE(gcc-rdynamic,
245 [  --enable-gcc-rdynamic   enable gcc linking with -rdynamic for better backtraces])
246 AC_ARG_ENABLE(time-check,
247 [  --disable-time-check          disable slow thread warning messages])
249 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
250   CFLAGS="${CFLAGS} -W -Wcast-qual -Wstrict-prototypes"
251   CFLAGS="${CFLAGS} -Wmissing-declarations -Wmissing-noreturn"
252   CFLAGS="${CFLAGS} -Wmissing-format-attribute -Wunreachable-code"
253   CFLAGS="${CFLAGS} -Wpacked -Wpadded"
256 if test x"${enable_gcc_rdynamic}" = x"yes" ; then
257   LDFLAGS="${LDFLAGS} -rdynamic"
260 if test x"${enable_time_check}" != x"no" ; then
261   if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
262     AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
263   else
264     AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
265   fi
268 if test "${enable_broken_aliases}" = "yes"; then
269   if test "${enable_netlink}" = "yes"
270   then
271     echo "Sorry, you can't use netlink with broken aliases"
272     exit 1
273   fi
274   AC_DEFINE(HAVE_BROKEN_ALIASES,,Broken Alias)
275   enable_netlink=no
278 if test "${enable_tcp_zebra}" = "yes"; then
279   AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
282 if test "${enable_opaque_lsa}" = "yes"; then
283   AC_DEFINE(HAVE_OPAQUE_LSA,,OSPF Opaque LSA)
286 if test "${enable_ospf_te}" = "yes"; then
287   AC_DEFINE(HAVE_OPAQUE_LSA,,OSPF Opaque LSA)
288   AC_DEFINE(HAVE_OSPF_TE,,OSPF TE)
291 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
292 if test "${enable_rtadv}" != "no"; then
293   AC_MSG_RESULT(yes)
294   AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
295 else
296   AC_MSG_RESULT(no)
299 if test "${enable_irdp}" = "yes"; then
300   AC_DEFINE(HAVE_IRDP,, IRDP )
303 if test "${enable_isisd}" = "yes" && test "${enable_isis_topology}" = yes; then
304   AC_DEFINE(TOPOLOGY_GENERATE,,Enable IS-IS topology generator code)
305   ISIS_TOPOLOGY_INCLUDES="-I./topology"
306   ISIS_TOPOLOGY_DIR="topology"
307   ISIS_TOPOLOGY_LIB="./topology/libtopology.a"
310 AC_SUBST(ISIS_TOPOLOGY_INCLUDES)
311 AC_SUBST(ISIS_TOPOLOGY_DIR)
312 AC_SUBST(ISIS_TOPOLOGY_LIB)
314 if test "${enable_user}" = "yes" || test x"${enable_user}" = x""; then
315   enable_user="quagga"
316 elif test "${enable_user}" = "no"; then
317   enable_user="root"
320 if test "${enable_group}" = "yes" || test x"${enable_group}" = x""; then
321   enable_group="quagga"
322 elif test "${enable_group}" = "no"; then
323   enable_group="root"
326 if test x"${enable_vty_group}" = x"yes" ; then
327   AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
328 elif test x"${enable_vty_group}" != x""; then
329   if test x"${enable_vty_group}" != x"no"; then
330     AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
331   fi
333 AC_SUBST([enable_user])
334 AC_SUBST([enable_group])
335 AC_SUBST([enable_vty_group])
336 AC_DEFINE_UNQUOTED(QUAGGA_USER, "${enable_user}", Quagga User)
337 AC_DEFINE_UNQUOTED(QUAGGA_GROUP, "${enable_group}", Quagga Group)
339 enable_configfile_mask=${enable_configfile_mask:-0600}
340 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
342 enable_logfile_mask=${enable_logfile_mask:-0600}
343 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
345 changequote(, )dnl
347 MULTIPATH_NUM=1
349 case "${enable_multipath}" in
350   [0-9]|[1-9][0-9])
351     MULTIPATH_NUM="${enable_multipath}"
352     ;;
353   "")
354     ;;
355   *)           
356     echo "Please specify digit to --enable-multipath ARG."
357     exit 1
358     ;;
359 esac
361 changequote([, ])dnl
363 AC_SUBST(MULTIPATH_NUM)
365 dnl -------------------
366 dnl Check header files.
367 dnl -------------------
368 AC_HEADER_STDC
369 AC_CHECK_HEADERS([string.h stropts.h sys/conf.h sys/ksym.h sys/time.h \
370                  sys/times.h sys/select.h sys/sysctl.h sys/sockio.h \
371                  sys/types.h linux/version.h kvm.h netdb.h asm/types.h \
372                  sys/param.h libutil.h limits.h stdint.h])
374 AC_CHECK_HEADERS([sys/socket.h netinet/in_systm.h netinet/in.h \
375                  net/if_dl.h net/netopt.h inet/nd.h net/route.h \
376                  net/if.h net/if_var.h netinet/in_var.h])
378 dnl V6 headers are checked below, after we check for v6
380 dnl check some types
381 AC_C_CONST
382 dnl AC_TYPE_PID_T
383 AC_TYPE_SIGNAL
385 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
386 case "$host" in
387   [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
388       opsys=sol2-6
389       AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
390       AC_DEFINE(SUNOS_5, 1, SunOS 5)
391       AC_CHECK_LIB(xnet, main)
392       CURSES=-lcurses
393   ;;
394   [*-sunos5.[8-9]] \
395   | [*-sunos5.1[0-9]] \
396   | [*-sunos5.1[0-9].[0-9]] \
397   | [*-solaris2.[8-9]] \
398   | [*-solaris2.1[0-9]] \
399   | [*-solaris2.1[0-9].[0-9]])
400       opsys=sol8
401       AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
402       AC_DEFINE(SUNOS_5, 1, [SunOS 5])
403       AC_CHECK_LIB(socket, main)
404       AC_CHECK_LIB(nsl, main)
405       AC_CHECK_LIB(umem, main)
406       AC_CHECK_FUNCS([printstack],
407         [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
408          AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
409         ])
410       CURSES=-lcurses
411   ;;
412   *-sunos5* | *-solaris2*)
413       AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
414       AC_CHECK_LIB(socket, main)
415       AC_CHECK_LIB(nsl, main)
416       CURSES=-lcurses
417   ;;
418   *-linux*)
419       opsys=gnu-linux
420       AC_DEFINE(GNU_LINUX,,GNU Linux)
421   ;;
422   *-nec-sysv4*)
423       AC_CHECK_LIB(nsl, gethostbyname)
424       AC_CHECK_LIB(socket, socket)
425   ;;
426   *-openbsd*)
427       opsys=openbsd
428       AC_DEFINE(OPEN_BSD,,OpenBSD)
429   ;;
430   *-bsdi*)
431       opsys=bsdi
432       OTHER_METHOD="mtu_kvm.o"
433       AC_CHECK_LIB(kvm, main)
434   ;;
435   *-irix6.5)
436       opsys=irix
437       AC_DEFINE(IRIX_65,,IRIX 6.5)
438   ;;
439 esac
441 dnl ---------------------
442 dnl Integrated VTY option
443 dnl ---------------------
444 case "${enable_vtysh}" in
445   "yes") VTYSH="vtysh";
446          AC_DEFINE(VTYSH,,VTY shell)
447          AC_PATH_PROG(PERL, perl)
448 dnl      Vtysh uses libreadline, which looks for termcap functions at
449 dnl      configure time.  We follow readline's search order.
450 dnl      The required procedures are in libtermcap on NetBSD, in
451 dnl      [TODO] on Linux, and in [TODO] on Solaris.
452          AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
453            [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
454              [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
455                [AC_CHECK_LIB(ncurses, tputs, 
456                              LIBREADLINE="$LIBREADLINE -lncurses")]
457               )]
458             )]
459           )
460          AC_CHECK_LIB(readline, main, LIBREADLINE="$LIBREADLINE -lreadline",,
461                       "$LIBREADLINE")
462          if test $ac_cv_lib_readline_main = no; then
463            AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
464          fi
465          AC_CHECK_HEADER(readline/history.h)
466          if test $ac_cv_header_readline_history_h = no;then
467            AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
468          fi
469          AC_CHECK_LIB(readline, rl_completion_matches, 
470                       LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
471          if test $ac_cv_lib_readline_rl_completion_matches = no; then
472            AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
473          fi
474          ;;
475   "no" ) VTYSH="";;
476   *    ) ;;
477 esac
478 AC_SUBST(LIBREADLINE)
480 dnl ----------
481 dnl PAM module
482 dnl ----------
483 if test "$with_libpam" = "yes"; then
484   AC_CHECK_HEADER(security/pam_misc.h)
485   if test "$ac_cv_header_security_pam_misc_h" = yes; then
486     AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
487     AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
488     pam_conv_func="misc_conv"
489   fi
490   AC_CHECK_HEADER(security/openpam.h)
491   if test "$ac_cv_header_security_openpam_h" = yes; then
492     AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
493     AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
494     pam_conv_func="openpam_ttyconv"
495   fi
496   if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
497     AC_MSG_WARN([*** pam support will not be built ***])
498     with_libpam="no"
499   fi
502 if test "$with_libpam" = "yes"; then
503 dnl took this test from proftpd's configure.in and suited to our needs
504 dnl -------------------------------------------------------------------------
506 dnl This next check looks funky due to a linker problem with some versions
507 dnl of the PAM library.  Prior to 0.72 release, the Linux PAM shared library
508 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
509 dnl with RedHat 6.2 and Debian 2.2 or better.
510 AC_CHECK_LIB(pam, pam_start,
511   [AC_CHECK_LIB(pam, $pam_conv_func,
512     [AC_DEFINE(USE_PAM,,Use PAM for authentication)
513      LIBPAM="-lpam"],
514     [AC_DEFINE(USE_PAM,,Use PAM for authentication)
515      LIBPAM="-lpam -lpam_misc"]
516     )
517   ],
519   [AC_CHECK_LIB(pam, pam_end,
520     [AC_CHECK_LIB(pam, $pam_conv_func,
521       [AC_DEFINE(USE_PAM,,Use PAM for authentication)
522        LIBPAM="-lpam -ldl"],
523       [AC_DEFINE(USE_PAM,,Use PAM for authentication)
524        LIBPAM="-lpam -ldl -lpam_misc"]
525      )
526   ],AC_MSG_WARN([*** pam support will not be built ***]),
527   [-ldl])
528   ]
531 AC_SUBST(LIBPAM)
533 dnl -------------------------------
534 dnl Endian-ness check
535 dnl -------------------------------
536 AC_WORDS_BIGENDIAN
538 dnl -------------------------------
539 dnl check the size in byte of the C
540 dnl -------------------------------
541 dnl AC_CHECK_SIZEOF(char)
542 dnl AC_CHECK_SIZEOF(int)
543 dnl AC_CHECK_SIZEOF(short)
544 dnl AC_CHECK_SIZEOF(long)
546 dnl ----------------------------
547 dnl check existance of functions
548 dnl ----------------------------
549 AC_CHECK_FUNCS(memset memcpy strerror inet_aton daemon snprintf vsnprintf \
550                strlcat strlcpy if_nametoindex if_indextoname getifaddrs \
551                fcntl strnlen strndup)
552 AC_CHECK_FUNCS(setproctitle, ,
553   [AC_CHECK_LIB(util, setproctitle, 
554      [LIBS="$LIBS -lutil"
555       AC_DEFINE(HAVE_SETPROCTITLE,, Have setproctitle)
556      ]
557    )
558   ]
561 dnl ------------------------------------
562 dnl Determine routing get and set method
563 dnl ------------------------------------
564 AC_MSG_CHECKING(zebra between kernel interface method)
565 if test x"$opsys" = x"gnu-linux"; then
566   if test "${enable_netlink}" = "yes";then
567     AC_MSG_RESULT(netlink)
568     RT_METHOD=rt_netlink.o
569     AC_DEFINE(HAVE_NETLINK,,netlink)
570     netlink=yes
571   elif test "${enable_netlink}" = "no"; then
572     AC_MSG_RESULT(ioctl)
573     RT_METHOD=rt_ioctl.o
574     netlink=no
575   else
576     AC_MSG_RESULT(netlink)
577     RT_METHOD=rt_netlink.o
578     AC_DEFINE(HAVE_NETLINK,,netlink)
579     netlink=yes
580   fi
581 elif test x"$opsys" = x"sol2-6";then
582   AC_MSG_RESULT(Route socket)
583   KERNEL_METHOD="kernel_socket.o"
584   RT_METHOD="rt_socket.o"
585 elif test x"$opsys" = x"sol8";then
586   AC_MSG_RESULT(Route socket)
587   KERNEL_METHOD="kernel_socket.o"
588   RT_METHOD="rt_socket.o"
589 elif test "$opsys" = "irix" ; then
590   AC_MSG_RESULT(Route socket)
591   KERNEL_METHOD="kernel_socket.o"
592   RT_METHOD="rt_socket.o"
593 else
594   AC_TRY_RUN([#include <errno.h>
595 #include <sys/types.h>
596 #include <sys/socket.h>
598 main ()
600   int ac_sock;
602   ac_sock = socket (AF_ROUTE, SOCK_RAW, 0);
603   if (ac_sock < 0 && errno == EINVAL)
604     exit (1);
605   exit (0);
607   [KERNEL_METHOD=kernel_socket.o
608    RT_METHOD=rt_socket.o
609    AC_MSG_RESULT(socket)],
610   [RT_METHOD=rt_ioctl.o
611    AC_MSG_RESULT(ioctl)],
612   [KERNEL_METHOD=kernel_socket.o
613    RT_METHOD=rt_socket.o
614    AC_MSG_RESULT(socket)])
616 AC_SUBST(RT_METHOD)
617 AC_SUBST(KERNEL_METHOD)
618 AC_SUBST(OTHER_METHOD)
620 dnl ------------------------------------
621 dnl check for broken CMSG_FIRSTHDR macro
622 dnl ------------------------------------
623 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
624 AC_RUN_IFELSE([AC_LANG_SOURCE([[
625 #ifdef SUNOS_5
626 #define _XPG4_2
627 #define __EXTENSIONS__
628 #endif
629 #include <stdlib.h>
630 #include <sys/types.h>
631 #include <sys/socket.h>
633 main()
635   struct msghdr msg;
636   char buf[4];
638   msg.msg_control = buf;
639   msg.msg_controllen = 0;
641   if (CMSG_FIRSTHDR(&msg) != NULL)
642     exit(0);
643   exit (1);
644 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
645 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
647 dnl ------------------------------
648 dnl check kernel route read method
649 dnl ------------------------------
650 AC_CACHE_CHECK(route read method check, zebra_rtread,
651 [if test "$netlink" = yes; then
652   RTREAD_METHOD="rtread_netlink.o"
653   zebra_rtread="netlink"
654 else
655 for zebra_rtread in /proc/net/route /dev/ip /dev/null;
657   test x`ls $zebra_rtread 2>/dev/null` = x"$zebra_rtread" && break
658 done
659 case $zebra_rtread in
660   "/proc/net/route") RTREAD_METHOD="rtread_proc.o"
661                      zebra_rtread="proc";;
662   "/dev/ip")
663                      case "$host" in
664                        *-freebsd*)    RTREAD_METHOD=rtread_sysctl.o
665                                       zebra_rtread="sysctl";;
666                        *)             RTREAD_METHOD="rtread_getmsg.o"
667                                       zebra_rtread="getmsg";;
668                      esac;;
669   *)                 RTREAD_METHOD="rtread_sysctl.o"
670                      zebra_rtread="sysctl";;
671 esac
672 fi])
673 AC_SUBST(RTREAD_METHOD)
675 dnl -----------------------------
676 dnl check interface lookup method
677 dnl -----------------------------
678 IOCTL_METHOD=ioctl.o
679 AC_MSG_CHECKING(interface looking up method)
680 if test "$netlink" = yes; then
681   AC_MSG_RESULT(netlink)
682   IF_METHOD=if_netlink.o
683 elif test "$opsys" = "sol2-6";then
684   AC_MSG_RESULT(Solaris GIF)
685   IF_METHOD=if_ioctl.o
686 elif test "$opsys" = "sol8";then
687   AC_MSG_RESULT(Solaris GLIF)
688   IF_METHOD=if_ioctl_solaris.o
689   IOCTL_METHOD=ioctl_solaris.o
690 elif test "$opsys" = "irix" ; then
691   AC_MSG_RESULT(IRIX)
692   IF_METHOD=if_ioctl.o
693 elif test "$opsys" = "openbsd";then
694   AC_MSG_RESULT(openbsd)
695   IF_METHOD=if_ioctl.o
696 elif grep NET_RT_IFLIST /usr/include/sys/socket.h >/dev/null 2>&1; then
697   AC_MSG_RESULT(sysctl)
698     IF_METHOD=if_sysctl.o
699     AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
700 else
701     AC_MSG_RESULT(ioctl)
702     IF_METHOD=if_ioctl.o
704 AC_SUBST(IF_METHOD)
705 AC_SUBST(IOCTL_METHOD)
707 dnl ---------------------------------------------------------------
708 dnl figure out how to specify an interface in multicast sockets API
709 dnl ---------------------------------------------------------------
710 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex],,,[#ifdef HAVE_SYS_TYPES_H
711 #include <sys/types.h>
712 #endif
713 #ifdef HAVE_NETINET_IN_H
714 #include <netinet/in.h>
715 #endif])
717 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
718 AC_TRY_COMPILE([#ifdef HAVE_SYS_PARAM_H
719 #include <sys/param.h>
720 #endif],[#if (defined(__FreeBSD__) && (__FreeBSD_version >= 500022 || (__FreeBSD_version < 500000 && __FreeBSD_version >= 440000))) || (defined(__NetBSD__) && defined(__NetBSD_Version__) && __NetBSD_Version__ >= 106010000)
721   return (0);
722 #else
723   #error No support for BSD struct ip_mreq hack detected
724 #endif],[AC_MSG_RESULT(yes)
725 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
726 AC_MSG_RESULT(no))
728 dnl -----------------------
729 dnl check proc file system.
730 dnl -----------------------
731 if test -r /proc/net/dev; then
732   AC_DEFINE(HAVE_PROC_NET_DEV,,/proc/net/dev)
733   IF_PROC=if_proc.o
736 if test -r /proc/net/if_inet6; then
737   AC_DEFINE(HAVE_PROC_NET_IF_INET6,,/proc/net/if_inet6)
738   IF_PROC=if_proc.o
740 AC_SUBST(IF_PROC)
742 dnl -----------------------------
743 dnl check ipforward detect method
744 dnl -----------------------------
745 AC_CACHE_CHECK(ipforward method check, zebra_ipforward_path,
746 [for zebra_ipforward_path in /proc/net/snmp /dev/ip /dev/null;
748   test x`ls $zebra_ipforward_path 2>/dev/null` = x"$zebra_ipforward_path" && break
749 done
750 case $zebra_ipforward_path in
751   "/proc/net/snmp")  IPFORWARD=ipforward_proc.o
752                      zebra_ipforward_path="proc";;
753   "/dev/ip")         
754                      case "$host" in
755                        *-nec-sysv4*)  IPFORWARD=ipforward_ews.o
756                                       zebra_ipforward_path="ews";;
757                        *-freebsd*)    IPFORWARD=ipforward_sysctl.o
758                                       zebra_ipforward_path="sysctl";;
759                        *)             IPFORWARD=ipforward_solaris.o
760                                       zebra_ipforward_path="solaris";;
761                      esac;;
762   *)                 IPFORWARD=ipforward_sysctl.o
763                      zebra_ipforward_path="sysctl";;
764 esac])
765 AC_SUBST(IPFORWARD)
767 AC_CHECK_FUNCS(getaddrinfo, [have_getaddrinfo=yes], [have_getaddrinfo=no])
769 dnl ----------
770 dnl IPv6 check
771 dnl ----------
772 AC_MSG_CHECKING(whether does this OS have IPv6 stack)
773 if test "${enable_ipv6}" = "no"; then
774   AC_MSG_RESULT(disabled)
775 else
776 dnl ----------
777 dnl INRIA IPv6
778 dnl ----------
779   if grep IPV6_INRIA_VERSION /usr/include/netinet/in.h >/dev/null 2>&1; then
780     zebra_cv_ipv6=yes
781     AC_DEFINE(HAVE_IPV6,1,INRIA IPv6)
782     AC_DEFINE(INRIA_IPV6,1,INRIA IPv6)
783     RIPNGD="ripngd"
784     OSPF6D="ospf6d"
785     LIB_IPV6=""
786     AC_MSG_RESULT(INRIA IPv6)
787 dnl ---------
788 dnl KAME IPv6
789 dnl ---------
790   elif grep WIDE /usr/include/netinet6/in6.h >/dev/null 2>&1; then
791     zebra_cv_ipv6=yes
792     AC_DEFINE(HAVE_IPV6,1,KAME IPv6)
793     AC_DEFINE(KAME,1,KAME IPv6)
794     RIPNGD="ripngd"
795     OSPF6D="ospf6d"
796     if test -d /usr/local/v6/lib -a -f /usr/local/v6/lib/libinet6.a; then
797       LIB_IPV6="-L/usr/local/v6/lib -linet6"
798     fi
799     AC_MSG_RESULT(KAME)
800 dnl -------------------------
801 dnl MUSICA IPv6
802 dnl  default host check
803 dnl  It is not used by Kheops
804 dnl -------------------------
805   elif grep MUSICA /usr/include6/netinet6/in6.h >/dev/null 2>&1; then
806     zebra_cv_ipv6=yes
807     AC_DEFINE(HAVE_IPV6,1,Musicia IPv6)
808     AC_DEFINE(MUSICA,1,Musica IPv6 stack)
809     AC_DEFINE(KAME,1,KAME IPv6 stack)
810     RIPNGD="ripngd"
811     OSPF6D="ospf6d"
812     if test -d /usr/local/v6/lib -a -f /usr/local/v6/lib/libinet6.a; then
813       LIB_IPV6="-L/usr/local/v6/lib -linet6"
814     fi
815     AC_MSG_RESULT(MUSICA)
816 dnl ---------
817 dnl NRL check
818 dnl ---------
819   elif grep NRL /usr/include/netinet6/in6.h >/dev/null 2>&1; then
820     zebra_cv_ipv6=yes
821     AC_DEFINE(HAVE_IPV6,1,NRL IPv6)
822     AC_DEFINE(NRL,1,NRL)
823     RIPNGD="ripngd"
824     OSPF6D="ospf6d"
825     if test x"$opsys" = x"bsdi";then
826       AC_DEFINE(BSDI_NRL,,BSDI)
827       AC_MSG_RESULT(BSDI_NRL)
828     else
829       AC_MSG_RESULT(NRL)
830     fi
831 dnl ------------------------------------
832 dnl Solaris 9, 10 and potentially higher
833 dnl ------------------------------------
834   elif test x"$opsys" = x"sol8"; then
835     zebra_cv_ipv6=yes;
836     AC_DEFINE(HAVE_IPV6, 1, IPv6)
837     AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
838     RIPNGD="ripngd"
839     OSPF6D="ospf6d"
840     AC_MSG_RESULT(Solaris IPv6)
841 dnl ----------
842 dnl Linux IPv6
843 dnl ----------
844   elif test "${enable_ipv6}" = "yes"; then
845     AC_EGREP_CPP(yes, [
846       #include <linux/version.h>
847       /* 2.1.128 or later */
848       #if LINUX_VERSION_CODE >= 0x020180
849       yes
850       #endif],
851       [zebra_cv_ipv6=yes
852        zebra_cv_linux_ipv6=yes
853        AC_MSG_RESULT(Linux IPv6)])
854   else
855     if test x`ls /proc/net/ipv6_route 2>/dev/null` = x"/proc/net/ipv6_route"
856      then
857       zebra_cv_ipv6=yes
858       zebra_cv_linux_ipv6=yes
859       AC_MSG_RESULT(Linux IPv6)
860     fi
861   fi
863   if test "$zebra_cv_linux_ipv6" = "yes";then
864     AC_MSG_CHECKING(whether libc has IPv6 support)
865     AC_TRY_LINK([#include <netinet/in.h>
866     ],[ int a; a = (int) in6addr_any.s6_addr[0]; if (a != 12345) return a; ],
867     [AC_MSG_RESULT(yes)
868       zebra_cv_ipv6=yes
869       zebra_cv_linux_ipv6=yes],
870     [AC_MSG_RESULT(no)
871       zebra_cv_ipv6=no
872       zebra_cv_linux_ipv6=no])
873   fi
875   if test "$zebra_cv_linux_ipv6" = "yes";then
876     AC_MSG_CHECKING(for GNU libc >= 2.1)
877     AC_DEFINE(HAVE_IPV6,1,Linux IPv6)
878     AC_EGREP_CPP(yes, [
879 #include <features.h>
880 #if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
881   yes
882 #endif], 
883       [glibc=yes
884        AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
885        AC_MSG_RESULT(yes)], 
886       AC_MSG_RESULT(no)
887     )
888     RIPNGD="ripngd"
889     OSPF6D="ospf6d"
890     if test "$glibc" != "yes"; then
891       INCLUDES="-I/usr/inet6/include"
892       if test x`ls /usr/inet6/lib/libinet6.a 2>/dev/null` != x;then
893          LIB_IPV6="-L/usr/inet6/lib -linet6"
894       fi
895     fi
896   fi
898 dnl -----------------------
899 dnl Set IPv6 related values
900 dnl -----------------------
901   LIBS="$LIB_IPV6 $LIBS"
902   AC_SUBST(LIB_IPV6)
904   if test x"$RIPNGD" = x""; then
905     AC_MSG_RESULT(IPv4 only)
906   fi
909 dnl ------------------
910 dnl IPv6 header checks
911 dnl ------------------
912 if test "x${zebra_cv_ipv6}" = "xyes"; then
913 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h netinet/icmp6.h \
914                  netinet6/in6_var.h netinet6/nd6.h])
917 dnl --------------------
918 dnl Daemon disable check
919 dnl --------------------
920 if test "${enable_zebra}" = "no";then
921   ZEBRA=""
922 else
923   ZEBRA="zebra"
926 if test "${enable_bgpd}" = "no";then
927   BGPD=""
928 else
929   BGPD="bgpd"
932 if test "${enable_ripd}" = "no";then
933   RIPD=""
934 else
935   RIPD="ripd"
938 if test "${enable_ospfd}" = "no";then
939   OSPFD=""
940 else
941   OSPFD="ospfd"
944 if test "${enable_watchquagga}" = "no";then
945   WATCHQUAGGA=""
946 else
947   WATCHQUAGGA="watchquagga"
950 OSPFCLIENT=""
951 if test "${enable_opaque_lsa}" = "yes"; then
952   if test "${enable_ospfapi}" != "no";then
953     AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
955     if test "${enable_ospfclient}" != "no";then
956       OSPFCLIENT="ospfclient"
957     fi
958   fi
962 case "${enable_ripngd}" in
963   "yes") RIPNGD="ripngd";;
964   "no" ) RIPNGD="";;
965   *    ) ;;
966 esac
968 case "${enable_ospf6d}" in
969   "yes") OSPF6D="ospf6d";;
970   "no" ) OSPF6D="";;
971   *    ) ;;
972 esac
974 case "${enable_isisd}" in
975   "yes") ISISD="isisd";;
976   "no" ) ISISD="";;
977   *    ) ;;
978 esac
980 if test "${enable_bgp_announce}" = "no";then
981   AC_DEFINE(DISABLE_BGP_ANNOUNCE,,Disable BGP installation to zebra)
984 AC_SUBST(ZEBRA)
985 AC_SUBST(BGPD)
986 AC_SUBST(RIPD)
987 AC_SUBST(RIPNGD)
988 AC_SUBST(OSPFD)
989 AC_SUBST(OSPF6D)
990 AC_SUBST(WATCHQUAGGA)
991 AC_SUBST(ISISD)
992 AC_SUBST(VTYSH)
993 AC_SUBST(INCLUDES)
994 AC_SUBST(CURSES)
995 AC_SUBST(OSPFCLIENT)
996 AC_SUBST(OSPFAPI)
997 AC_CHECK_LIB(c, inet_ntop, [AC_DEFINE(HAVE_INET_NTOP,,inet_ntop)])
998 AC_CHECK_LIB(c, inet_pton, [AC_DEFINE(HAVE_INET_PTON,,inet_pton)])
999 AC_CHECK_LIB(crypt, crypt)
1000 AC_CHECK_LIB(resolv, res_init)
1001 AC_CHECK_LIB(m, main)
1003 dnl ---------------------------------------------------
1004 dnl BSD/OS 4.1 define inet_XtoY function as __inet_XtoY
1005 dnl ---------------------------------------------------
1006 AC_CHECK_FUNC(__inet_ntop, AC_DEFINE(HAVE_INET_NTOP,,__inet_ntop))
1007 AC_CHECK_FUNC(__inet_pton, AC_DEFINE(HAVE_INET_PTON,,__inet_pton))
1008 AC_CHECK_FUNC(__inet_aton, AC_DEFINE(HAVE_INET_ATON,,__inet_aton))
1010 dnl ---------------------------
1011 dnl check system has GNU regexp
1012 dnl ---------------------------
1013 dnl AC_MSG_CHECKING(whether system has GNU regex)
1014 AC_CHECK_LIB(c, regexec,
1015 [AC_DEFINE(HAVE_GNU_REGEX,,GNU regexp library)
1016  LIB_REGEX=""],
1017 [LIB_REGEX="regex.o"])
1018 AC_SUBST(LIB_REGEX)
1020 dnl ------------------
1021 dnl check Net-SNMP library
1022 dnl ------------------
1023 if test "${enable_snmp}" = "yes"; then
1024     LIBS="${LIBS} -lcrypto"
1025     AC_CHECK_LIB(netsnmp, asn_parse_int,
1026         [AC_DEFINE(HAVE_NETSNMP,,Net SNMP) 
1027          AC_DEFINE(HAVE_SNMP,,SNMP)
1028          LIBS="${LIBS} -lnetsnmp"],
1029         [AC_MSG_ERROR([--enable-snmp given, but cannot find support for SNMP])])
1030     
1031     for ac_snmp in /usr/include \
1032                 /usr/local/include \
1033                 /dev/null; do
1034         test -f "${ac_snmp}/net-snmp/library/asn1.h" && break
1035     done
1036     
1037     case ${ac_snmp} in
1038         /dev/null)
1039                 AC_MSG_ERROR([--enable-snmp given, but can not find header])
1040                 ;;
1041         *)
1042                 SNMP_INCLUDES="-I${ac_snmp}/net-snmp"
1043                 SNMP_INCLUDES="${SNMP_INCLUDES} -I${ac_snmp}/net-snmp/library"
1044                 ;;
1045     esac
1046     
1047     AC_SUBST(SNMP_INCLUDES)
1050 dnl ----------------------------
1051 dnl check sa_len of sockaddr
1052 dnl ----------------------------
1053 AC_MSG_CHECKING(whether struct sockaddr has a sa_len field)
1054 AC_TRY_COMPILE([#include <sys/types.h>
1055 #include <sys/socket.h>
1056 ],[static struct sockaddr ac_i;int ac_j = sizeof (ac_i.sa_len);],
1057 [AC_MSG_RESULT(yes)
1058  AC_DEFINE(HAVE_SA_LEN,,sa_len)],
1059  AC_MSG_RESULT(no))
1061 dnl ----------------------------
1062 dnl check sin_len of sockaddr_in
1063 dnl ----------------------------
1064 AC_MSG_CHECKING(whether struct sockaddr_in has a sin_len field)
1065 AC_TRY_COMPILE([#include <sys/types.h>
1066 #include <netinet/in.h>
1067 ],[static struct sockaddr_in ac_i;int ac_j = sizeof (ac_i.sin_len);],
1068 [AC_MSG_RESULT(yes)
1069  AC_DEFINE(HAVE_SIN_LEN,,sin_len)],
1070  AC_MSG_RESULT(no))
1072 dnl ----------------------------
1073 dnl check sun_len of sockaddr_un
1074 dnl ----------------------------
1075 AC_MSG_CHECKING(whether struct sockaddr_un has a sun_len field)
1076 AC_TRY_COMPILE([#include <sys/types.h>
1077 #include <sys/un.h>
1078 ],[static struct sockaddr_un ac_i;int ac_j = sizeof (ac_i.sun_len);],
1079 [AC_MSG_RESULT(yes)
1080  AC_DEFINE(HAVE_SUN_LEN,,sun_len)],
1081  AC_MSG_RESULT(no))
1083 dnl -----------------------------------
1084 dnl check sin6_scope_id of sockaddr_in6
1085 dnl -----------------------------------
1086 if test "$zebra_cv_ipv6" = yes; then
1087   AC_MSG_CHECKING(whether struct sockaddr_in6 has a sin6_scope_id field)
1088   AC_TRY_COMPILE([#include <sys/types.h>
1089 #include <netinet/in.h>
1090 ],[static struct sockaddr_in6 ac_i;int ac_j = sizeof (ac_i.sin6_scope_id);],
1091 [AC_MSG_RESULT(yes)
1092  AC_DEFINE(HAVE_SIN6_SCOPE_ID,,scope id)],
1093  AC_MSG_RESULT(no))
1096 dnl ----------------------------
1097 dnl check socklen_t exist or not
1098 dnl ----------------------------
1099 AC_MSG_CHECKING(whther socklen_t is defined)
1100 AC_TRY_COMPILE([#include <sys/types.h>
1101 #include <sys/socket.h>
1102 #include <netinet/in.h>
1103 ],[socklen_t ac_x;],
1104 [AC_MSG_RESULT(yes)
1105  AC_DEFINE(HAVE_SOCKLEN_T,,socklen_t)],
1106  AC_MSG_RESULT(no))
1108 dnl ------------------------
1109 dnl check struct sockaddr_dl
1110 dnl ------------------------
1111 AC_MSG_CHECKING(whether struct sockaddr_dl exist)
1112 AC_EGREP_HEADER(sockaddr_dl,
1113 net/if_dl.h,
1114 [AC_MSG_RESULT(yes)
1115  AC_DEFINE(HAVE_SOCKADDR_DL,,sockaddr_dl)],
1116  AC_MSG_RESULT(no))
1118 dnl --------------------------
1119 dnl check structure ifaliasreq
1120 dnl --------------------------
1121 AC_MSG_CHECKING(whether struct ifaliasreq exist)
1122 AC_EGREP_HEADER(ifaliasreq,
1123 net/if.h,
1124 [AC_MSG_RESULT(yes)
1125  AC_DEFINE(HAVE_IFALIASREQ,,ifaliasreq)],
1126  AC_MSG_RESULT(no))
1128 dnl ----------------------------
1129 dnl check structure in6_aliasreq
1130 dnl ----------------------------
1131 AC_MSG_CHECKING(whether struct in6_aliasreq exist)
1132 AC_EGREP_HEADER(in6_aliasreq,
1133 netinet6/in6_var.h,
1134 [AC_MSG_RESULT(yes)
1135  AC_DEFINE(HAVE_IN6_ALIASREQ,,in6_aliasreq)],
1136  AC_MSG_RESULT(no))
1138 dnl -----------------------------------
1139 dnl check ifra_lifetime of in6_aliasreq
1140 dnl -----------------------------------
1141 AC_MSG_CHECKING(whether in6_aliasreq.ifra_lifetime exist)
1142 AC_TRY_COMPILE([#include <sys/types.h>
1143 #include <netinet6/in6_var.h>
1144 ],[static struct if6_aliasreq ac_i;int ac_j = sizeof (ac_i.ifra_lifetime);],
1145 [AC_MSG_RESULT(yes)
1146  AC_DEFINE(HAVE_IFRA_LIFETIME,,Have in6_aliasreq.ifra_lifetime)],
1147  AC_MSG_RESULT(no))
1149 dnl ---------------------------
1150 dnl check structure rt_addrinfo
1151 dnl ---------------------------
1152 AC_MSG_CHECKING(whether struct rt_addrinfo exist)
1153 AC_EGREP_HEADER(rt_addrinfo,
1154 net/route.h,
1155 [AC_MSG_RESULT(yes)
1156  AC_DEFINE(HAVE_RT_ADDRINFO,,rt_addrinfo)],
1157  AC_MSG_RESULT(no))
1159 dnl --------------------------
1160 dnl check structure in_pktinfo
1161 dnl --------------------------
1162 AC_MSG_CHECKING(whether struct in_pktinfo exist)
1163 AC_TRY_COMPILE([#include <netinet/in.h>
1164 ],[struct in_pktinfo ac_x;],
1165 [AC_MSG_RESULT(yes)
1166  AC_DEFINE(HAVE_INPKTINFO,,in_pktinfo)],
1167  AC_MSG_RESULT(no))
1169 dnl ----------------------------------
1170 dnl check struct nd_opt_homeagent_info
1171 dnl ----------------------------------
1172 AC_MSG_CHECKING(whether struct nd_opt_homeagent_info exist)
1173 AC_EGREP_HEADER(nd_opt_homeagent_info,
1174 netinet/icmp6.h,
1175 [AC_MSG_RESULT(yes)
1176  AC_DEFINE(HAVE_ND_OPT_HOMEAGENT_INFO,,nd_opt_homeagent_info)],
1177  AC_MSG_RESULT(no))
1179 dnl --------------------------------
1180 dnl check struct nd_opt_adv_interval
1181 dnl --------------------------------
1182 AC_MSG_CHECKING(whether struct nd_opt_adv_interval exist)
1183 AC_EGREP_HEADER(nd_opt_adv_interval,
1184 netinet/icmp6.h,
1185 [AC_MSG_RESULT(yes)
1186  AC_DEFINE(HAVE_ND_OPT_ADV_INTERVAL,,nd_opt_adv_interval)],
1187  AC_MSG_RESULT(no))
1189 dnl ------------------------------------
1190 dnl check fields in  nd_opt_adv_interval
1191 dnl ------------------------------------
1192 AC_MSG_CHECKING(whether nd_opt_ai_type field exist)
1193 AC_EGREP_HEADER(nd_opt_ai_type,
1194 netinet/icmp6.h,
1195 [AC_MSG_RESULT(yes)
1196  AC_DEFINE(HAVE_ND_OPT_ADV_INTERVAL_AI_FIELDS,,nd_opt_ai_type)],
1197  AC_MSG_RESULT(no))
1199 dnl --------------------------------------
1200 dnl checking for getrusage struct and call
1201 dnl --------------------------------------
1202 AC_MSG_CHECKING(whether getrusage is available)
1203 AC_TRY_COMPILE([#include <sys/resource.h>
1204 ],[struct rusage ac_x; getrusage (RUSAGE_SELF, &ac_x);],
1205 [AC_MSG_RESULT(yes)
1206  AC_DEFINE(HAVE_RUSAGE,,rusage)],
1207  AC_MSG_RESULT(no))
1209 dnl -------------------
1210 dnl capabilities checks
1211 dnl -------------------
1212 if test "${enable_capabilities}" != "no"; then
1213   AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1214   AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1215     [AC_MSG_RESULT(yes)
1216      AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1217      quagga_ac_keepcaps="yes"],
1218      AC_MSG_RESULT(no)
1219   )
1220   if test x"${quagga_ac_keepcaps}" = x"yes"; then
1221     AC_CHECK_HEADERS(sys/capability.h)
1222   fi
1223   if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1224     AC_CHECK_LIB(cap, cap_init, 
1225       [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1226        LIBCAP="-lcap"
1227        quagga_ac_lcaps="yes"]
1228     )
1229   else
1230     AC_CHECK_HEADERS(priv.h,
1231      [AC_MSG_CHECKING(Solaris style privileges are available)
1232       AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1233           [AC_MSG_RESULT(yes)
1234            AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1235            quagga_ac_scaps="yes"],
1236            AC_MSG_RESULT(no)
1237       )
1238      ]
1239    )
1240   fi
1241   if test x"${quagga_ac_scaps}" = x"yes" \
1242        -o x"${quagga_ac_lcaps}" = x"yes"; then
1243     AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1244   fi
1246 AC_SUBST(LIBCAP)
1248 dnl -------------------
1249 dnl test for ucontext.h
1250 dnl -------------------
1251 AC_CHECK_HEADERS(ucontext.h)
1253 dnl ---------------------------
1254 dnl check for glibc 'backtrace'
1255 dnl --------------------------- 
1256 if test "${glibc}" = "yes"; then
1257    AC_CHECK_HEADER([execinfo.h],
1258     [AC_CHECK_FUNC([backtrace],
1259         [AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1260          AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1261         ])
1262     ])
1265 dnl -----------------------------------------
1266 dnl check for malloc mallinfo struct and call
1267 dnl this must try and link using LIBS, in
1268 dnl order to check no alternative allocator
1269 dnl has been specified, which might not provide
1270 dnl mallinfo, e.g. such as Umem on Solaris.
1271 dnl -----------------------------------------
1272 AC_CHECK_HEADERS(malloc.h,
1273  [AC_MSG_CHECKING(whether mallinfo is available)
1274   AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1275                         [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1276       [AC_MSG_RESULT(yes)
1277        AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1278        AC_MSG_RESULT(no)
1279   )
1283 dnl ----------
1284 dnl configure date
1285 dnl ----------
1286 CONFDATE=`date '+%Y%m%d'`
1287 AC_SUBST(CONFDATE)
1289 dnl ------------------------------
1290 dnl set paths for state directory
1291 dnl ------------------------------
1292 if test "${prefix}" = "NONE"; then
1293   quagga_statedir_prefix="";
1294 else
1295   quagga_statedir_prefix=${prefix}
1297 if test "${localstatedir}" = '${prefix}/var'; then
1298   AC_CACHE_CHECK(state directory,ac_statedir,
1299   [for QUAGGA_STATE_DIR in ${quagga_statedir_prefix}/var/run dnl
1300                         ${quagga_statedir_prefix}/var/adm dnl
1301                         ${quagga_statedir_prefix}/etc dnl
1302                         /var/run        dnl
1303                         /var/adm        dnl
1304                         /etc            dnl
1305                         /dev/null;
1306   do
1307     test -d $QUAGGA_STATE_DIR && break
1308   done
1309   quagga_statedir=$QUAGGA_STATE_DIR])
1310 else
1311   quagga_statedir=${localstatedir}
1312   AC_MSG_CHECKING(directory to use for state file)
1313   AC_MSG_RESULT(${quagga_statedir})
1314   AC_SUBST(quagga_statedir)
1316 if test $quagga_statedir = "/dev/null"; then
1317     AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1320 AC_DEFINE_UNQUOTED(PATH_ZEBRA_PID, "$quagga_statedir/zebra.pid",zebra PID)
1321 AC_DEFINE_UNQUOTED(PATH_RIPD_PID, "$quagga_statedir/ripd.pid",ripd PID)
1322 AC_DEFINE_UNQUOTED(PATH_RIPNGD_PID, "$quagga_statedir/ripngd.pid",ripngd PID)
1323 AC_DEFINE_UNQUOTED(PATH_BGPD_PID, "$quagga_statedir/bgpd.pid",bgpd PID)
1324 AC_DEFINE_UNQUOTED(PATH_OSPFD_PID, "$quagga_statedir/ospfd.pid",ospfd PID)
1325 AC_DEFINE_UNQUOTED(PATH_OSPF6D_PID, "$quagga_statedir/ospf6d.pid",ospf6d PID)
1326 AC_DEFINE_UNQUOTED(PATH_ISISD_PID, "$quagga_statedir/isisd.pid",isisd PID)
1327 AC_DEFINE_UNQUOTED(PATH_WATCHQUAGGA_PID, "$quagga_statedir/watchquagga.pid",watchquagga PID)
1328 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$quagga_statedir/zserv.api",zebra api socket)
1329 AC_DEFINE_UNQUOTED(ZEBRA_VTYSH_PATH, "$quagga_statedir/zebra.vty",zebra vty socket)
1330 AC_DEFINE_UNQUOTED(RIP_VTYSH_PATH, "$quagga_statedir/ripd.vty",rip vty socket)
1331 AC_DEFINE_UNQUOTED(RIPNG_VTYSH_PATH, "$quagga_statedir/ripngd.vty",ripng vty socket)
1332 AC_DEFINE_UNQUOTED(BGP_VTYSH_PATH, "$quagga_statedir/bgpd.vty",bgpd vty socket)
1333 AC_DEFINE_UNQUOTED(OSPF_VTYSH_PATH, "$quagga_statedir/ospfd.vty",ospfd vty socket)
1334 AC_DEFINE_UNQUOTED(OSPF6_VTYSH_PATH, "$quagga_statedir/ospf6d.vty",ospf6d vty socket)
1335 AC_DEFINE_UNQUOTED(ISIS_VTYSH_PATH, "$quagga_statedir/isisd.vty",isisd vty socket)
1336 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$quagga_statedir",daemon vty directory)
1338 dnl -------------------------------
1339 dnl Quagga sources should always be 
1340 dnl current wrt interfaces. Dont
1341 dnl allow deprecated interfaces to
1342 dnl be exposed.
1343 dnl -------------------------------
1344 AC_DEFINE(QUAGGA_NO_DEPRECATED_INTERFACES, 1, Hide deprecated interfaces)
1346 dnl ---------------------------
1347 dnl Check htonl works correctly
1348 dnl ---------------------------
1349 AC_MSG_CHECKING(for working htonl)
1350 AC_CACHE_VAL(ac_cv_htonl_works, [
1351 AC_TRY_LINK([#ifdef HAVE_SYS_TYPES_H
1352 #include <sys/types.h>
1353 #endif
1354 #ifdef HAVE_NETDB_H
1355 #include <netdb.h>
1356 #endif
1357 #ifdef HAVE_NETINET_IN_H
1358 #include <netinet/in.h>
1359 #endif],
1360 [htonl (0);],
1361 ac_cv_htonl_works=yes,
1362 ac_cv_htonl_works=no)])
1363 AC_MSG_RESULT($ac_cv_htonl_works)
1365 AC_CONFIG_FILES([Makefile lib/Makefile zebra/Makefile ripd/Makefile 
1366           ripngd/Makefile bgpd/Makefile ospfd/Makefile watchquagga/Makefile
1367           ospf6d/Makefile isisd/Makefile vtysh/Makefile doc/Makefile 
1368           ospfclient/Makefile tests/Makefile m4/Makefile redhat/Makefile
1369           pkgsrc/Makefile
1370           redhat/quagga.spec 
1371           lib/version.h
1372           doc/defines.texi
1373           isisd/topology/Makefile
1374           pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1375           pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh])
1376 AC_CONFIG_FILES([solaris/Makefile])
1378 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1379 ## Hack, but working solution to avoid rebuilding of quagga.info.
1380 ## It's already in CVS until texinfo 4.7 is more common.
1381 AC_CONFIG_COMMANDS([info-time],[touch doc/quagga.info])
1382 AC_OUTPUT
1384 echo "
1385 Quagga configuration
1386 --------------------
1387 quagga version          : ${PACKAGE_VERSION}
1388 host operationg system  : ${host_os}
1389 source code location    : ${srcdir}
1390 compiler                : ${CC}
1391 compiler flags          : ${CFLAGS}
1392 includes                : ${INCLUDES} ${SNMP_INCLUDES}
1393 linker flags            : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE}
1394 state file directory    : ${quagga_statedir}
1395 config file directory   : `eval echo \`echo ${sysconfdir}\``
1396 example directory       : `eval echo \`echo ${exampledir}\``
1397 user to run as          : ${enable_user}
1398 group to run as         : ${enable_group}
1399 group for vty sockets   : ${enable_vty_group}
1400 config file mask        : ${enable_configfile_mask}
1401 log file mask           : ${enable_logfile_mask}
1403 The above user and group must have read/write access to the state file
1404 directory and to the config files in the config file directory."
1406 if test x"$quagga_cv_gnu_make" = x"no"; then echo "
1407 Warning: The ${MAKE-make} programme detected, either in your path or
1408 via the MAKE variable, is not GNU Make. GNU make may be installed as
1409 gmake on some systems. and is required to complete a build of Quagga
1410 " > /dev/stderr