2 ## Configure template file for FRRouting.
3 ## autoconf will generate configure script.
5 ## Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
6 ## Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
10 AC_INIT(frr, 2.0-rc2, [https://github.com/freerangerouting/frr/issues])
11 PACKAGE_URL="https://freerangerouting.org/"
12 PACKAGE_FULLNAME="FRRouting"
13 AC_SUBST(PACKAGE_FULLNAME)
15 CONFIG_ARGS="$ac_configure_args"
18 AC_CONFIG_SRCDIR(lib/zebra.h)
19 AC_CONFIG_MACRO_DIR([m4])
21 dnl -----------------------------------
22 dnl Get hostname and other information.
23 dnl -----------------------------------
28 # Disable portability warnings -- our automake code (in particular
29 # common.am) uses some constructs specific to gmake.
30 AM_INIT_AUTOMAKE([1.6 -Wno-portability])
31 m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
32 AM_SILENT_RULES([yes])
33 AC_CONFIG_HEADERS(config.h)
35 AC_PATH_PROG(PERL, perl)
37 dnl default is to match previous behavior
38 exampledir=${sysconfdir}
39 AC_ARG_ENABLE([exampledir],
40 AS_HELP_STRING([--enable-exampledir],
41 [specify alternate directory for examples]),
42 exampledir="$enableval",)
43 dnl XXX add --exampledir to autoconf standard directory list somehow
46 dnl default is to match previous behavior
49 AC_ARG_ENABLE([pkgsrcrcdir],
50 AS_HELP_STRING([--enable-pkgsrcrcdir],
51 [specify directory for rc.d scripts]),
52 pkgsrcrcdir="$enableval"; pkgsrcdir="pkgsrc",)
53 dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
57 AC_ARG_ENABLE(tcmalloc,
58 AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
59 [case "${enableval}" in
60 yes) tcmalloc_enabled=true
61 LIBS="$LIBS -ltcmalloc_minimal"
63 no) tcmalloc_enabled=false ;;
64 *) AC_MSG_ERROR(bad value ${enableval} for --enable-tcmalloc) ;;
65 esac],[tcmalloc_enabled=false])
68 dnl --------------------
69 dnl Check CC and friends
70 dnl --------------------
71 dnl note orig_cflags is also used further down
77 dnl remove autoconf default "-g -O2"
83 dnl autoconf 2.59 appears not to support AC_PROG_SED
85 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
87 dnl try and enable CFLAGS that are useful for Quagga
88 dnl - specifically, options to control warnings
90 AC_USE_SYSTEM_EXTENSIONS()
91 AC_DEFUN([AC_C_FLAG], [{
93 ac_c_flag_save="$CFLAGS"
95 AC_MSG_CHECKING([[whether $CC supports $1]])
97 [AC_LANG_PROGRAM([[]])],
100 m4_if([$3], [], [], [
101 CFLAGS="$ac_c_flag_save"
105 CFLAGS="$ac_c_flag_save"
112 dnl ICC won't bail on unknown options without -diag-error 10006
113 dnl need to do this first so we get useful results for the other options
114 AC_C_FLAG([-diag-error 10006])
116 dnl if the user specified any CFLAGS, we don't add "-g -Os/-O2" here
117 if test "z$orig_cflags" = "z"; then
124 dnl always want these CFLAGS
125 AC_C_FLAG([-fno-omit-frame-pointer])
128 AC_C_FLAG([-Wmissing-prototypes])
129 AC_C_FLAG([-Wmissing-declarations])
130 AC_C_FLAG([-Wpointer-arith])
131 AC_C_FLAG([-Wbad-function-cast])
132 AC_C_FLAG([-Wwrite-strings])
133 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
134 AC_C_FLAG([-Wcast-qual])
135 AC_C_FLAG([-Wstrict-prototypes])
136 AC_C_FLAG([-Wmissing-noreturn])
137 AC_C_FLAG([-Wmissing-format-attribute])
138 AC_C_FLAG([-Wunreachable-code])
139 AC_C_FLAG([-Wpacked])
140 AC_C_FLAG([-Wpadded])
142 AC_C_FLAG([-Wno-unused-result])
144 AC_C_FLAG([-Wno-unused-parameter])
145 AC_C_FLAG([-Wno-missing-field-initializers])
147 dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
148 dnl for some reason the string consts get 'promoted' to char *,
149 dnl triggering a const to non-const conversion warning.
150 AC_C_FLAG([-diag-disable 3179])
152 if test x"${enable_werror}" = x"yes" ; then
157 dnl need link on this one, not compile
159 ac_ld_flag_save="$LDFLAGS"
160 LDFLAGS="$LDFLAGS -rdynamic"
161 AC_MSG_CHECKING([[whether linker supports -rdynamic]])
163 [AC_LANG_PROGRAM([[]])],
164 [AC_MSG_RESULT([yes])],
166 LDFLAGS="$ac_ld_flag_save"
177 AC_CHECK_TOOL(AR, ar)
179 dnl -----------------
180 dnl System extensions
181 dnl -----------------
189 dnl ----------------------
190 dnl Packages configuration
191 dnl ----------------------
192 AC_ARG_WITH(pkg-extra-version,
193 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]),
194 [EXTRAVERSION=$withval],)
195 AC_ARG_WITH(pkg-git-version,
196 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
197 [ test "x$withval" != "xno" && with_pkg_git_version="yes" ])
199 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for Quagga]))
201 AS_HELP_STRING([--disable-doc], [do not build docs]))
203 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
205 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
207 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
208 AC_ARG_ENABLE(ripngd,
209 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
211 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
212 AC_ARG_ENABLE(ospf6d,
213 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
215 AS_HELP_STRING([--enable-ldpd], [build ldpd]))
216 AC_ARG_ENABLE(watchfrr,
217 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
219 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
221 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
222 AC_ARG_ENABLE(bgp-announce,
223 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
224 AC_ARG_ENABLE(bgp-vnc,
225 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
226 AC_ARG_WITH(rfp-path,
227 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
229 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
231 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
232 AC_ARG_ENABLE(tcp-zebra,
233 AS_HELP_STRING([--enable-tcp-zebra], [enable TCP/IP socket connection between zebra and protocol daemon]))
234 AC_ARG_ENABLE(ospfapi,
235 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
236 AC_ARG_ENABLE(ospfclient,
237 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
238 (this is the default if --disable-ospfapi is set)]))
239 AC_ARG_ENABLE(multipath,
240 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
242 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
244 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
245 AC_ARG_ENABLE(vty_group,
246 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
247 AC_ARG_ENABLE(configfile_mask,
248 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
249 AC_ARG_ENABLE(logfile_mask,
250 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
251 AC_ARG_ENABLE(shell_access,
252 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
254 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
256 AS_HELP_STRING([--enable-irdp], [enable IRDP server support in zebra]))
257 AC_ARG_ENABLE(capabilities,
258 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
259 AC_ARG_ENABLE(rusage,
260 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
261 AC_ARG_ENABLE(gcc_ultra_verbose,
262 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
263 AC_ARG_ENABLE(linux24_tcp_md5,
264 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
265 AC_ARG_ENABLE(backtrace,
266 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
267 AC_ARG_ENABLE(time-check,
268 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
269 AC_ARG_ENABLE(pcreposix,
270 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
272 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
273 AC_ARG_ENABLE(systemd,
274 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
276 AS_HELP_STRING([--enable-poll], [enable usage of Poll instead of select]))
277 AC_ARG_ENABLE(werror,
278 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
279 AC_ARG_ENABLE(cumulus,
280 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
281 AC_ARG_ENABLE(rr-semantics,
282 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
283 AC_ARG_ENABLE([protobuf],
284 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
286 AC_CHECK_HEADERS(json-c/json.h)
287 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c")
288 if test $ac_cv_lib_json_c_json_object_get = no; then
289 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
290 if test $ac_cv_lib_json_json_object_get = no; then
291 AC_MSG_ERROR([lib json is needed to compile])
295 AC_ARG_ENABLE([dev_build],
296 AS_HELP_STRING([--enable-dev-build], [build for development]))
298 if test x"${enable_time_check}" != x"no" ; then
299 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
300 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
302 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
306 case "${enable_systemd}" in
309 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
310 if test $ac_cv_lib_systemd_sd_notify = no; then
311 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
313 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
319 if test "${enable_rr_semantics}" != "no" ; then
320 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
323 if test "${enable_poll}" = "yes" ; then
324 AC_DEFINE(HAVE_POLL,,Compile systemd support in)
330 AC_MSG_CHECKING(whether this OS has MPLS stack)
333 MPLS_METHOD="zebra_mpls_netlink.o"
334 AC_MSG_RESULT(Linux MPLS)
337 MPLS_METHOD="zebra_mpls_openbsd.o"
338 AC_MSG_RESULT(OpenBSD MPLS)
341 MPLS_METHOD="zebra_mpls_null.o"
342 AC_MSG_RESULT(Unsupported kernel)
345 AC_SUBST(MPLS_METHOD)
347 if test "${enable_cumulus}" = "yes" ; then
348 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
349 DFLT_NAME="datacenter"
351 DFLT_NAME="traditional"
354 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
356 if test "${enable_shell_access}" = "yes"; then
357 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
360 if test "${enable_fpm}" = "yes"; then
361 AC_DEFINE(HAVE_FPM,,Forwarding Plane Manager support)
364 if test "x${enable_dev_build}" = "xyes"; then
365 AC_DEFINE(DEV_BUILD,,Build for development)
367 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
370 # Logic for protobuf support.
372 if test "$enable_protobuf" = "yes"; then
376 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
377 if test "x$PROTOC_C" = "x/bin/false"; then
381 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
382 [found_protobuf_c=yes],
383 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
385 if test "x$found_protobuf_c" = "xyes"; then
386 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
387 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
389 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
390 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
395 # Fail if the user explicity enabled protobuf support and we couldn't
396 # find the compiler or libraries.
397 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
398 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
401 if test "x$have_protobuf" = "xyes"; then
402 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
405 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
408 # End of logic for protobuf support.
411 if test "${enable_tcp_zebra}" = "yes"; then
412 AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
415 if test "${enable_linux24_tcp_md5}" = "yes"; then
416 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
419 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
420 if test "${enable_rtadv}" != "no"; then
422 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
427 if test "${enable_irdp}" = "yes"; then
428 AC_DEFINE(HAVE_IRDP,, IRDP )
431 if test x"${enable_user}" = x"no"; then
434 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
437 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
440 if test x"${enable_group}" = x"no"; then
443 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
446 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
449 if test x"${enable_vty_group}" = x"yes" ; then
450 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
451 elif test x"${enable_vty_group}" != x""; then
452 if test x"${enable_vty_group}" != x"no"; then
453 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
456 AC_SUBST([enable_user])
457 AC_SUBST([enable_group])
458 AC_SUBST([enable_vty_group])
460 enable_configfile_mask=${enable_configfile_mask:-0600}
461 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
463 enable_logfile_mask=${enable_logfile_mask:-0600}
464 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
468 case "${enable_multipath}" in
472 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
473 MPATH_NUM="${enable_multipath}"
478 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
482 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
484 dnl -----------------------------------
485 dnl Add extra version string to package
486 dnl name, string and version fields.
487 dnl -----------------------------------
488 if test "x${EXTRAVERSION}" != "x" ; then
489 VERSION="${VERSION}${EXTRAVERSION}"
490 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
491 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
492 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
495 if test "x$with_pkg_git_version" = "xyes"; then
496 if test -d "${srcdir}/.git"; then
497 AC_DEFINE(GIT_VERSION, [1], [include git version info])
498 else with_pkg_git_version="no"
499 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
502 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
504 dnl ------------------------------------
505 dnl Check C keywords and standard types
506 dnl ------------------------------------
517 dnl -------------------------
518 dnl Check other header files.
519 dnl -------------------------
520 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
521 linux/version.h asm/types.h \
524 dnl Utility macro to avoid retyping includes all the time
525 m4_define([FRR_INCLUDES],
528 #define __EXTENSIONS__
533 #include <sys/types.h>
534 /* sys/conf.h depends on param.h on FBSD at least */
535 #include <sys/param.h>
536 /* Required for MAXSIG */
538 #include <sys/socket.h>
540 # define __APPLE_USE_RFC_3542
542 #include <netinet/in.h>
543 #include <sys/time.h>
548 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
549 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
550 dnl an additional round for it.
552 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
554 m4_define([FRR_INCLUDES],
556 [#if HAVE_NET_IF_VAR_H
557 # include <net/if_var.h>
561 AC_CHECK_HEADERS([netinet/in_var.h \
562 net/if_dl.h net/netopt.h \
563 inet/nd.h netinet/ip_icmp.h \
564 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
565 [], [], FRR_INCLUDES)
567 AC_CHECK_HEADERS([ucontext.h], [], [],
570 #endif /* __USE_GNU */
574 m4_define([UCONTEXT_INCLUDES],
575 [#include <ucontext.h>])dnl
577 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
578 [], [], [UCONTEXT_INCLUDES])
579 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
580 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
581 [], [], [UCONTEXT_INCLUDES])],
582 [], [UCONTEXT_INCLUDES])
583 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
584 [], [], [UCONTEXT_INCLUDES])
586 m4_define([FRR_INCLUDES],
590 #include <netinet/in_systm.h>
591 #if HAVE_NETINET_IN_VAR_H
592 # include <netinet/in_var.h>
595 # include <net/if_dl.h>
597 #if HAVE_NET_NETOPT_H
598 # include <net/netopt.h>
600 #include <net/route.h>
602 # include <inet/nd.h>
604 #include <arpa/inet.h>
605 /* Required for IDRP */
606 #if HAVE_NETINET_IP_ICMP_H
607 # include <netinet/ip_icmp.h>
611 dnl V6 headers are checked below, after we check for v6
613 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
615 [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
617 AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
618 AC_DEFINE(SUNOS_5, 1, SunOS 5)
619 AC_CHECK_LIB(xnet, main)
624 | [*-sunos5.1[0-9]] \
625 | [*-sunos5.1[0-9].[0-9]] \
626 | [*-solaris2.[8-9]] \
627 | [*-solaris2.1[0-9]] \
628 | [*-solaris2.1[0-9].[0-9]])
630 AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
631 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
632 AC_CHECK_LIB(socket, main)
633 AC_CHECK_LIB(nsl, main)
634 AC_CHECK_LIB(umem, main)
635 AC_CHECK_FUNCS([printstack],
636 [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
637 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
642 *-sunos5* | *-solaris2*)
643 AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
644 AC_CHECK_LIB(socket, main)
645 AC_CHECK_LIB(nsl, main)
651 AC_DEFINE(GNU_LINUX,,GNU Linux)
655 AC_DEFINE(OPEN_BSD,,OpenBSD)
661 dnl ---------------------
662 dnl Integrated VTY option
663 dnl ---------------------
664 case "${enable_vtysh}" in
667 AC_DEFINE(VTYSH,,VTY shell)
668 dnl Vtysh uses libreadline, which looks for termcap functions at
669 dnl configure time. We follow readlines search order.
670 dnl The required procedures are in libtermcap on NetBSD, in
671 dnl [TODO] on Linux, and in [TODO] on Solaris.
672 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
673 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
674 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
675 [AC_CHECK_LIB(ncurses, tputs,
676 LIBREADLINE="$LIBREADLINE -lncurses")]
680 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
682 if test $ac_cv_lib_readline_main = no; then
683 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
685 AC_CHECK_HEADER(readline/history.h)
686 if test $ac_cv_header_readline_history_h = no;then
687 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
689 AC_CHECK_LIB(readline, rl_completion_matches,
690 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
691 if test $ac_cv_lib_readline_rl_completion_matches = no; then
692 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
696 AC_SUBST(LIBREADLINE)
697 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
702 dnl Quagga detects the PAM library it is built against by checking for a
703 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
704 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
705 dnl openpam.h doesn't do that, although depends on the header too. Hence a
706 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
709 if test "$with_libpam" = "yes"; then
710 AC_CHECK_HEADER([security/pam_misc.h],
711 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
712 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
713 pam_conv_func="misc_conv"
716 AC_CHECK_HEADER([security/openpam.h],
717 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
718 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
719 pam_conv_func="openpam_ttyconv"
721 [], FRR_INCLUDES[#include <security/pam_appl.h>])
722 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
723 AC_MSG_WARN([*** pam support will not be built ***])
728 if test "$with_libpam" = "yes"; then
729 dnl took this test from proftpds configure.in and suited to our needs
730 dnl -------------------------------------------------------------------------
732 dnl This next check looks funky due to a linker problem with some versions
733 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
734 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
735 dnl with RedHat 6.2 and Debian 2.2 or better.
736 AC_CHECK_LIB(pam, pam_start,
737 [AC_CHECK_LIB(pam, $pam_conv_func,
738 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
740 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
741 LIBPAM="-lpam -lpam_misc"]
745 [AC_CHECK_LIB(pam, pam_end,
746 [AC_CHECK_LIB(pam, $pam_conv_func,
747 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
748 LIBPAM="-lpam -ldl"],
749 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
750 LIBPAM="-lpam -ldl -lpam_misc"]
752 ],AC_MSG_WARN([*** pam support will not be built ***]),
759 dnl -------------------------------
760 dnl Endian-ness check
761 dnl -------------------------------
764 dnl -------------------------------
765 dnl check the size in byte of the C
766 dnl -------------------------------
767 dnl AC_CHECK_SIZEOF(char)
768 dnl AC_CHECK_SIZEOF(int)
769 dnl AC_CHECK_SIZEOF(short)
770 dnl AC_CHECK_SIZEOF(long)
772 dnl ----------------------------
773 dnl check existance of functions
774 dnl ----------------------------
780 dnl -------------------------------
781 dnl bgpd needs pow() and hence libm
782 dnl -------------------------------
784 AC_CHECK_HEADER([math.h],
785 [AC_CHECK_LIB([m], [pow],
788 AC_DEFINE(HAVE_LIBM,, Have libm)
789 AC_CHECK_FUNCS(pow,[],[LIBM=""])
792 if test x"$LIBM" = x ; then
793 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
806 AC_CHECK_HEADER([asm-generic/unistd.h],
807 [AC_CHECK_DECL(__NR_setns,
808 AC_DEFINE(HAVE_NETNS,, Have netns),,
809 FRR_INCLUDES [#include <asm-generic/unistd.h>
811 AC_CHECK_FUNCS(setns)]
814 dnl ------------------------------------
815 dnl Determine routing get and set method
816 dnl ------------------------------------
817 AC_MSG_CHECKING(zebra between kernel interface method)
818 if test x"$opsys" = x"gnu-linux"; then
819 AC_MSG_RESULT(netlink)
820 RT_METHOD=rt_netlink.o
821 KERNEL_METHOD=kernel_netlink.o
822 AC_DEFINE(HAVE_NETLINK,,netlink)
824 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
826 AC_MSG_RESULT(Route socket)
827 KERNEL_METHOD="kernel_socket.o"
828 RT_METHOD="rt_socket.o"
831 AC_SUBST(KERNEL_METHOD)
832 AM_CONDITIONAL([HAVE_NETLINK], [test "x$netlink" = "xyes"])
834 dnl --------------------------
835 dnl Determine IS-IS I/O method
836 dnl --------------------------
837 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
838 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
839 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
840 AC_CHECK_HEADER(net/bpf.h)
841 AC_CHECK_HEADER(sys/dlpi.h)
842 AC_MSG_CHECKING(zebra IS-IS I/O method)
843 if test x"$opsys" = x"gnu-linux"; then
844 AC_MSG_RESULT(pfpacket)
845 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
846 elif test x"$opsys" = x"sol2-6" -o x"$opsys" = x"sol8"; then
848 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
850 if test $ac_cv_header_net_bpf_h = no; then
851 if test $ac_cv_header_sys_dlpi_h = no; then
853 AC_MSG_WARN([*** IS-IS support will not be built ***])
858 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
861 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
864 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
866 dnl ------------------------------------
867 dnl check for broken CMSG_FIRSTHDR macro
868 dnl ------------------------------------
869 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
870 AC_RUN_IFELSE([AC_LANG_SOURCE([[
873 #define __EXTENSIONS__
876 #include <sys/types.h>
877 #include <sys/socket.h>
884 msg.msg_control = buf;
885 msg.msg_controllen = 0;
887 if (CMSG_FIRSTHDR(&msg) != NULL)
890 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
891 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
893 dnl ------------------------------
894 dnl check kernel route read method
895 dnl ------------------------------
896 AC_CACHE_CHECK([route read method], [frr_cv_rtread_method],
897 [if test "x$netlink" = xyes; then
898 frr_cv_rtread_method="netlink"
900 for frr_cv_rtread_method in /dev/ip /dev/null;
902 test x`ls $frr_cv_rtread_method 2>/dev/null` = x"$frr_cv_rtread_method" && break
904 case $frr_cv_rtread_method in
907 *-freebsd*) frr_cv_rtread_method="sysctl";;
908 *) frr_cv_rtread_method="getmsg";;
911 frr_cv_rtread_method="sysctl";;
914 RTREAD_METHOD=rtread_${frr_cv_rtread_method}.o
915 AC_SUBST(RTREAD_METHOD)
917 dnl -----------------------------
918 dnl check interface lookup method
919 dnl -----------------------------
921 AC_MSG_CHECKING(interface looking up method)
922 if test "$netlink" = yes; then
923 AC_MSG_RESULT(netlink)
924 IF_METHOD=if_netlink.o
925 elif test "$opsys" = "sol2-6";then
926 AC_MSG_RESULT(Solaris GIF)
928 elif test "$opsys" = "sol8";then
929 AC_MSG_RESULT(Solaris GLIF)
930 IF_METHOD=if_ioctl_solaris.o
931 IOCTL_METHOD=ioctl_solaris.o
932 elif test "$opsys" = "openbsd";then
933 AC_MSG_RESULT(openbsd)
935 elif grep NET_RT_IFLIST /usr/include/sys/socket.h >/dev/null 2>&1; then
936 AC_MSG_RESULT(sysctl)
937 IF_METHOD=if_sysctl.o
938 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
944 AC_SUBST(IOCTL_METHOD)
946 dnl ---------------------------------------------------------------
947 dnl figure out how to specify an interface in multicast sockets API
948 dnl ---------------------------------------------------------------
949 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
951 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
952 #include <sys/socket.h>
953 #include <netinet/in.h>
954 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
955 #include <linux/types.h>
958 m4_define([FRR_INCLUDES],
960 [#if HAVE_LINUX_MROUTE_H
961 # include <linux/mroute.h>
965 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
966 #include <sys/socket.h>
967 #include <sys/types.h>
968 #include <netinet/in.h>
969 #include <net/route.h>
972 m4_define([FRR_INCLUDES],
974 [#if HAVE_NETINET_IP_MROUTE_H
975 # include <netinet/ip_mroute.h>
979 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
980 AC_TRY_COMPILE([#include <sys/param.h>],
981 [#if (defined(__FreeBSD__) && ((__FreeBSD_version >= 500022 && __FreeBSD_version < 700000) || (__FreeBSD_version < 500000 && __FreeBSD_version >= 440000))) || (defined(__NetBSD__) && defined(__NetBSD_Version__) && __NetBSD_Version__ >= 106010000) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__DragonFly__) || defined(__sun)
984 #error No support for BSD struct ip_mreq hack detected
985 #endif],[AC_MSG_RESULT(yes)
986 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
989 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
991 #include <sys/types.h>
992 #include <netinet/in.h>
993 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
994 ], [AC_MSG_RESULT(yes)
995 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
998 dnl ---------------------------------------------------------------
999 dnl figure out how to check link-state
1000 dnl ---------------------------------------------------------------
1001 AC_CHECK_HEADER( [net/if_media.h],
1002 [m4_define([LINK_DETECT_INCLUDES],
1004 [#include <net/if_media.h>
1006 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1007 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1008 [], LINK_DETECT_INCLUDES)],
1012 dnl ---------------------------------------------------------------
1013 dnl Additional, newer way to check link-state using ifi_link_state.
1014 dnl Not available in all BSD's when ifmediareq available
1015 dnl ---------------------------------------------------------------
1016 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1017 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1020 dnl ------------------------
1021 dnl TCP_MD5SIG socket option
1022 dnl ------------------------
1024 AC_CHECK_HEADER([netinet/tcp.h],
1025 [m4_define([MD5_INCLUDES],
1027 [#include <netinet/tcp.h>
1029 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1032 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1033 AC_CHECK_HEADER([linux/tcp.h],
1034 [m4_define([MD5_INCLUDES],
1036 [#include <linux/tcp.h>
1038 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1041 dnl -----------------------------
1042 dnl check ipforward detect method
1043 dnl -----------------------------
1044 AC_CACHE_CHECK([ipforward method], [frr_cv_ipforward_method],
1045 [if test x$cross_compiling = xyes; then
1046 if test x"$opsys" = x"gnu-linux"; then
1047 frr_cv_ipforward_method=/proc/net/snmp
1049 frr_cv_ipforward_method=/dev/ip
1052 for frr_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null;
1054 test x`ls $frr_cv_ipforward_method 2>/dev/null` = x"$frr_cv_ipforward_method" && break
1057 case $frr_cv_ipforward_method in
1058 "/proc/net/snmp") frr_cv_ipforward_method="proc";;
1061 *-freebsd*) frr_cv_ipforward_method="sysctl";;
1062 *) frr_cv_ipforward_method="solaris";;
1064 *) frr_cv_ipforward_method="sysctl";;
1066 IPFORWARD=ipforward_${frr_cv_ipforward_method}.o
1069 dnl ----------------------------------------------------------------------------
1070 dnl figure out if domainname is available in the utsname struct (GNU extension).
1071 dnl ----------------------------------------------------------------------------
1072 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1077 AC_MSG_CHECKING(whether does this OS have IPv6 stack)
1081 if grep WIDE /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1082 AC_DEFINE(KAME,1,KAME IPv6)
1084 dnl ------------------------------------
1085 dnl Solaris 9, 10 and potentially higher
1086 dnl ------------------------------------
1087 elif test x"$opsys" = x"sol8"; then
1088 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
1089 AC_MSG_RESULT(Solaris IPv6)
1093 elif test x"$opsys" = x"gnu-linux"; then
1094 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
1095 dnl Linux has a compilation problem with mixing
1096 dnl netinet/in.h and linux/in6.h they are not
1097 dnl compatible. There has been discussion on
1098 dnl how to fix it but no real progress on implementation
1099 dnl when they fix it, remove this
1100 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
1101 AC_MSG_RESULT(Linux IPv6)
1103 AC_MSG_ERROR([Failed to detect IPv6 stack])
1106 dnl this is unconditial, for compatibility
1107 AC_DEFINE(HAVE_IPV6,1,IPv6)
1109 dnl ------------------
1110 dnl IPv6 header checks
1111 dnl ------------------
1112 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1113 netinet6/in6_var.h netinet6/nd6.h], [], [],
1116 m4_define([FRR_INCLUDES],dnl
1118 [#if HAVE_NETINET6_IN6_H
1119 #include <netinet6/in6.h>
1121 #if HAVE_NETINET_IN6_VAR_H
1122 #include <netinet/in6_var.h>
1124 #include <netinet/icmp6.h>
1125 #if HAVE_NETINET6_IN6_VAR_H
1126 # include <netinet6/in6_var.h>
1128 #if HAVE_NETINET6_ND6_H
1129 # include <netinet6/nd6.h>
1133 dnl disable doc check
1134 if test "${enable_doc}" = "no";then
1140 dnl --------------------
1141 dnl Daemon disable check
1142 dnl --------------------
1143 if test "${enable_zebra}" = "no";then
1148 AM_CONDITIONAL(ZEBRA, test "x$ZEBRA" = "xzebra")
1150 if test "${enable_bgpd}" = "no";then
1155 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1157 if test "${enable_ripd}" = "no";then
1162 AM_CONDITIONAL(RIPD, test "x$RIPD" = "xripd")
1164 if test "${enable_ospfd}" = "no";then
1169 AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd")
1171 if test "${enable_ldpd}" = "yes";then
1173 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1177 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1179 if test "${enable_watchfrr}" = "no";then
1184 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1187 if test "${enable_ospfapi}" != "no";then
1188 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1190 if test "${enable_ospfclient}" != "no";then
1191 OSPFCLIENT="ospfclient"
1195 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1197 case "${enable_ripngd}" in
1199 * ) RIPNGD="ripngd";;
1201 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1203 case "${enable_ospf6d}" in
1205 * ) OSPF6D="ospf6d";;
1207 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1209 case "${enable_isisd}" in
1213 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1215 case "${enable_pimd}" in
1219 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1221 if test "${enable_bgp_announce}" = "no";then
1222 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1224 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1227 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1228 with_rfp_path="bgpd/rfp-example"
1230 if test "${with_rfp_path}" != "no"; then
1231 VNC_RFP_PATH="${with_rfp_path}"
1232 AC_SUBST(VNC_RFP_PATH)
1235 if test "${enable_bgp_vnc}" != "no";then
1236 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1237 RFPTEST="${with_rfp_path}/rfptest"
1238 LIBRFP="${with_rfp_path}/librfp"
1239 RFPINC="${with_rfp_path}/librfp"
1243 RFPINC="bgpd/rfp-example/librfp"
1246 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1265 AC_SUBST(OSPFCLIENT)
1267 AC_CHECK_LIB(crypt, crypt)
1268 AC_CHECK_LIB(resolv, res_init)
1270 dnl ---------------------------
1271 dnl check system has PCRE regexp
1272 dnl ---------------------------
1273 if test "x$enable_pcreposix" = "xyes"; then
1274 AC_CHECK_LIB(pcreposix, pcreposix_regexec, ,[enable_pcreposix=no
1275 AC_MSG_WARN([*** falling back to other regex library ***]) ])
1277 AC_SUBST(HAVE_LIBPCREPOSIX)
1279 dnl ------------------
1280 dnl check Net-SNMP library
1281 dnl ------------------
1282 if test "${enable_snmp}" != ""; then
1283 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1284 if test x"$NETSNMP_CONFIG" = x"no"; then
1285 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1287 LIBS="$LIBS `${NETSNMP_CONFIG} --agent-libs`"
1288 CFLAGS="`${NETSNMP_CONFIG} --base-cflags` $CFLAGS"
1289 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1290 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1297 ])],[AC_MSG_RESULT(yes)],[
1299 AC_MSG_ERROR([--enable-snmp given but not usable])])
1300 AC_DEFINE(HAVE_SNMP,,SNMP)
1301 case "${enable_snmp}" in
1306 SNMP_METHOD="${enable_snmp}"
1309 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1312 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1313 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1314 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1317 dnl ---------------------------
1318 dnl sockaddr and netinet checks
1319 dnl ---------------------------
1322 struct vifctl, struct mfcctl, struct sioc_sg_req,
1323 vifi_t, struct sioc_vif_req, struct igmpmsg,
1324 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1325 struct nd_opt_adv_interval, struct rt_addrinfo,
1326 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1327 [], [], FRR_INCLUDES)
1329 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1330 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1331 struct sockaddr_dl.sdl_len,
1332 struct if6_aliasreq.ifra_lifetime,
1333 struct nd_opt_adv_interval.nd_opt_ai_type],
1334 [], [], FRR_INCLUDES)
1336 dnl ---------------------------
1337 dnl IRDP/pktinfo/icmphdr checks
1338 dnl ---------------------------
1339 AC_CHECK_TYPES([struct in_pktinfo],
1340 [AC_CHECK_TYPES([struct icmphdr],
1341 [if test "${enable_irdp}" != "no"; then
1342 AC_DEFINE(HAVE_IRDP,, IRDP)
1344 [if test "${enable_irdp}" = "yes"; then
1345 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1346 fi], [FRR_INCLUDES])],
1347 [if test "${enable_irdp}" = "yes"; then
1348 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1349 fi], [FRR_INCLUDES])
1351 dnl -----------------------
1352 dnl checking for IP_PKTINFO
1353 dnl -----------------------
1354 AC_MSG_CHECKING(for IP_PKTINFO)
1355 AC_TRY_COMPILE([#include <netdb.h>], [
1356 int opt = IP_PKTINFO;
1359 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1364 dnl ---------------------------
1365 dnl checking for IP_RECVDSTADDR
1366 dnl ---------------------------
1367 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1368 AC_TRY_COMPILE([#include <netinet/in.h>], [
1369 int opt = IP_RECVDSTADDR;
1372 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1377 dnl ----------------------
1378 dnl checking for IP_RECVIF
1379 dnl ----------------------
1380 AC_MSG_CHECKING(for IP_RECVIF)
1381 AC_TRY_COMPILE([#include <netinet/in.h>], [
1382 int opt = IP_RECVIF;
1385 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1390 dnl ----------------------
1391 dnl checking for SO_BINDANY
1392 dnl ----------------------
1393 AC_MSG_CHECKING(for SO_BINDANY)
1394 AC_TRY_COMPILE([#include <sys/socket.h>], [
1395 int opt = SO_BINDANY;
1398 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1403 dnl ----------------------
1404 dnl checking for IP_FREEBIND
1405 dnl ----------------------
1406 AC_MSG_CHECKING(for IP_FREEBIND)
1407 AC_TRY_COMPILE([#include <netinet/in.h>], [
1408 int opt = IP_FREEBIND;
1411 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1416 dnl --------------------------------------
1417 dnl checking for clock_time monotonic struct and call
1418 dnl --------------------------------------
1419 AC_CHECK_DECL(CLOCK_MONOTONIC,
1420 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1421 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1422 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1424 dnl -------------------
1425 dnl capabilities checks
1426 dnl -------------------
1427 if test "${enable_capabilities}" != "no"; then
1428 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1429 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1431 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1432 frr_ac_keepcaps="yes"],
1435 if test x"${frr_ac_keepcaps}" = x"yes"; then
1436 AC_CHECK_HEADERS(sys/capability.h)
1438 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1439 AC_CHECK_LIB(cap, cap_init,
1440 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1445 AC_CHECK_HEADERS(priv.h,
1446 [AC_MSG_CHECKING(Solaris style privileges are available)
1447 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1449 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1450 frr_ac_scaps="yes"],
1456 if test x"${frr_ac_scaps}" = x"yes" \
1457 -o x"${frr_ac_lcaps}" = x"yes"; then
1458 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1463 dnl ---------------------------
1464 dnl check for glibc 'backtrace'
1465 dnl ---------------------------
1466 if test x"${enable_backtrace}" != x"no" ; then
1468 AC_CHECK_HEADER([execinfo.h], [
1469 AC_SEARCH_LIBS([backtrace], [execinfo], [
1470 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1471 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1476 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1477 dnl user explicitly requested backtrace but we failed to find support
1478 AC_MSG_FAILURE([failed to find backtrace support])
1482 dnl -----------------------------------------
1483 dnl check for malloc mallinfo struct and call
1484 dnl this must try and link using LIBS, in
1485 dnl order to check no alternative allocator
1486 dnl has been specified, which might not provide
1487 dnl mallinfo, e.g. such as Umem on Solaris.
1488 dnl -----------------------------------------
1489 AC_CHECK_HEADER([malloc.h],
1490 [AC_MSG_CHECKING(whether mallinfo is available)
1491 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1492 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1494 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1497 ], [], FRR_INCLUDES)
1502 CONFDATE=`date '+%Y%m%d'`
1505 dnl ------------------------------
1506 dnl set paths for state directory
1507 dnl ------------------------------
1508 AC_MSG_CHECKING(directory to use for state file)
1509 if test "${prefix}" = "NONE"; then
1510 frr_statedir_prefix="";
1512 frr_statedir_prefix=${prefix}
1514 if test "${localstatedir}" = '${prefix}/var'; then
1515 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1516 ${frr_statedir_prefix}/var/adm dnl
1517 ${frr_statedir_prefix}/etc dnl
1523 test -d $FRR_STATE_DIR && break
1525 frr_statedir=$FRR_STATE_DIR
1527 frr_statedir=${localstatedir}
1529 if test $frr_statedir = "/dev/null"; then
1530 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1532 AC_MSG_RESULT(${frr_statedir})
1533 AC_SUBST(frr_statedir)
1535 AC_DEFINE_UNQUOTED(PATH_ZEBRA_PID, "$frr_statedir/zebra.pid",zebra PID)
1536 AC_DEFINE_UNQUOTED(PATH_RIPD_PID, "$frr_statedir/ripd.pid",ripd PID)
1537 AC_DEFINE_UNQUOTED(PATH_RIPNGD_PID, "$frr_statedir/ripngd.pid",ripngd PID)
1538 AC_DEFINE_UNQUOTED(PATH_BGPD_PID, "$frr_statedir/bgpd.pid",bgpd PID)
1539 AC_DEFINE_UNQUOTED(PATH_OSPFD_PID, "$frr_statedir/ospfd.pid",ospfd PID)
1540 AC_DEFINE_UNQUOTED(PATH_OSPF6D_PID, "$frr_statedir/ospf6d.pid",ospf6d PID)
1541 AC_DEFINE_UNQUOTED(PATH_LDPD_PID, "$frr_statedir/ldpd.pid",ldpd PID)
1542 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1543 AC_DEFINE_UNQUOTED(PATH_ISISD_PID, "$frr_statedir/isisd.pid",isisd PID)
1544 AC_DEFINE_UNQUOTED(PATH_PIMD_PID, "$frr_statedir/pimd.pid",pimd PID)
1545 AC_DEFINE_UNQUOTED(PATH_WATCHFRR_PID, "$frr_statedir/watchfrr.pid",watchfrr PID)
1546 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1547 AC_DEFINE_UNQUOTED(ZEBRA_VTYSH_PATH, "$frr_statedir/zebra.vty",zebra vty socket)
1548 AC_DEFINE_UNQUOTED(RIP_VTYSH_PATH, "$frr_statedir/ripd.vty",rip vty socket)
1549 AC_DEFINE_UNQUOTED(RIPNG_VTYSH_PATH, "$frr_statedir/ripngd.vty",ripng vty socket)
1550 AC_DEFINE_UNQUOTED(BGP_VTYSH_PATH, "$frr_statedir/bgpd.vty",bgpd vty socket)
1551 AC_DEFINE_UNQUOTED(OSPF_VTYSH_PATH, "$frr_statedir/ospfd.vty",ospfd vty socket)
1552 AC_DEFINE_UNQUOTED(OSPF6_VTYSH_PATH, "$frr_statedir/ospf6d.vty",ospf6d vty socket)
1553 AC_DEFINE_UNQUOTED(LDP_VTYSH_PATH, "$frr_statedir/ldpd.vty",ldpd vty socket)
1554 AC_DEFINE_UNQUOTED(ISIS_VTYSH_PATH, "$frr_statedir/isisd.vty",isisd vty socket)
1555 AC_DEFINE_UNQUOTED(PIM_VTYSH_PATH, "$frr_statedir/pimd.vty",pimd vty socket)
1556 AC_DEFINE_UNQUOTED(WATCHFRR_VTYSH_PATH, "$frr_statedir/watchfrr.vty",watchfrr vty socket)
1557 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1559 dnl autoconf does this, but it does it too late...
1560 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1561 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1563 dnl get the full path, recursing through variables...
1564 vtysh_bin="$bindir/vtysh"
1565 for I in 1 2 3 4 5 6 7 8 9 10; do
1566 eval vtysh_bin="\"$vtysh_bin\""
1568 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1570 CFG_SYSCONF="$sysconfdir"
1572 CFG_STATE="$frr_statedir"
1573 for I in 1 2 3 4 5 6 7 8 9 10; do
1574 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1575 eval CFG_SBIN="\"$CFG_SBIN\""
1576 eval CFG_STATE="\"$CFG_STATE\""
1578 AC_SUBST(CFG_SYSCONF)
1582 dnl ---------------------------
1583 dnl Check htonl works correctly
1584 dnl ---------------------------
1585 AC_MSG_CHECKING(for working htonl)
1586 AC_CACHE_VAL(ac_cv_htonl_works,
1587 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1588 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1591 AC_MSG_RESULT($ac_cv_htonl_works)
1593 AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile
1594 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile
1595 ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile
1596 doc/Makefile ospfclient/Makefile tests/Makefile m4/Makefile
1605 snapcraft/snapcraft.yaml
1607 tests/lib/cli/test_cli.refout
1622 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1623 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh])
1625 if test "${enable_bgp_vnc}" != "no"; then
1626 if test "${with_rfp_path}" = "bgpd/rfp-example" ; then
1627 AC_CONFIG_FILES([bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile])
1629 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1633 AC_CONFIG_FILES([solaris/Makefile])
1635 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1637 ## Hack, but working solution to avoid rebuilding of quagga.info.
1638 ## It's already in CVS until texinfo 4.7 is more common.
1642 FRRouting configuration
1643 ------------------------------
1644 FRR version : ${PACKAGE_VERSION}
1645 host operating system : ${host_os}
1646 source code location : ${srcdir}
1648 compiler flags : ${CFLAGS}
1650 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1651 state file directory : ${frr_statedir}
1652 config file directory : `eval echo \`echo ${sysconfdir}\``
1653 example directory : `eval echo \`echo ${exampledir}\``
1654 user to run as : ${enable_user}
1655 group to run as : ${enable_group}
1656 group for vty sockets : ${enable_vty_group}
1657 config file mask : ${enable_configfile_mask}
1658 log file mask : ${enable_logfile_mask}
1659 zebra protobuf enabled : ${have_protobuf:-no}
1661 The above user and group must have read/write access to the state file
1662 directory and to the config files in the config file directory."