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, 3.1-dev, [https://github.com/frrouting/frr/issues])
11 PACKAGE_URL="https://frrouting.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.12 -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)
38 dnl default is to match previous behavior
39 exampledir=${sysconfdir}
40 AC_ARG_ENABLE([exampledir],
41 AS_HELP_STRING([--enable-exampledir],
42 [specify alternate directory for examples]),
43 exampledir="$enableval",)
44 dnl XXX add --exampledir to autoconf standard directory list somehow
47 dnl default is to match previous behavior
50 AC_ARG_ENABLE([pkgsrcrcdir],
51 AS_HELP_STRING([--enable-pkgsrcrcdir],
52 [specify directory for rc.d scripts]),
53 pkgsrcrcdir="$enableval"; pkgsrcdir="pkgsrc",)
54 dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
58 AC_ARG_WITH([moduledir], [AS_HELP_STRING([--with-moduledir=DIR], [module directory (${libdir}/frr/modules)])], [
61 moduledir="\${libdir}/frr/modules"
63 AC_SUBST([moduledir], [$moduledir])
65 AC_ARG_ENABLE(tcmalloc,
66 AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
67 [case "${enableval}" in
68 yes) tcmalloc_enabled=true
69 LIBS="$LIBS -ltcmalloc_minimal"
71 no) tcmalloc_enabled=false ;;
72 *) AC_MSG_ERROR(bad value ${enableval} for --enable-tcmalloc) ;;
73 esac],[tcmalloc_enabled=false])
76 dnl Thanks autoconf, but we don't want a default -g -O2. We have our own
77 dnl flag determination logic.
80 dnl --------------------
81 dnl Check CC and friends
82 dnl --------------------
83 dnl note orig_cflags is also used further down
89 dnl remove autoconf default "-g -O2"
97 dnl autoconf 2.59 appears not to support AC_PROG_SED
99 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
101 dnl try and enable CFLAGS that are useful for Quagga
102 dnl - specifically, options to control warnings
104 AC_USE_SYSTEM_EXTENSIONS
105 AC_DEFUN([AC_C_FLAG], [{
107 ac_c_flag_save="$CFLAGS"
109 AC_MSG_CHECKING([[whether $CC supports $1]])
111 [AC_LANG_PROGRAM([[]])],
114 m4_if([$3], [], [], [
115 CFLAGS="$ac_c_flag_save"
119 CFLAGS="$ac_c_flag_save"
126 dnl ICC won't bail on unknown options without -diag-error 10006
127 dnl need to do this first so we get useful results for the other options
128 AC_C_FLAG([-diag-error 10006])
130 dnl AC_PROG_CC_C99 may change CC to include -std=gnu99 or something
132 CC="${CC% -std=gnu99}"
135 AC_C_FLAG([-std=gnu11], [CC="$ac_cc"], [CC="$CC -std=gnu11"])
137 dnl if the user specified any CFLAGS, we don't add "-g -Os/-O2" here
138 if test "z$orig_cflags" = "z"; then
145 dnl always want these CFLAGS
146 AC_C_FLAG([-fno-omit-frame-pointer])
149 AC_C_FLAG([-Wmissing-prototypes])
150 AC_C_FLAG([-Wmissing-declarations])
151 AC_C_FLAG([-Wpointer-arith])
152 AC_C_FLAG([-Wbad-function-cast])
153 AC_C_FLAG([-Wwrite-strings])
154 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
155 AC_C_FLAG([-Wcast-qual])
156 AC_C_FLAG([-Wstrict-prototypes])
157 AC_C_FLAG([-Wmissing-noreturn])
158 AC_C_FLAG([-Wmissing-format-attribute])
159 AC_C_FLAG([-Wunreachable-code])
160 AC_C_FLAG([-Wpacked])
161 AC_C_FLAG([-Wpadded])
163 AC_C_FLAG([-Wno-unused-result])
165 AC_C_FLAG([-Wno-unused-parameter])
166 AC_C_FLAG([-Wno-missing-field-initializers])
168 dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
169 dnl for some reason the string consts get 'promoted' to char *,
170 dnl triggering a const to non-const conversion warning.
171 AC_C_FLAG([-diag-disable 3179])
173 if test x"${enable_werror}" = x"yes" ; then
178 dnl need link on this one, not compile
180 ac_ld_flag_save="$LDFLAGS"
181 LDFLAGS="$LDFLAGS -rdynamic"
182 AC_MSG_CHECKING([[whether linker supports -rdynamic]])
184 [AC_LANG_PROGRAM([[]])],
185 [AC_MSG_RESULT([yes])],
187 LDFLAGS="$ac_ld_flag_save"
198 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
199 LIBS="$PTHREAD_LIBS $LIBS"
201 AC_MSG_FAILURE([This Quagga version needs pthreads])
210 AC_CHECK_TOOL(AR, ar)
212 dnl -----------------
213 dnl System extensions
214 dnl -----------------
222 dnl ----------------------
223 dnl Packages configuration
224 dnl ----------------------
225 AC_ARG_WITH(pkg-extra-version,
226 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]),
227 [EXTRAVERSION=$withval],)
228 AC_ARG_WITH(pkg-git-version,
229 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
230 [ test "x$withval" != "xno" && with_pkg_git_version="yes" ])
232 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for Quagga]))
234 AS_HELP_STRING([--disable-doc], [do not build docs]))
236 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
238 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
240 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
241 AC_ARG_ENABLE(ripngd,
242 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
244 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
245 AC_ARG_ENABLE(ospf6d,
246 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
248 AS_HELP_STRING([--enable-ldpd], [build ldpd]))
250 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
251 AC_ARG_ENABLE(eigrpd,
252 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
253 AC_ARG_ENABLE(watchfrr,
254 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
256 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
258 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
259 AC_ARG_ENABLE(bgp-announce,
260 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
261 AC_ARG_ENABLE(bgp-vnc,
262 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
263 AC_ARG_WITH(rfp-path,
264 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
266 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
268 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
269 AC_ARG_ENABLE(tcp-zebra,
270 AS_HELP_STRING([--enable-tcp-zebra], [enable TCP/IP socket connection between zebra and protocol daemon]))
271 AC_ARG_ENABLE(ospfapi,
272 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
273 AC_ARG_ENABLE(ospfclient,
274 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
275 (this is the default if --disable-ospfapi is set)]))
276 AC_ARG_ENABLE(multipath,
277 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
279 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
281 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
282 AC_ARG_ENABLE(vty_group,
283 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
284 AC_ARG_ENABLE(configfile_mask,
285 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
286 AC_ARG_ENABLE(logfile_mask,
287 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
288 AC_ARG_ENABLE(shell_access,
289 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
291 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
293 AS_HELP_STRING([--enable-irdp], [enable IRDP server support in zebra]))
294 AC_ARG_ENABLE(capabilities,
295 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
296 AC_ARG_ENABLE(rusage,
297 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
298 AC_ARG_ENABLE(gcc_ultra_verbose,
299 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
300 AC_ARG_ENABLE(linux24_tcp_md5,
301 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
302 AC_ARG_ENABLE(backtrace,
303 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
304 AC_ARG_ENABLE(time-check,
305 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
306 AC_ARG_ENABLE(pcreposix,
307 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
309 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
310 AC_ARG_ENABLE(systemd,
311 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
313 AS_HELP_STRING([--enable-poll], [enable usage of Poll instead of select]))
314 AC_ARG_ENABLE(werror,
315 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
316 AC_ARG_ENABLE(cumulus,
317 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
318 AC_ARG_ENABLE(rr-semantics,
319 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
320 AC_ARG_ENABLE([protobuf],
321 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
322 AC_ARG_ENABLE([oldvpn_commands],
323 AS_HELP_STRING([--enable-old-vpn-commands], [Keep old vpn commands]))
325 AC_CHECK_HEADERS(json-c/json.h)
326 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c")
327 if test $ac_cv_lib_json_c_json_object_get = no; then
328 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
329 if test $ac_cv_lib_json_json_object_get = no; then
330 AC_MSG_ERROR([lib json is needed to compile])
334 AC_ARG_ENABLE([dev_build],
335 AS_HELP_STRING([--enable-dev-build], [build for development]))
337 if test x"${enable_time_check}" != x"no" ; then
338 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
339 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
341 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
345 case "${enable_systemd}" in
348 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
349 if test $ac_cv_lib_systemd_sd_notify = no; then
350 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
352 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
358 if test "${enable_rr_semantics}" != "no" ; then
359 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
362 if test "${enable_poll}" = "yes" ; then
363 AC_DEFINE(HAVE_POLL,,Compile systemd support in)
369 AC_MSG_CHECKING(whether this OS has MPLS stack)
372 MPLS_METHOD="zebra_mpls_netlink.o zebra_mpls.o"
373 AC_MSG_RESULT(Linux MPLS)
376 MPLS_METHOD="zebra_mpls_openbsd.o zebra_mpls.o"
377 AC_MSG_RESULT(OpenBSD MPLS)
380 MPLS_METHOD="zebra_mpls_null.o"
381 AC_MSG_RESULT(Unsupported kernel)
384 AC_SUBST(MPLS_METHOD)
386 if test "${enable_cumulus}" = "yes" ; then
387 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
388 DFLT_NAME="datacenter"
390 DFLT_NAME="traditional"
393 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
395 if test "${enable_shell_access}" = "yes"; then
396 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
399 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
401 if test "x${enable_dev_build}" = "xyes"; then
402 AC_DEFINE(DEV_BUILD,,Build for development)
404 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
407 # Logic for protobuf support.
409 if test "$enable_protobuf" = "yes"; then
413 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
414 if test "x$PROTOC_C" = "x/bin/false"; then
418 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
419 [found_protobuf_c=yes],
420 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
422 if test "x$found_protobuf_c" = "xyes"; then
423 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
424 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
426 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
427 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
433 # Logic for old vpn commans support.
435 if test "$enable_old_vpn_commands" = "yes"; then
436 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
439 # Fail if the user explicity enabled protobuf support and we couldn't
440 # find the compiler or libraries.
441 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
442 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
445 if test "x$have_protobuf" = "xyes"; then
446 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
449 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
452 # End of logic for protobuf support.
455 if test "${enable_tcp_zebra}" = "yes"; then
456 AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
459 if test "${enable_linux24_tcp_md5}" = "yes"; then
460 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
463 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
464 if test "${enable_rtadv}" != "no"; then
466 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
471 if test "${enable_irdp}" = "yes"; then
472 AC_DEFINE(HAVE_IRDP,, IRDP )
475 if test x"${enable_user}" = x"no"; then
478 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
481 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
484 if test x"${enable_group}" = x"no"; then
487 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
490 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
493 if test x"${enable_vty_group}" = x"yes" ; then
494 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
495 elif test x"${enable_vty_group}" != x""; then
496 if test x"${enable_vty_group}" != x"no"; then
497 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
500 AC_SUBST([enable_user])
501 AC_SUBST([enable_group])
502 AC_SUBST([enable_vty_group])
504 enable_configfile_mask=${enable_configfile_mask:-0600}
505 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
507 enable_logfile_mask=${enable_logfile_mask:-0600}
508 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
512 case "${enable_multipath}" in
516 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
517 MPATH_NUM="${enable_multipath}"
522 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
526 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
528 dnl -----------------------------------
529 dnl Add extra version string to package
530 dnl name, string and version fields.
531 dnl -----------------------------------
532 if test "x${EXTRAVERSION}" != "x" ; then
533 VERSION="${VERSION}${EXTRAVERSION}"
534 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
535 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
536 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
539 if test "x$with_pkg_git_version" = "xyes"; then
540 if test -d "${srcdir}/.git"; then
541 AC_DEFINE(GIT_VERSION, [1], [include git version info])
542 else with_pkg_git_version="no"
543 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
546 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
548 dnl ------------------------------------
549 dnl Check C keywords and standard types
550 dnl ------------------------------------
561 dnl -------------------------
562 dnl Check other header files.
563 dnl -------------------------
564 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
565 linux/version.h asm/types.h \
568 ac_stdatomic_ok=false
569 AC_DEFINE(FRR_AUTOCONF_ATOMIC, 1, [did autoconf checks for atomic funcs])
570 AC_CHECK_HEADER([stdatomic.h],[
572 AC_MSG_CHECKING([whether _Atomic qualifier works])
573 AC_LINK_IFELSE([AC_LANG_SOURCE([[
574 #include <stdatomic.h>
575 int main(int argc, char **argv) {
580 AC_DEFINE(HAVE_STDATOMIC_H, 1, [found stdatomic.h])
588 AS_IF([$ac_stdatomic_ok], [true], [
589 AC_MSG_CHECKING([for __atomic_* builtins])
590 AC_LINK_IFELSE([AC_LANG_SOURCE([[
591 int main(int argc, char **argv) {
593 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
594 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
597 AC_DEFINE(HAVE___ATOMIC, 1, [found __atomic builtins])
602 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
603 AC_MSG_CHECKING([for __sync_* builtins])
604 AC_LINK_IFELSE([AC_LANG_SOURCE([[
605 int main(int argc, char **argv) {
607 __sync_fetch_and_sub (&i, 1);
608 return __sync_val_compare_and_swap (&i, 0, 1);
611 AC_DEFINE(HAVE___SYNC, 1, [found __sync builtins])
614 AC_MSG_CHECKING([for __sync_swap builtin])
615 AC_LINK_IFELSE([AC_LANG_SOURCE([[
616 int main(int argc, char **argv) {
618 return __sync_swap (&i, 2);
621 AC_DEFINE(HAVE___SYNC_SWAP, 1, [found __sync_swap builtin])
629 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
634 dnl Utility macro to avoid retyping includes all the time
635 m4_define([FRR_INCLUDES],
638 #define __EXTENSIONS__
643 #include <sys/types.h>
644 /* sys/conf.h depends on param.h on FBSD at least */
645 #include <sys/param.h>
646 /* Required for MAXSIG */
648 #include <sys/socket.h>
650 # define __APPLE_USE_RFC_3542
652 #include <netinet/in.h>
653 #include <sys/time.h>
658 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
659 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
660 dnl an additional round for it.
662 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
664 m4_define([FRR_INCLUDES],
666 [#if HAVE_NET_IF_VAR_H
667 # include <net/if_var.h>
671 AC_CHECK_HEADERS([netinet/in_var.h \
672 net/if_dl.h net/netopt.h \
673 inet/nd.h netinet/ip_icmp.h \
674 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
675 [], [], FRR_INCLUDES)
677 AC_CHECK_HEADERS([ucontext.h], [], [],
680 #endif /* __USE_GNU */
684 m4_define([UCONTEXT_INCLUDES],
685 [#include <ucontext.h>])dnl
687 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
688 [], [], [UCONTEXT_INCLUDES])
689 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
690 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
691 [], [], [UCONTEXT_INCLUDES])],
692 [], [UCONTEXT_INCLUDES])
693 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
694 [], [], [UCONTEXT_INCLUDES])
696 m4_define([FRR_INCLUDES],
700 #include <netinet/in_systm.h>
701 #if HAVE_NETINET_IN_VAR_H
702 # include <netinet/in_var.h>
705 # include <net/if_dl.h>
707 #if HAVE_NET_NETOPT_H
708 # include <net/netopt.h>
710 #include <net/route.h>
712 # include <inet/nd.h>
714 #include <arpa/inet.h>
715 /* Required for IDRP */
716 #if HAVE_NETINET_IP_ICMP_H
717 # include <netinet/ip_icmp.h>
721 dnl V6 headers are checked below, after we check for v6
723 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
725 [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
727 AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
728 AC_DEFINE(SUNOS_5, 1, SunOS 5)
729 AC_CHECK_LIB(xnet, main)
734 | [*-sunos5.1[0-9]] \
735 | [*-sunos5.1[0-9].[0-9]] \
736 | [*-solaris2.[8-9]] \
737 | [*-solaris2.1[0-9]] \
738 | [*-solaris2.1[0-9].[0-9]])
740 AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
741 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
742 AC_CHECK_LIB(socket, main)
743 AC_CHECK_LIB(nsl, main)
744 AC_CHECK_LIB(umem, main)
745 AC_CHECK_FUNCS([printstack],
746 [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
747 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
752 *-sunos5* | *-solaris2*)
753 AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
754 AC_CHECK_LIB(socket, main)
755 AC_CHECK_LIB(nsl, main)
761 AC_DEFINE(GNU_LINUX,,GNU Linux)
765 AC_DEFINE(OPEN_BSD,,OpenBSD)
771 dnl ---------------------
772 dnl Integrated VTY option
773 dnl ---------------------
774 case "${enable_vtysh}" in
777 AC_DEFINE(VTYSH,,VTY shell)
778 dnl Vtysh uses libreadline, which looks for termcap functions at
779 dnl configure time. We follow readlines search order.
780 dnl The required procedures are in libtermcap on NetBSD, in
781 dnl [TODO] on Linux, and in [TODO] on Solaris.
782 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
783 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
784 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
785 [AC_CHECK_LIB(ncurses, tputs,
786 LIBREADLINE="$LIBREADLINE -lncurses")]
790 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
792 if test $ac_cv_lib_readline_main = no; then
793 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
795 AC_CHECK_HEADER(readline/history.h)
796 if test $ac_cv_header_readline_history_h = no;then
797 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
799 AC_CHECK_LIB(readline, rl_completion_matches,
800 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
801 if test $ac_cv_lib_readline_rl_completion_matches = no; then
802 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
806 AC_SUBST(LIBREADLINE)
807 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
812 dnl Quagga detects the PAM library it is built against by checking for a
813 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
814 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
815 dnl openpam.h doesn't do that, although depends on the header too. Hence a
816 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
819 if test "$with_libpam" = "yes"; then
820 AC_CHECK_HEADER([security/pam_misc.h],
821 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
822 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
823 pam_conv_func="misc_conv"
826 AC_CHECK_HEADER([security/openpam.h],
827 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
828 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
829 pam_conv_func="openpam_ttyconv"
831 [], FRR_INCLUDES[#include <security/pam_appl.h>])
832 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
833 AC_MSG_WARN([*** pam support will not be built ***])
838 if test "$with_libpam" = "yes"; then
839 dnl took this test from proftpds configure.in and suited to our needs
840 dnl -------------------------------------------------------------------------
842 dnl This next check looks funky due to a linker problem with some versions
843 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
844 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
845 dnl with RedHat 6.2 and Debian 2.2 or better.
846 AC_CHECK_LIB(pam, pam_start,
847 [AC_CHECK_LIB(pam, $pam_conv_func,
848 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
850 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
851 LIBPAM="-lpam -lpam_misc"]
855 [AC_CHECK_LIB(pam, pam_end,
856 [AC_CHECK_LIB(pam, $pam_conv_func,
857 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
858 LIBPAM="-lpam -ldl"],
859 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
860 LIBPAM="-lpam -ldl -lpam_misc"]
862 ],AC_MSG_WARN([*** pam support will not be built ***]),
869 dnl -------------------------------
870 dnl Endian-ness check
871 dnl -------------------------------
874 dnl -------------------------------
875 dnl check the size in byte of the C
876 dnl -------------------------------
877 dnl AC_CHECK_SIZEOF(char)
878 dnl AC_CHECK_SIZEOF(int)
879 dnl AC_CHECK_SIZEOF(short)
880 dnl AC_CHECK_SIZEOF(long)
882 dnl ----------------------------
883 dnl check existance of functions
884 dnl ----------------------------
890 dnl -------------------------------
891 dnl bgpd needs pow() and hence libm
892 dnl -------------------------------
894 AC_CHECK_HEADER([math.h],
895 [AC_CHECK_LIB([m], [pow],
898 AC_CHECK_FUNCS(pow,[],[LIBM=""])
901 if test x"$LIBM" = x ; then
902 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
915 AC_CHECK_HEADER([asm-generic/unistd.h],
916 [AC_CHECK_DECL(__NR_setns,
917 AC_DEFINE(HAVE_NETNS,, Have netns),,
918 FRR_INCLUDES [#include <asm-generic/unistd.h>
920 AC_CHECK_FUNCS(setns)]
923 dnl ------------------------------------
924 dnl Determine routing get and set method
925 dnl ------------------------------------
926 AC_MSG_CHECKING(zebra between kernel interface method)
927 if test x"$opsys" = x"gnu-linux"; then
928 AC_MSG_RESULT(netlink)
929 RT_METHOD=rt_netlink.o
930 KERNEL_METHOD=kernel_netlink.o
931 AC_DEFINE(HAVE_NETLINK,,netlink)
933 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
935 AC_MSG_RESULT(Route socket)
936 KERNEL_METHOD="kernel_socket.o"
937 RT_METHOD="rt_socket.o"
940 AC_SUBST(KERNEL_METHOD)
941 AM_CONDITIONAL([HAVE_NETLINK], [test "x$netlink" = "xyes"])
943 dnl --------------------------
944 dnl Determine IS-IS I/O method
945 dnl --------------------------
946 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
947 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
948 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
949 AC_CHECK_HEADER(net/bpf.h)
950 AC_CHECK_HEADER(sys/dlpi.h)
951 AC_MSG_CHECKING(zebra IS-IS I/O method)
952 if test x"$opsys" = x"gnu-linux"; then
953 AC_MSG_RESULT(pfpacket)
954 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
955 elif test x"$opsys" = x"sol2-6" -o x"$opsys" = x"sol8"; then
957 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
959 if test $ac_cv_header_net_bpf_h = no; then
960 if test $ac_cv_header_sys_dlpi_h = no; then
962 AC_MSG_WARN([*** IS-IS support will not be built ***])
967 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
970 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
973 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
975 dnl ------------------------------------
976 dnl check for broken CMSG_FIRSTHDR macro
977 dnl ------------------------------------
978 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
979 AC_RUN_IFELSE([AC_LANG_SOURCE([[
982 #define __EXTENSIONS__
985 #include <sys/types.h>
986 #include <sys/socket.h>
993 msg.msg_control = buf;
994 msg.msg_controllen = 0;
996 if (CMSG_FIRSTHDR(&msg) != NULL)
999 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
1000 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
1002 dnl ------------------------------
1003 dnl check kernel route read method
1004 dnl ------------------------------
1005 AC_CACHE_CHECK([route read method], [frr_cv_rtread_method],
1006 [if test "x$netlink" = xyes; then
1007 frr_cv_rtread_method="netlink"
1009 for frr_cv_rtread_method in /dev/ip /dev/null;
1011 test x`ls $frr_cv_rtread_method 2>/dev/null` = x"$frr_cv_rtread_method" && break
1013 case $frr_cv_rtread_method in
1016 *-freebsd*) frr_cv_rtread_method="sysctl";;
1017 *) frr_cv_rtread_method="getmsg";;
1020 frr_cv_rtread_method="sysctl";;
1023 RTREAD_METHOD=rtread_${frr_cv_rtread_method}.o
1024 AC_SUBST(RTREAD_METHOD)
1026 dnl -----------------------------
1027 dnl check interface lookup method
1028 dnl -----------------------------
1029 IOCTL_METHOD=ioctl.o
1030 AC_MSG_CHECKING(interface looking up method)
1031 if test "$netlink" = yes; then
1032 AC_MSG_RESULT(netlink)
1033 IF_METHOD=if_netlink.o
1034 elif test "$opsys" = "sol2-6";then
1035 AC_MSG_RESULT(Solaris GIF)
1036 IF_METHOD=if_ioctl.o
1037 elif test "$opsys" = "sol8";then
1038 AC_MSG_RESULT(Solaris GLIF)
1039 IF_METHOD=if_ioctl_solaris.o
1040 IOCTL_METHOD=ioctl_solaris.o
1041 elif test "$opsys" = "openbsd";then
1042 AC_MSG_RESULT(openbsd)
1043 IF_METHOD=if_ioctl.o
1044 elif grep NET_RT_IFLIST /usr/include/sys/socket.h >/dev/null 2>&1; then
1045 AC_MSG_RESULT(sysctl)
1046 IF_METHOD=if_sysctl.o
1047 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
1049 AC_MSG_RESULT(ioctl)
1050 IF_METHOD=if_ioctl.o
1053 AC_SUBST(IOCTL_METHOD)
1055 dnl ---------------------------------------------------------------
1056 dnl figure out how to specify an interface in multicast sockets API
1057 dnl ---------------------------------------------------------------
1058 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1060 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1061 #include <sys/socket.h>
1062 #include <netinet/in.h>
1063 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1064 #include <linux/types.h>
1067 m4_define([FRR_INCLUDES],
1069 [#if HAVE_LINUX_MROUTE_H
1070 # include <linux/mroute.h>
1074 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1075 #include <sys/socket.h>
1076 #include <sys/types.h>
1077 #include <netinet/in.h>
1078 #include <net/route.h>
1081 m4_define([FRR_INCLUDES],
1083 [#if HAVE_NETINET_IP_MROUTE_H
1084 # include <netinet/ip_mroute.h>
1088 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1089 AC_TRY_COMPILE([#include <sys/param.h>],
1090 [#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)
1093 #error No support for BSD struct ip_mreq hack detected
1094 #endif],[AC_MSG_RESULT(yes)
1095 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1098 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1100 #include <sys/types.h>
1101 #include <netinet/in.h>
1102 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1103 ], [AC_MSG_RESULT(yes)
1104 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1107 dnl ---------------------------------------------------------------
1108 dnl figure out how to check link-state
1109 dnl ---------------------------------------------------------------
1110 AC_CHECK_HEADER( [net/if_media.h],
1111 [m4_define([LINK_DETECT_INCLUDES],
1113 [#include <net/if_media.h>
1115 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1116 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1117 [], LINK_DETECT_INCLUDES)],
1121 dnl ---------------------------------------------------------------
1122 dnl Additional, newer way to check link-state using ifi_link_state.
1123 dnl Not available in all BSD's when ifmediareq available
1124 dnl ---------------------------------------------------------------
1125 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1126 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1129 dnl ------------------------
1130 dnl TCP_MD5SIG socket option
1131 dnl ------------------------
1133 AC_CHECK_HEADER([netinet/tcp.h],
1134 [m4_define([MD5_INCLUDES],
1136 [#include <netinet/tcp.h>
1138 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1141 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1142 AC_CHECK_HEADER([linux/tcp.h],
1143 [m4_define([MD5_INCLUDES],
1145 [#include <linux/tcp.h>
1147 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1150 dnl -----------------------------
1151 dnl check ipforward detect method
1152 dnl -----------------------------
1153 AC_CACHE_CHECK([ipforward method], [frr_cv_ipforward_method],
1154 [if test x$cross_compiling = xyes; then
1155 if test x"$opsys" = x"gnu-linux"; then
1156 frr_cv_ipforward_method=/proc/net/snmp
1158 frr_cv_ipforward_method=/dev/ip
1161 for frr_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null;
1163 test x`ls $frr_cv_ipforward_method 2>/dev/null` = x"$frr_cv_ipforward_method" && break
1166 case $frr_cv_ipforward_method in
1167 "/proc/net/snmp") frr_cv_ipforward_method="proc";;
1170 *-freebsd*) frr_cv_ipforward_method="sysctl";;
1171 *) frr_cv_ipforward_method="solaris";;
1173 *) frr_cv_ipforward_method="sysctl";;
1175 IPFORWARD=ipforward_${frr_cv_ipforward_method}.o
1178 dnl ----------------------------------------------------------------------------
1179 dnl figure out if domainname is available in the utsname struct (GNU extension).
1180 dnl ----------------------------------------------------------------------------
1181 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1186 AC_MSG_CHECKING(whether does this OS have IPv6 stack)
1190 if grep WIDE /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1191 AC_DEFINE(KAME,1,KAME IPv6)
1193 dnl ------------------------------------
1194 dnl Solaris 9, 10 and potentially higher
1195 dnl ------------------------------------
1196 elif test x"$opsys" = x"sol8"; then
1197 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
1198 AC_MSG_RESULT(Solaris IPv6)
1202 elif test x"$opsys" = x"gnu-linux"; then
1203 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
1204 dnl Linux has a compilation problem with mixing
1205 dnl netinet/in.h and linux/in6.h they are not
1206 dnl compatible. There has been discussion on
1207 dnl how to fix it but no real progress on implementation
1208 dnl when they fix it, remove this
1209 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
1210 AC_MSG_RESULT(Linux IPv6)
1212 AC_MSG_ERROR([Failed to detect IPv6 stack])
1215 dnl ------------------
1216 dnl IPv6 header checks
1217 dnl ------------------
1218 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1219 netinet6/in6_var.h netinet6/nd6.h], [], [],
1222 m4_define([FRR_INCLUDES],dnl
1224 [#if HAVE_NETINET6_IN6_H
1225 #include <netinet6/in6.h>
1227 #if HAVE_NETINET_IN6_VAR_H
1228 #include <netinet/in6_var.h>
1230 #include <netinet/icmp6.h>
1231 #if HAVE_NETINET6_IN6_VAR_H
1232 # include <netinet6/in6_var.h>
1234 #if HAVE_NETINET6_ND6_H
1235 # include <netinet6/nd6.h>
1239 dnl disable doc check
1240 if test "${enable_doc}" = "no";then
1246 dnl --------------------
1247 dnl Daemon disable check
1248 dnl --------------------
1249 if test "${enable_zebra}" = "no";then
1254 AM_CONDITIONAL(ZEBRA, test "x$ZEBRA" = "xzebra")
1256 if test "${enable_bgpd}" = "no";then
1261 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1263 if test "${enable_ripd}" = "no";then
1268 AM_CONDITIONAL(RIPD, test "x$RIPD" = "xripd")
1270 if test "${enable_ospfd}" = "no";then
1275 AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd")
1277 if test "${enable_ldpd}" = "no";then
1280 AX_PROG_PERL_MODULES(XML::LibXML, , [
1281 if test -f "${srcdir}/ldpd/ldp_vty_cmds.c"; then
1282 AC_MSG_WARN([XML::LibXML perl module not found, using pregenerated ldp_vty_cmds.c])
1284 AC_MSG_ERROR([XML::LibXML perl module not found and pregenerated ldp_vty_cmds.c missing])
1289 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1291 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1294 if test "$opsys" = "gnu-linux"; then
1295 if test "${enable_nhrpd}" != "no"; then
1299 if test "${enable_nhrpd}" = "yes"; then
1300 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1303 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1305 if test "${enable_eigrpd}" = "no";then
1310 AM_CONDITIONAL(EIGRPD, test "x$EIGRPD" = "xeigrpd")
1312 if test "${enable_watchfrr}" = "no";then
1317 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1320 if test "${enable_ospfapi}" != "no";then
1321 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1323 if test "${enable_ospfclient}" != "no";then
1324 OSPFCLIENT="ospfclient"
1328 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1330 case "${enable_ripngd}" in
1332 * ) RIPNGD="ripngd";;
1334 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1336 case "${enable_ospf6d}" in
1338 * ) OSPF6D="ospf6d";;
1340 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1342 case "${enable_isisd}" in
1346 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1348 case "${enable_pimd}" in
1352 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1354 if test "${enable_bgp_announce}" = "no";then
1355 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1357 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1360 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1361 with_rfp_path="bgpd/rfp-example"
1363 if test "${with_rfp_path}" != "no"; then
1364 VNC_RFP_PATH="${with_rfp_path}"
1365 AC_SUBST(VNC_RFP_PATH)
1368 if test "${enable_bgp_vnc}" != "no";then
1369 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1370 RFPTEST="${with_rfp_path}/rfptest"
1371 LIBRFP="${with_rfp_path}/librfp"
1372 RFPINC="${with_rfp_path}/librfp"
1376 RFPINC="bgpd/rfp-example/librfp"
1379 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1400 AC_SUBST(OSPFCLIENT)
1402 AC_CHECK_LIB(crypt, crypt)
1403 AC_CHECK_LIB(resolv, res_init)
1405 dnl ---------------------------
1406 dnl check system has PCRE regexp
1407 dnl ---------------------------
1408 if test "x$enable_pcreposix" = "xyes"; then
1409 AC_CHECK_LIB(pcreposix, pcreposix_regexec, ,[enable_pcreposix=no
1410 AC_MSG_WARN([*** falling back to other regex library ***]) ])
1412 AC_SUBST(HAVE_LIBPCREPOSIX)
1414 dnl ------------------
1415 dnl check C-Ares library
1416 dnl ------------------
1417 if test "${NHRPD}" != ""; then
1418 PKG_CHECK_MODULES([CARES], [libcares])
1422 dnl ------------------
1423 dnl check Net-SNMP library
1424 dnl ------------------
1425 if test "${enable_snmp}" != ""; then
1426 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1427 if test x"$NETSNMP_CONFIG" = x"no"; then
1428 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1430 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1431 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1432 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1433 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1440 ])],[AC_MSG_RESULT(yes)],[
1442 AC_MSG_ERROR([--enable-snmp given but not usable])])
1443 case "${enable_snmp}" in
1448 SNMP_METHOD="${enable_snmp}"
1451 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1454 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1455 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1456 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1458 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1460 AC_SUBST(SNMP_CFLAGS)
1465 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1466 AC_MSG_ERROR([unable to find the dlopen()])
1469 AC_CHECK_HEADERS([link.h])
1471 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1472 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1480 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1483 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1488 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1489 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1496 struct link_map *lm = NULL;
1497 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1500 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1506 dnl ---------------------------
1507 dnl sockaddr and netinet checks
1508 dnl ---------------------------
1511 struct vifctl, struct mfcctl, struct sioc_sg_req,
1512 vifi_t, struct sioc_vif_req, struct igmpmsg,
1513 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1514 struct nd_opt_adv_interval, struct rt_addrinfo,
1515 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1516 [], [], FRR_INCLUDES)
1518 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1519 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1520 struct sockaddr_dl.sdl_len,
1521 struct if6_aliasreq.ifra_lifetime,
1522 struct nd_opt_adv_interval.nd_opt_ai_type],
1523 [], [], FRR_INCLUDES)
1525 dnl ---------------------------
1526 dnl IRDP/pktinfo/icmphdr checks
1527 dnl ---------------------------
1528 AC_CHECK_TYPES([struct in_pktinfo],
1529 [AC_CHECK_TYPES([struct icmphdr],
1530 [if test "${enable_irdp}" != "no"; then
1531 AC_DEFINE(HAVE_IRDP,, IRDP)
1533 [if test "${enable_irdp}" = "yes"; then
1534 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1535 fi], [FRR_INCLUDES])],
1536 [if test "${enable_irdp}" = "yes"; then
1537 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1538 fi], [FRR_INCLUDES])
1540 dnl -----------------------
1541 dnl checking for IP_PKTINFO
1542 dnl -----------------------
1543 AC_MSG_CHECKING(for IP_PKTINFO)
1544 AC_TRY_COMPILE([#include <netdb.h>], [
1545 int opt = IP_PKTINFO;
1548 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1553 dnl ---------------------------
1554 dnl checking for IP_RECVDSTADDR
1555 dnl ---------------------------
1556 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1557 AC_TRY_COMPILE([#include <netinet/in.h>], [
1558 int opt = IP_RECVDSTADDR;
1561 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1566 dnl ----------------------
1567 dnl checking for IP_RECVIF
1568 dnl ----------------------
1569 AC_MSG_CHECKING(for IP_RECVIF)
1570 AC_TRY_COMPILE([#include <netinet/in.h>], [
1571 int opt = IP_RECVIF;
1574 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1579 dnl ----------------------
1580 dnl checking for SO_BINDANY
1581 dnl ----------------------
1582 AC_MSG_CHECKING(for SO_BINDANY)
1583 AC_TRY_COMPILE([#include <sys/socket.h>], [
1584 int opt = SO_BINDANY;
1587 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1592 dnl ----------------------
1593 dnl checking for IP_FREEBIND
1594 dnl ----------------------
1595 AC_MSG_CHECKING(for IP_FREEBIND)
1596 AC_TRY_COMPILE([#include <netinet/in.h>], [
1597 int opt = IP_FREEBIND;
1600 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1605 dnl --------------------------------------
1606 dnl checking for be32dec existence or not
1607 dnl --------------------------------------
1608 AC_CHECK_DECLS([be32enc, be32dec], [], [],
1609 [#include <sys/endian.h>])
1611 dnl --------------------------------------
1612 dnl checking for clock_time monotonic struct and call
1613 dnl --------------------------------------
1614 AC_CHECK_DECL(CLOCK_MONOTONIC,
1615 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1616 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1617 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1619 dnl --------------------------------------
1620 dnl checking for flex and bison
1621 dnl --------------------------------------
1624 AC_MSG_CHECKING(version of flex)
1625 quagga_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1626 quagga_ac_flex_version="${quagga_ac_flex_version##* }"
1627 AC_MSG_RESULT([$quagga_ac_flex_version])
1628 AX_COMPARE_VERSION([$quagga_ac_flex_version], [lt], [2.5.20], [
1629 LEX="$SHELL $missing_dir/missing flex"
1630 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1631 AC_MSG_WARN([using pregenerated flex output files])
1633 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1635 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1636 AC_SUBST([LEXLIB], [''])
1640 dnl thanks GNU bison for this b*llshit...
1641 AC_MSG_CHECKING(version of bison)
1642 quagga_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1643 quagga_ac_bison_version="${quagga_ac_bison_version##* }"
1644 quagga_ac_bison_missing="false"
1645 case "x${quagga_ac_bison_version}" in
1648 BISON_CLOSEBRACE='"'
1650 AC_MSG_RESULT([$quagga_ac_bison_version - 2.7 or older])
1653 AC_MSG_RESULT([$quagga_ac_bison_version])
1654 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1655 quagga_ac_bison_missing="true"
1658 AC_MSG_RESULT([none])
1659 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1660 quagga_ac_bison_missing="true"
1664 BISON_CLOSEBRACE='}'
1665 BISON_VERBOSE='-Dparse.error=verbose'
1666 AC_MSG_RESULT([$quagga_ac_bison_version - 3.0 or newer])
1669 AC_SUBST(BISON_OPENBRACE)
1670 AC_SUBST(BISON_CLOSEBRACE)
1671 AC_SUBST(BISON_VERBOSE)
1673 if $quagga_ac_bison_missing; then
1674 YACC="$SHELL $missing_dir/missing bison -y"
1675 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1676 AC_MSG_WARN([using pregenerated bison output files])
1678 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1682 dnl -------------------
1683 dnl capabilities checks
1684 dnl -------------------
1685 if test "${enable_capabilities}" != "no"; then
1686 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1687 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1689 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1690 frr_ac_keepcaps="yes"],
1693 if test x"${frr_ac_keepcaps}" = x"yes"; then
1694 AC_CHECK_HEADERS(sys/capability.h)
1696 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1697 AC_CHECK_LIB(cap, cap_init,
1698 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1703 AC_CHECK_HEADERS(priv.h,
1704 [AC_MSG_CHECKING(Solaris style privileges are available)
1705 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1707 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1708 frr_ac_scaps="yes"],
1714 if test x"${frr_ac_scaps}" = x"yes" \
1715 -o x"${frr_ac_lcaps}" = x"yes"; then
1716 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1721 dnl ---------------------------
1722 dnl check for glibc 'backtrace'
1723 dnl ---------------------------
1724 if test x"${enable_backtrace}" != x"no" ; then
1726 AC_CHECK_HEADER([execinfo.h], [
1727 AC_SEARCH_LIBS([backtrace], [execinfo], [
1728 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1729 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1734 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1735 dnl user explicitly requested backtrace but we failed to find support
1736 AC_MSG_FAILURE([failed to find backtrace support])
1740 dnl -----------------------------------------
1741 dnl check for malloc mallinfo struct and call
1742 dnl this must try and link using LIBS, in
1743 dnl order to check no alternative allocator
1744 dnl has been specified, which might not provide
1745 dnl mallinfo, e.g. such as Umem on Solaris.
1746 dnl -----------------------------------------
1747 AC_CHECK_HEADER([malloc.h],
1748 [AC_MSG_CHECKING(whether mallinfo is available)
1749 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1750 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1752 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1755 ], [], FRR_INCLUDES)
1760 CONFDATE=`date '+%Y%m%d'`
1763 dnl ------------------------------
1764 dnl set paths for state directory
1765 dnl ------------------------------
1766 AC_MSG_CHECKING(directory to use for state file)
1767 if test "${prefix}" = "NONE"; then
1768 frr_statedir_prefix="";
1770 frr_statedir_prefix=${prefix}
1772 if test "${localstatedir}" = '${prefix}/var'; then
1773 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1774 ${frr_statedir_prefix}/var/adm dnl
1775 ${frr_statedir_prefix}/etc dnl
1781 test -d $FRR_STATE_DIR && break
1783 frr_statedir=$FRR_STATE_DIR
1785 frr_statedir=${localstatedir}
1787 if test $frr_statedir = "/dev/null"; then
1788 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1790 AC_MSG_RESULT(${frr_statedir})
1791 AC_SUBST(frr_statedir)
1793 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1794 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1795 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1797 dnl autoconf does this, but it does it too late...
1798 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1799 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1801 dnl get the full path, recursing through variables...
1802 vtysh_bin="$bindir/vtysh"
1803 for I in 1 2 3 4 5 6 7 8 9 10; do
1804 eval vtysh_bin="\"$vtysh_bin\""
1806 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1808 CFG_SYSCONF="$sysconfdir"
1810 CFG_STATE="$frr_statedir"
1811 CFG_MODULE="$moduledir"
1812 for I in 1 2 3 4 5 6 7 8 9 10; do
1813 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1814 eval CFG_SBIN="\"$CFG_SBIN\""
1815 eval CFG_STATE="\"$CFG_STATE\""
1816 eval CFG_MODULE="\"$CFG_MODULE\""
1818 AC_SUBST(CFG_SYSCONF)
1821 AC_SUBST(CFG_MODULE)
1822 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1824 dnl ---------------------------
1825 dnl Check htonl works correctly
1826 dnl ---------------------------
1827 AC_MSG_CHECKING(for working htonl)
1828 AC_CACHE_VAL(ac_cv_htonl_works,
1829 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1830 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1833 AC_MSG_RESULT($ac_cv_htonl_works)
1835 AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile
1836 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile
1837 ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile
1838 doc/Makefile ospfclient/Makefile tests/Makefile m4/Makefile
1849 snapcraft/snapcraft.yaml
1851 tests/lib/cli/test_cli.refout
1867 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1868 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1871 if test "${enable_bgp_vnc}" != "no"; then
1872 if test "${with_rfp_path}" = "bgpd/rfp-example" ; then
1873 AC_CONFIG_FILES([bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile])
1875 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1879 AC_CONFIG_FILES([solaris/Makefile])
1881 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1883 ## Hack, but working solution to avoid rebuilding of quagga.info.
1884 ## It's already in CVS until texinfo 4.7 is more common.
1888 FRRouting configuration
1889 ------------------------------
1890 FRR version : ${PACKAGE_VERSION}
1891 host operating system : ${host_os}
1892 source code location : ${srcdir}
1894 compiler flags : ${CFLAGS}
1896 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1897 state file directory : ${frr_statedir}
1898 config file directory : `eval echo \`echo ${sysconfdir}\``
1899 example directory : `eval echo \`echo ${exampledir}\``
1900 module directory : ${CFG_MODULE}
1901 user to run as : ${enable_user}
1902 group to run as : ${enable_group}
1903 group for vty sockets : ${enable_vty_group}
1904 config file mask : ${enable_configfile_mask}
1905 log file mask : ${enable_logfile_mask}
1906 zebra protobuf enabled : ${have_protobuf:-no}
1908 The above user and group must have read/write access to the state file
1909 directory and to the config files in the config file directory."