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(datacenter,
319 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
320 AC_ARG_ENABLE(rr-semantics,
321 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
322 AC_ARG_ENABLE([protobuf],
323 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
324 AC_ARG_ENABLE([oldvpn_commands],
325 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
327 AC_CHECK_HEADERS(json-c/json.h)
328 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c")
329 if test $ac_cv_lib_json_c_json_object_get = no; then
330 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
331 if test $ac_cv_lib_json_json_object_get = no; then
332 AC_MSG_ERROR([lib json is needed to compile])
336 AC_ARG_ENABLE([dev_build],
337 AS_HELP_STRING([--enable-dev-build], [build for development]))
339 if test x"${enable_time_check}" != x"no" ; then
340 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
341 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
343 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
347 case "${enable_systemd}" in
350 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
351 if test $ac_cv_lib_systemd_sd_notify = no; then
352 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
354 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
360 if test "${enable_rr_semantics}" != "no" ; then
361 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
364 if test "${enable_poll}" = "yes" ; then
365 AC_DEFINE(HAVE_POLL_CALL,,Compile systemd support in)
371 AC_MSG_CHECKING(whether this OS has MPLS stack)
374 MPLS_METHOD="zebra_mpls_netlink.o zebra_mpls.o"
375 AC_MSG_RESULT(Linux MPLS)
378 MPLS_METHOD="zebra_mpls_openbsd.o zebra_mpls.o"
379 AC_MSG_RESULT(OpenBSD MPLS)
382 MPLS_METHOD="zebra_mpls_null.o"
383 AC_MSG_RESULT(Unsupported kernel)
386 AC_SUBST(MPLS_METHOD)
388 if test "${enable_datacenter}" = "yes" ; then
389 AC_DEFINE(HAVE_DATACENTER,,Compile extensions for a DataCenter)
390 DFLT_NAME="datacenter"
392 DFLT_NAME="traditional"
395 if test "${enable_cumulus}" = "yes" ; then
396 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
400 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
402 if test "${enable_shell_access}" = "yes"; then
403 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
406 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
408 if test "x${enable_dev_build}" = "xyes"; then
409 AC_DEFINE(DEV_BUILD,,Build for development)
411 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
414 # Logic for protobuf support.
416 if test "$enable_protobuf" = "yes"; then
420 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
421 if test "x$PROTOC_C" = "x/bin/false"; then
425 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
426 [found_protobuf_c=yes],
427 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
429 if test "x$found_protobuf_c" = "xyes"; then
430 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
431 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
433 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
434 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
440 # Logic for old vpn commans support.
442 if test "$enable_oldvpn_commands" = "yes"; then
443 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
446 # Fail if the user explicity enabled protobuf support and we couldn't
447 # find the compiler or libraries.
448 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
449 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
452 if test "x$have_protobuf" = "xyes"; then
453 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
456 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
459 # End of logic for protobuf support.
462 if test "${enable_tcp_zebra}" = "yes"; then
463 AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
466 if test "${enable_linux24_tcp_md5}" = "yes"; then
467 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
470 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
471 if test "${enable_rtadv}" != "no"; then
473 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
478 if test "${enable_irdp}" = "yes"; then
479 AC_DEFINE(HAVE_IRDP,, IRDP )
482 if test x"${enable_user}" = x"no"; then
485 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
488 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
491 if test x"${enable_group}" = x"no"; then
494 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
497 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
500 if test x"${enable_vty_group}" = x"yes" ; then
501 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
502 elif test x"${enable_vty_group}" != x""; then
503 if test x"${enable_vty_group}" != x"no"; then
504 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
507 AC_SUBST([enable_user])
508 AC_SUBST([enable_group])
509 AC_SUBST([enable_vty_group])
511 enable_configfile_mask=${enable_configfile_mask:-0600}
512 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
514 enable_logfile_mask=${enable_logfile_mask:-0600}
515 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
519 case "${enable_multipath}" in
523 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
524 MPATH_NUM="${enable_multipath}"
529 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
533 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
535 dnl -----------------------------------
536 dnl Add extra version string to package
537 dnl name, string and version fields.
538 dnl -----------------------------------
539 if test "x${EXTRAVERSION}" != "x" ; then
540 VERSION="${VERSION}${EXTRAVERSION}"
541 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
542 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
543 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
546 if test "x$with_pkg_git_version" = "xyes"; then
547 if test -d "${srcdir}/.git"; then
548 AC_DEFINE(GIT_VERSION, [1], [include git version info])
549 else with_pkg_git_version="no"
550 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
553 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
555 dnl ------------------------------------
556 dnl Check C keywords and standard types
557 dnl ------------------------------------
568 dnl -------------------------
569 dnl Check other header files.
570 dnl -------------------------
571 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
572 linux/version.h asm/types.h \
575 ac_stdatomic_ok=false
576 AC_DEFINE(FRR_AUTOCONF_ATOMIC, 1, [did autoconf checks for atomic funcs])
577 AC_CHECK_HEADER([stdatomic.h],[
579 AC_MSG_CHECKING([whether _Atomic qualifier works])
580 AC_LINK_IFELSE([AC_LANG_SOURCE([[
581 #include <stdatomic.h>
582 int main(int argc, char **argv) {
587 AC_DEFINE(HAVE_STDATOMIC_H, 1, [found stdatomic.h])
595 AS_IF([$ac_stdatomic_ok], [true], [
596 AC_MSG_CHECKING([for __atomic_* builtins])
597 AC_LINK_IFELSE([AC_LANG_SOURCE([[
598 int main(int argc, char **argv) {
600 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
601 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
604 AC_DEFINE(HAVE___ATOMIC, 1, [found __atomic builtins])
609 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
610 AC_MSG_CHECKING([for __sync_* builtins])
611 AC_LINK_IFELSE([AC_LANG_SOURCE([[
612 int main(int argc, char **argv) {
614 __sync_fetch_and_sub (&i, 1);
615 return __sync_val_compare_and_swap (&i, 0, 1);
618 AC_DEFINE(HAVE___SYNC, 1, [found __sync builtins])
621 AC_MSG_CHECKING([for __sync_swap builtin])
622 AC_LINK_IFELSE([AC_LANG_SOURCE([[
623 int main(int argc, char **argv) {
625 return __sync_swap (&i, 2);
628 AC_DEFINE(HAVE___SYNC_SWAP, 1, [found __sync_swap builtin])
636 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
641 dnl Utility macro to avoid retyping includes all the time
642 m4_define([FRR_INCLUDES],
645 #define __EXTENSIONS__
650 #include <sys/types.h>
651 /* sys/conf.h depends on param.h on FBSD at least */
652 #include <sys/param.h>
653 /* Required for MAXSIG */
655 #include <sys/socket.h>
657 # define __APPLE_USE_RFC_3542
659 #include <netinet/in.h>
660 #include <sys/time.h>
665 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
666 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
667 dnl an additional round for it.
669 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
671 m4_define([FRR_INCLUDES],
673 [#if HAVE_NET_IF_VAR_H
674 # include <net/if_var.h>
678 AC_CHECK_HEADERS([netinet/in_var.h \
679 net/if_dl.h net/netopt.h \
680 inet/nd.h netinet/ip_icmp.h \
681 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
682 [], [], FRR_INCLUDES)
684 AC_CHECK_HEADERS([ucontext.h], [], [],
687 #endif /* __USE_GNU */
691 m4_define([UCONTEXT_INCLUDES],
692 [#include <ucontext.h>])dnl
694 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
695 [], [], [UCONTEXT_INCLUDES])
696 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
697 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
698 [], [], [UCONTEXT_INCLUDES])],
699 [], [UCONTEXT_INCLUDES])
700 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
701 [], [], [UCONTEXT_INCLUDES])
703 m4_define([FRR_INCLUDES],
707 #include <netinet/in_systm.h>
708 #if HAVE_NETINET_IN_VAR_H
709 # include <netinet/in_var.h>
712 # include <net/if_dl.h>
714 #if HAVE_NET_NETOPT_H
715 # include <net/netopt.h>
717 #include <net/route.h>
719 # include <inet/nd.h>
721 #include <arpa/inet.h>
722 /* Required for IDRP */
723 #if HAVE_NETINET_IP_ICMP_H
724 # include <netinet/ip_icmp.h>
728 dnl V6 headers are checked below, after we check for v6
730 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
732 [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
734 AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
735 AC_DEFINE(SUNOS_5, 1, SunOS 5)
736 AC_CHECK_LIB(xnet, main)
741 | [*-sunos5.1[0-9]] \
742 | [*-sunos5.1[0-9].[0-9]] \
743 | [*-solaris2.[8-9]] \
744 | [*-solaris2.1[0-9]] \
745 | [*-solaris2.1[0-9].[0-9]])
747 AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
748 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
749 AC_CHECK_LIB(socket, main)
750 AC_CHECK_LIB(nsl, main)
751 AC_CHECK_LIB(umem, main)
752 AC_CHECK_FUNCS([printstack],
753 [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
754 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
759 *-sunos5* | *-solaris2*)
760 AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
761 AC_CHECK_LIB(socket, main)
762 AC_CHECK_LIB(nsl, main)
768 AC_DEFINE(GNU_LINUX,,GNU Linux)
772 AC_DEFINE(OPEN_BSD,,OpenBSD)
778 dnl ---------------------
779 dnl Integrated VTY option
780 dnl ---------------------
781 case "${enable_vtysh}" in
784 AC_DEFINE(VTYSH,,VTY shell)
785 dnl Vtysh uses libreadline, which looks for termcap functions at
786 dnl configure time. We follow readlines search order.
787 dnl The required procedures are in libtermcap on NetBSD, in
788 dnl [TODO] on Linux, and in [TODO] on Solaris.
789 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
790 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
791 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
792 [AC_CHECK_LIB(ncurses, tputs,
793 LIBREADLINE="$LIBREADLINE -lncurses")]
797 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
799 if test $ac_cv_lib_readline_main = no; then
800 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
802 AC_CHECK_HEADER(readline/history.h)
803 if test $ac_cv_header_readline_history_h = no;then
804 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
806 AC_CHECK_LIB(readline, rl_completion_matches,
807 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
808 if test $ac_cv_lib_readline_rl_completion_matches = no; then
809 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
813 AC_SUBST(LIBREADLINE)
814 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
819 dnl Quagga detects the PAM library it is built against by checking for a
820 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
821 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
822 dnl openpam.h doesn't do that, although depends on the header too. Hence a
823 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
826 if test "$with_libpam" = "yes"; then
827 AC_CHECK_HEADER([security/pam_misc.h],
828 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
829 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
830 pam_conv_func="misc_conv"
833 AC_CHECK_HEADER([security/openpam.h],
834 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
835 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
836 pam_conv_func="openpam_ttyconv"
838 [], FRR_INCLUDES[#include <security/pam_appl.h>])
839 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
840 AC_MSG_WARN([*** pam support will not be built ***])
845 if test "$with_libpam" = "yes"; then
846 dnl took this test from proftpds configure.in and suited to our needs
847 dnl -------------------------------------------------------------------------
849 dnl This next check looks funky due to a linker problem with some versions
850 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
851 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
852 dnl with RedHat 6.2 and Debian 2.2 or better.
853 AC_CHECK_LIB(pam, pam_start,
854 [AC_CHECK_LIB(pam, $pam_conv_func,
855 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
857 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
858 LIBPAM="-lpam -lpam_misc"]
862 [AC_CHECK_LIB(pam, pam_end,
863 [AC_CHECK_LIB(pam, $pam_conv_func,
864 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
865 LIBPAM="-lpam -ldl"],
866 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
867 LIBPAM="-lpam -ldl -lpam_misc"]
869 ],AC_MSG_WARN([*** pam support will not be built ***]),
876 dnl -------------------------------
877 dnl Endian-ness check
878 dnl -------------------------------
881 dnl -------------------------------
882 dnl check the size in byte of the C
883 dnl -------------------------------
884 dnl AC_CHECK_SIZEOF(char)
885 dnl AC_CHECK_SIZEOF(int)
886 dnl AC_CHECK_SIZEOF(short)
887 dnl AC_CHECK_SIZEOF(long)
889 dnl ----------------------------
890 dnl check existance of functions
891 dnl ----------------------------
897 dnl -------------------------------
898 dnl bgpd needs pow() and hence libm
899 dnl -------------------------------
901 AC_CHECK_HEADER([math.h],
902 [AC_CHECK_LIB([m], [pow],
905 AC_CHECK_FUNCS(pow,[],[LIBM=""])
908 if test x"$LIBM" = x ; then
909 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
922 AC_CHECK_HEADER([asm-generic/unistd.h],
923 [AC_CHECK_DECL(__NR_setns,
924 AC_DEFINE(HAVE_NETNS,, Have netns),,
925 FRR_INCLUDES [#include <asm-generic/unistd.h>
927 AC_CHECK_FUNCS(setns)]
930 dnl ------------------------------------
931 dnl Determine routing get and set method
932 dnl ------------------------------------
933 AC_MSG_CHECKING(zebra between kernel interface method)
934 if test x"$opsys" = x"gnu-linux"; then
935 AC_MSG_RESULT(netlink)
936 RT_METHOD=rt_netlink.o
937 KERNEL_METHOD=kernel_netlink.o
938 AC_DEFINE(HAVE_NETLINK,,netlink)
940 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
942 AC_MSG_RESULT(Route socket)
943 KERNEL_METHOD="kernel_socket.o"
944 RT_METHOD="rt_socket.o"
947 AC_SUBST(KERNEL_METHOD)
948 AM_CONDITIONAL([HAVE_NETLINK], [test "x$netlink" = "xyes"])
950 dnl --------------------------
951 dnl Determine IS-IS I/O method
952 dnl --------------------------
953 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
954 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
955 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
956 AC_CHECK_HEADER(net/bpf.h)
957 AC_CHECK_HEADER(sys/dlpi.h)
958 AC_MSG_CHECKING(zebra IS-IS I/O method)
959 if test x"$opsys" = x"gnu-linux"; then
960 AC_MSG_RESULT(pfpacket)
961 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
962 elif test x"$opsys" = x"sol2-6" -o x"$opsys" = x"sol8"; then
964 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
966 if test $ac_cv_header_net_bpf_h = no; then
967 if test $ac_cv_header_sys_dlpi_h = no; then
969 AC_MSG_WARN([*** IS-IS support will not be built ***])
974 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
977 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
980 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
982 dnl ------------------------------------
983 dnl check for broken CMSG_FIRSTHDR macro
984 dnl ------------------------------------
985 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
986 AC_RUN_IFELSE([AC_LANG_SOURCE([[
989 #define __EXTENSIONS__
992 #include <sys/types.h>
993 #include <sys/socket.h>
1000 msg.msg_control = buf;
1001 msg.msg_controllen = 0;
1003 if (CMSG_FIRSTHDR(&msg) != NULL)
1006 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
1007 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
1009 dnl ------------------------------
1010 dnl check kernel route read method
1011 dnl ------------------------------
1012 AC_CACHE_CHECK([route read method], [frr_cv_rtread_method],
1013 [if test "x$netlink" = xyes; then
1014 frr_cv_rtread_method="netlink"
1016 for frr_cv_rtread_method in /dev/ip /dev/null;
1018 test x`ls $frr_cv_rtread_method 2>/dev/null` = x"$frr_cv_rtread_method" && break
1020 case $frr_cv_rtread_method in
1023 *-freebsd*) frr_cv_rtread_method="sysctl";;
1024 *) frr_cv_rtread_method="getmsg";;
1027 frr_cv_rtread_method="sysctl";;
1030 RTREAD_METHOD=rtread_${frr_cv_rtread_method}.o
1031 AC_SUBST(RTREAD_METHOD)
1033 dnl -----------------------------
1034 dnl check interface lookup method
1035 dnl -----------------------------
1036 IOCTL_METHOD=ioctl.o
1037 AC_MSG_CHECKING(interface looking up method)
1038 if test "$netlink" = yes; then
1039 AC_MSG_RESULT(netlink)
1040 IF_METHOD=if_netlink.o
1041 elif test "$opsys" = "sol2-6";then
1042 AC_MSG_RESULT(Solaris GIF)
1043 IF_METHOD=if_ioctl.o
1044 elif test "$opsys" = "sol8";then
1045 AC_MSG_RESULT(Solaris GLIF)
1046 IF_METHOD=if_ioctl_solaris.o
1047 IOCTL_METHOD=ioctl_solaris.o
1048 elif test "$opsys" = "openbsd";then
1049 AC_MSG_RESULT(openbsd)
1050 IF_METHOD=if_ioctl.o
1051 elif grep NET_RT_IFLIST /usr/include/sys/socket.h >/dev/null 2>&1; then
1052 AC_MSG_RESULT(sysctl)
1053 IF_METHOD=if_sysctl.o
1054 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
1056 AC_MSG_RESULT(ioctl)
1057 IF_METHOD=if_ioctl.o
1060 AC_SUBST(IOCTL_METHOD)
1062 dnl ---------------------------------------------------------------
1063 dnl figure out how to specify an interface in multicast sockets API
1064 dnl ---------------------------------------------------------------
1065 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1067 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1068 #include <sys/socket.h>
1069 #include <netinet/in.h>
1070 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1071 #include <linux/types.h>
1074 m4_define([FRR_INCLUDES],
1076 [#if HAVE_LINUX_MROUTE_H
1077 # include <linux/mroute.h>
1081 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1082 #include <sys/socket.h>
1083 #include <sys/types.h>
1084 #include <netinet/in.h>
1085 #include <net/route.h>
1088 m4_define([FRR_INCLUDES],
1090 [#if HAVE_NETINET_IP_MROUTE_H
1091 # include <netinet/ip_mroute.h>
1095 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1096 AC_TRY_COMPILE([#include <sys/param.h>],
1097 [#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)
1100 #error No support for BSD struct ip_mreq hack detected
1101 #endif],[AC_MSG_RESULT(yes)
1102 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1105 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1107 #include <sys/types.h>
1108 #include <netinet/in.h>
1109 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1110 ], [AC_MSG_RESULT(yes)
1111 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1114 dnl ---------------------------------------------------------------
1115 dnl figure out how to check link-state
1116 dnl ---------------------------------------------------------------
1117 AC_CHECK_HEADER( [net/if_media.h],
1118 [m4_define([LINK_DETECT_INCLUDES],
1120 [#include <net/if_media.h>
1122 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1123 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1124 [], LINK_DETECT_INCLUDES)],
1128 dnl ---------------------------------------------------------------
1129 dnl Additional, newer way to check link-state using ifi_link_state.
1130 dnl Not available in all BSD's when ifmediareq available
1131 dnl ---------------------------------------------------------------
1132 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1133 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1136 dnl ------------------------
1137 dnl TCP_MD5SIG socket option
1138 dnl ------------------------
1140 AC_CHECK_HEADER([netinet/tcp.h],
1141 [m4_define([MD5_INCLUDES],
1143 [#include <netinet/tcp.h>
1145 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1148 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1149 AC_CHECK_HEADER([linux/tcp.h],
1150 [m4_define([MD5_INCLUDES],
1152 [#include <linux/tcp.h>
1154 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1157 dnl -----------------------------
1158 dnl check ipforward detect method
1159 dnl -----------------------------
1160 AC_CACHE_CHECK([ipforward method], [frr_cv_ipforward_method],
1161 [if test x$cross_compiling = xyes; then
1162 if test x"$opsys" = x"gnu-linux"; then
1163 frr_cv_ipforward_method=/proc/net/snmp
1165 frr_cv_ipforward_method=/dev/ip
1168 for frr_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null;
1170 test x`ls $frr_cv_ipforward_method 2>/dev/null` = x"$frr_cv_ipforward_method" && break
1173 case $frr_cv_ipforward_method in
1174 "/proc/net/snmp") frr_cv_ipforward_method="proc";;
1177 *-freebsd*) frr_cv_ipforward_method="sysctl";;
1178 *) frr_cv_ipforward_method="solaris";;
1180 *) frr_cv_ipforward_method="sysctl";;
1182 IPFORWARD=ipforward_${frr_cv_ipforward_method}.o
1185 dnl ----------------------------------------------------------------------------
1186 dnl figure out if domainname is available in the utsname struct (GNU extension).
1187 dnl ----------------------------------------------------------------------------
1188 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1193 AC_MSG_CHECKING(whether does this OS have IPv6 stack)
1197 if grep WIDE /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1198 AC_DEFINE(KAME,1,KAME IPv6)
1200 dnl ------------------------------------
1201 dnl Solaris 9, 10 and potentially higher
1202 dnl ------------------------------------
1203 elif test x"$opsys" = x"sol8"; then
1204 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
1205 AC_MSG_RESULT(Solaris IPv6)
1209 elif test x"$opsys" = x"gnu-linux"; then
1210 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
1211 dnl Linux has a compilation problem with mixing
1212 dnl netinet/in.h and linux/in6.h they are not
1213 dnl compatible. There has been discussion on
1214 dnl how to fix it but no real progress on implementation
1215 dnl when they fix it, remove this
1216 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
1217 AC_MSG_RESULT(Linux IPv6)
1219 AC_MSG_ERROR([Failed to detect IPv6 stack])
1222 dnl ------------------
1223 dnl IPv6 header checks
1224 dnl ------------------
1225 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1226 netinet6/in6_var.h netinet6/nd6.h], [], [],
1229 m4_define([FRR_INCLUDES],dnl
1231 [#if HAVE_NETINET6_IN6_H
1232 #include <netinet6/in6.h>
1234 #if HAVE_NETINET_IN6_VAR_H
1235 #include <netinet/in6_var.h>
1237 #include <netinet/icmp6.h>
1238 #if HAVE_NETINET6_IN6_VAR_H
1239 # include <netinet6/in6_var.h>
1241 #if HAVE_NETINET6_ND6_H
1242 # include <netinet6/nd6.h>
1246 dnl disable doc check
1247 if test "${enable_doc}" = "no";then
1253 dnl --------------------
1254 dnl Daemon disable check
1255 dnl --------------------
1256 if test "${enable_zebra}" = "no";then
1261 AM_CONDITIONAL(ZEBRA, test "x$ZEBRA" = "xzebra")
1263 if test "${enable_bgpd}" = "no";then
1268 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1270 if test "${enable_ripd}" = "no";then
1275 AM_CONDITIONAL(RIPD, test "x$RIPD" = "xripd")
1277 if test "${enable_ospfd}" = "no";then
1282 AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd")
1284 if test "${enable_ldpd}" = "no";then
1287 AX_PROG_PERL_MODULES(XML::LibXML, , [
1288 if test -f "${srcdir}/ldpd/ldp_vty_cmds.c"; then
1289 AC_MSG_WARN([XML::LibXML perl module not found, using pregenerated ldp_vty_cmds.c])
1291 AC_MSG_ERROR([XML::LibXML perl module not found and pregenerated ldp_vty_cmds.c missing])
1296 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1298 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1301 if test "$opsys" = "gnu-linux"; then
1302 if test "${enable_nhrpd}" != "no"; then
1306 if test "${enable_nhrpd}" = "yes"; then
1307 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1310 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1312 if test "${enable_eigrpd}" = "no";then
1317 AM_CONDITIONAL(EIGRPD, test "x$EIGRPD" = "xeigrpd")
1319 if test "${enable_watchfrr}" = "no";then
1324 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1327 if test "${enable_ospfapi}" != "no";then
1328 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1330 if test "${enable_ospfclient}" != "no";then
1331 OSPFCLIENT="ospfclient"
1335 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1337 case "${enable_ripngd}" in
1339 * ) RIPNGD="ripngd";;
1341 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1343 case "${enable_ospf6d}" in
1345 * ) OSPF6D="ospf6d";;
1347 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1349 case "${enable_isisd}" in
1353 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1355 case "${enable_pimd}" in
1359 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1361 if test "${enable_bgp_announce}" = "no";then
1362 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1364 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1367 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1368 with_rfp_path="bgpd/rfp-example"
1370 if test "${with_rfp_path}" != "no"; then
1371 VNC_RFP_PATH="${with_rfp_path}"
1372 AC_SUBST(VNC_RFP_PATH)
1375 if test "${enable_bgp_vnc}" != "no";then
1376 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1377 RFPTEST="${with_rfp_path}/rfptest"
1378 LIBRFP="${with_rfp_path}/librfp"
1379 RFPINC="${with_rfp_path}/librfp"
1383 RFPINC="bgpd/rfp-example/librfp"
1386 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1407 AC_SUBST(OSPFCLIENT)
1409 AC_CHECK_LIB(crypt, crypt)
1410 AC_CHECK_LIB(resolv, res_init)
1412 dnl ---------------------------
1413 dnl check system has PCRE regexp
1414 dnl ---------------------------
1415 if test "x$enable_pcreposix" = "xyes"; then
1416 AC_CHECK_LIB(pcreposix, pcreposix_regexec, ,[enable_pcreposix=no
1417 AC_MSG_WARN([*** falling back to other regex library ***]) ])
1419 AC_SUBST(HAVE_LIBPCREPOSIX)
1421 dnl ------------------
1422 dnl check C-Ares library
1423 dnl ------------------
1424 if test "${NHRPD}" != ""; then
1425 PKG_CHECK_MODULES([CARES], [libcares])
1429 dnl ------------------
1430 dnl check Net-SNMP library
1431 dnl ------------------
1432 if test "${enable_snmp}" != ""; then
1433 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1434 if test x"$NETSNMP_CONFIG" = x"no"; then
1435 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1437 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1438 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1439 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1440 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1447 ])],[AC_MSG_RESULT(yes)],[
1449 AC_MSG_ERROR([--enable-snmp given but not usable])])
1450 case "${enable_snmp}" in
1455 SNMP_METHOD="${enable_snmp}"
1458 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1461 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1462 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1463 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1465 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1467 AC_SUBST(SNMP_CFLAGS)
1472 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1473 AC_MSG_ERROR([unable to find the dlopen()])
1476 AC_CHECK_HEADERS([link.h])
1478 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1479 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1487 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1490 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1495 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1496 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1503 struct link_map *lm = NULL;
1504 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1507 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1513 AM_CONDITIONAL(SNMP, test "x$SNMP_METHOD" = "xagentx")
1515 dnl ---------------------------
1516 dnl sockaddr and netinet checks
1517 dnl ---------------------------
1520 struct vifctl, struct mfcctl, struct sioc_sg_req,
1521 vifi_t, struct sioc_vif_req, struct igmpmsg,
1522 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1523 struct nd_opt_adv_interval, struct rt_addrinfo,
1524 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1525 [], [], FRR_INCLUDES)
1527 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1528 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1529 struct sockaddr_dl.sdl_len,
1530 struct if6_aliasreq.ifra_lifetime,
1531 struct nd_opt_adv_interval.nd_opt_ai_type],
1532 [], [], FRR_INCLUDES)
1534 dnl ---------------------------
1535 dnl IRDP/pktinfo/icmphdr checks
1536 dnl ---------------------------
1537 AC_CHECK_TYPES([struct in_pktinfo],
1538 [AC_CHECK_TYPES([struct icmphdr],
1539 [if test "${enable_irdp}" != "no"; then
1540 AC_DEFINE(HAVE_IRDP,, IRDP)
1542 [if test "${enable_irdp}" = "yes"; then
1543 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1544 fi], [FRR_INCLUDES])],
1545 [if test "${enable_irdp}" = "yes"; then
1546 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1547 fi], [FRR_INCLUDES])
1549 dnl -----------------------
1550 dnl checking for IP_PKTINFO
1551 dnl -----------------------
1552 AC_MSG_CHECKING(for IP_PKTINFO)
1553 AC_TRY_COMPILE([#include <netdb.h>], [
1554 int opt = IP_PKTINFO;
1557 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1562 dnl ---------------------------
1563 dnl checking for IP_RECVDSTADDR
1564 dnl ---------------------------
1565 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1566 AC_TRY_COMPILE([#include <netinet/in.h>], [
1567 int opt = IP_RECVDSTADDR;
1570 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1575 dnl ----------------------
1576 dnl checking for IP_RECVIF
1577 dnl ----------------------
1578 AC_MSG_CHECKING(for IP_RECVIF)
1579 AC_TRY_COMPILE([#include <netinet/in.h>], [
1580 int opt = IP_RECVIF;
1583 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1588 dnl ----------------------
1589 dnl checking for SO_BINDANY
1590 dnl ----------------------
1591 AC_MSG_CHECKING(for SO_BINDANY)
1592 AC_TRY_COMPILE([#include <sys/socket.h>], [
1593 int opt = SO_BINDANY;
1596 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1601 dnl ----------------------
1602 dnl checking for IP_FREEBIND
1603 dnl ----------------------
1604 AC_MSG_CHECKING(for IP_FREEBIND)
1605 AC_TRY_COMPILE([#include <netinet/in.h>], [
1606 int opt = IP_FREEBIND;
1609 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1614 dnl --------------------------------------
1615 dnl checking for be32dec existence or not
1616 dnl --------------------------------------
1617 AC_CHECK_DECLS([be32enc, be32dec], [], [],
1618 [#include <sys/endian.h>])
1620 dnl --------------------------------------
1621 dnl checking for clock_time monotonic struct and call
1622 dnl --------------------------------------
1623 AC_CHECK_DECL(CLOCK_MONOTONIC,
1624 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1625 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1626 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1628 dnl --------------------------------------
1629 dnl checking for flex and bison
1630 dnl --------------------------------------
1633 AC_MSG_CHECKING(version of flex)
1634 quagga_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1635 quagga_ac_flex_version="${quagga_ac_flex_version##* }"
1636 AC_MSG_RESULT([$quagga_ac_flex_version])
1637 AX_COMPARE_VERSION([$quagga_ac_flex_version], [lt], [2.5.20], [
1638 LEX="$SHELL $missing_dir/missing flex"
1639 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1640 AC_MSG_WARN([using pregenerated flex output files])
1642 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1644 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1645 AC_SUBST([LEXLIB], [''])
1649 dnl thanks GNU bison for this b*llshit...
1650 AC_MSG_CHECKING(version of bison)
1651 quagga_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1652 quagga_ac_bison_version="${quagga_ac_bison_version##* }"
1653 quagga_ac_bison_missing="false"
1654 case "x${quagga_ac_bison_version}" in
1657 BISON_CLOSEBRACE='"'
1659 AC_MSG_RESULT([$quagga_ac_bison_version - 2.7 or older])
1662 AC_MSG_RESULT([$quagga_ac_bison_version])
1663 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1664 quagga_ac_bison_missing="true"
1667 AC_MSG_RESULT([none])
1668 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1669 quagga_ac_bison_missing="true"
1673 BISON_CLOSEBRACE='}'
1674 BISON_VERBOSE='-Dparse.error=verbose'
1675 AC_MSG_RESULT([$quagga_ac_bison_version - 3.0 or newer])
1678 AC_SUBST(BISON_OPENBRACE)
1679 AC_SUBST(BISON_CLOSEBRACE)
1680 AC_SUBST(BISON_VERBOSE)
1682 if $quagga_ac_bison_missing; then
1683 YACC="$SHELL $missing_dir/missing bison -y"
1684 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1685 AC_MSG_WARN([using pregenerated bison output files])
1687 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1691 dnl -------------------
1692 dnl capabilities checks
1693 dnl -------------------
1694 if test "${enable_capabilities}" != "no"; then
1695 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1696 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1698 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1699 frr_ac_keepcaps="yes"],
1702 if test x"${frr_ac_keepcaps}" = x"yes"; then
1703 AC_CHECK_HEADERS(sys/capability.h)
1705 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1706 AC_CHECK_LIB(cap, cap_init,
1707 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1712 AC_CHECK_HEADERS(priv.h,
1713 [AC_MSG_CHECKING(Solaris style privileges are available)
1714 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1716 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1717 frr_ac_scaps="yes"],
1723 if test x"${frr_ac_scaps}" = x"yes" \
1724 -o x"${frr_ac_lcaps}" = x"yes"; then
1725 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1730 dnl ---------------------------
1731 dnl check for glibc 'backtrace'
1732 dnl ---------------------------
1733 if test x"${enable_backtrace}" != x"no" ; then
1735 AC_CHECK_HEADER([execinfo.h], [
1736 AC_SEARCH_LIBS([backtrace], [execinfo], [
1737 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1738 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1743 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1744 dnl user explicitly requested backtrace but we failed to find support
1745 AC_MSG_FAILURE([failed to find backtrace support])
1749 dnl -----------------------------------------
1750 dnl check for malloc mallinfo struct and call
1751 dnl this must try and link using LIBS, in
1752 dnl order to check no alternative allocator
1753 dnl has been specified, which might not provide
1754 dnl mallinfo, e.g. such as Umem on Solaris.
1755 dnl -----------------------------------------
1756 AC_CHECK_HEADER([malloc.h],
1757 [AC_MSG_CHECKING(whether mallinfo is available)
1758 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1759 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1761 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1764 ], [], FRR_INCLUDES)
1769 CONFDATE=`date '+%Y%m%d'`
1772 dnl ------------------------------
1773 dnl set paths for state directory
1774 dnl ------------------------------
1775 AC_MSG_CHECKING(directory to use for state file)
1776 if test "${prefix}" = "NONE"; then
1777 frr_statedir_prefix="";
1779 frr_statedir_prefix=${prefix}
1781 if test "${localstatedir}" = '${prefix}/var'; then
1782 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1783 ${frr_statedir_prefix}/var/adm dnl
1784 ${frr_statedir_prefix}/etc dnl
1790 test -d $FRR_STATE_DIR && break
1792 frr_statedir=$FRR_STATE_DIR
1794 frr_statedir=${localstatedir}
1796 if test $frr_statedir = "/dev/null"; then
1797 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1799 AC_MSG_RESULT(${frr_statedir})
1800 AC_SUBST(frr_statedir)
1802 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1803 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1804 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1806 dnl autoconf does this, but it does it too late...
1807 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1808 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1810 dnl get the full path, recursing through variables...
1811 vtysh_bin="$bindir/vtysh"
1812 for I in 1 2 3 4 5 6 7 8 9 10; do
1813 eval vtysh_bin="\"$vtysh_bin\""
1815 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1817 CFG_SYSCONF="$sysconfdir"
1819 CFG_STATE="$frr_statedir"
1820 CFG_MODULE="$moduledir"
1821 for I in 1 2 3 4 5 6 7 8 9 10; do
1822 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1823 eval CFG_SBIN="\"$CFG_SBIN\""
1824 eval CFG_STATE="\"$CFG_STATE\""
1825 eval CFG_MODULE="\"$CFG_MODULE\""
1827 AC_SUBST(CFG_SYSCONF)
1830 AC_SUBST(CFG_MODULE)
1831 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1833 dnl ---------------------------
1834 dnl Check htonl works correctly
1835 dnl ---------------------------
1836 AC_MSG_CHECKING(for working htonl)
1837 AC_CACHE_VAL(ac_cv_htonl_works,
1838 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1839 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1842 AC_MSG_RESULT($ac_cv_htonl_works)
1844 AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile
1845 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile
1846 ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile
1847 doc/Makefile ospfclient/Makefile tests/Makefile m4/Makefile
1857 snapcraft/snapcraft.yaml
1859 tests/lib/cli/test_cli.refout
1876 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1877 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1880 if test "${enable_bgp_vnc}" != "no"; then
1881 if test "${with_rfp_path}" = "bgpd/rfp-example" ; then
1882 AC_CONFIG_FILES([bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile])
1884 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1888 AC_CONFIG_FILES([solaris/Makefile])
1890 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1892 ## Hack, but working solution to avoid rebuilding of quagga.info.
1893 ## It's already in CVS until texinfo 4.7 is more common.
1897 FRRouting configuration
1898 ------------------------------
1899 FRR version : ${PACKAGE_VERSION}
1900 host operating system : ${host_os}
1901 source code location : ${srcdir}
1903 compiler flags : ${CFLAGS}
1905 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1906 state file directory : ${frr_statedir}
1907 config file directory : `eval echo \`echo ${sysconfdir}\``
1908 example directory : `eval echo \`echo ${exampledir}\``
1909 module directory : ${CFG_MODULE}
1910 user to run as : ${enable_user}
1911 group to run as : ${enable_group}
1912 group for vty sockets : ${enable_vty_group}
1913 config file mask : ${enable_configfile_mask}
1914 log file mask : ${enable_logfile_mask}
1915 zebra protobuf enabled : ${have_protobuf:-no}
1917 The above user and group must have read/write access to the state file
1918 directory and to the config files in the config file directory."