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" ])
231 AC_ARG_WITH(vtysh_pager,
232 AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
233 VTYSH_PAGER=$withval, VTYSH_PAGER="more")
235 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for Quagga]))
237 AS_HELP_STRING([--disable-doc], [do not build docs]))
239 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
241 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
243 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
244 AC_ARG_ENABLE(ripngd,
245 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
247 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
248 AC_ARG_ENABLE(ospf6d,
249 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
251 AS_HELP_STRING([--enable-ldpd], [build ldpd]))
253 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
254 AC_ARG_ENABLE(eigrpd,
255 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
256 AC_ARG_ENABLE(watchfrr,
257 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
259 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
261 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
262 AC_ARG_ENABLE(bgp-announce,
263 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
264 AC_ARG_ENABLE(bgp-vnc,
265 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
266 AC_ARG_WITH(rfp-path,
267 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
269 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
271 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
272 AC_ARG_ENABLE(tcp-zebra,
273 AS_HELP_STRING([--enable-tcp-zebra], [enable TCP/IP socket connection between zebra and protocol daemon]))
274 AC_ARG_ENABLE(ospfapi,
275 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
276 AC_ARG_ENABLE(ospfclient,
277 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
278 (this is the default if --disable-ospfapi is set)]))
279 AC_ARG_ENABLE(multipath,
280 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
282 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
284 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
285 AC_ARG_ENABLE(vty_group,
286 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
287 AC_ARG_ENABLE(configfile_mask,
288 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
289 AC_ARG_ENABLE(logfile_mask,
290 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
291 AC_ARG_ENABLE(shell_access,
292 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
294 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
296 AS_HELP_STRING([--enable-irdp], [enable IRDP server support in zebra]))
297 AC_ARG_ENABLE(capabilities,
298 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
299 AC_ARG_ENABLE(rusage,
300 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
301 AC_ARG_ENABLE(gcc_ultra_verbose,
302 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
303 AC_ARG_ENABLE(linux24_tcp_md5,
304 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
305 AC_ARG_ENABLE(backtrace,
306 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
307 AC_ARG_ENABLE(time-check,
308 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
309 AC_ARG_ENABLE(pcreposix,
310 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
312 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
313 AC_ARG_ENABLE(systemd,
314 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
316 AS_HELP_STRING([--enable-poll], [enable usage of Poll instead of select]))
317 AC_ARG_ENABLE(werror,
318 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
319 AC_ARG_ENABLE(cumulus,
320 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
321 AC_ARG_ENABLE(datacenter,
322 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
323 AC_ARG_ENABLE(rr-semantics,
324 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
325 AC_ARG_ENABLE([protobuf],
326 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
327 AC_ARG_ENABLE([oldvpn_commands],
328 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
330 AC_CHECK_HEADERS(json-c/json.h)
331 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c")
332 if test $ac_cv_lib_json_c_json_object_get = no; then
333 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
334 if test $ac_cv_lib_json_json_object_get = no; then
335 AC_MSG_ERROR([lib json is needed to compile])
339 AC_ARG_ENABLE([dev_build],
340 AS_HELP_STRING([--enable-dev-build], [build for development]))
342 if test x"${enable_time_check}" != x"no" ; then
343 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
344 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
346 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
350 case "${enable_systemd}" in
353 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
354 if test $ac_cv_lib_systemd_sd_notify = no; then
355 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
357 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
363 if test "${enable_rr_semantics}" != "no" ; then
364 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
367 if test "${enable_poll}" = "yes" ; then
368 AC_DEFINE(HAVE_POLL_CALL,,Compile systemd support in)
374 AC_MSG_CHECKING(whether this OS has MPLS stack)
377 MPLS_METHOD="zebra_mpls_netlink.o zebra_mpls.o"
378 AC_MSG_RESULT(Linux MPLS)
381 MPLS_METHOD="zebra_mpls_openbsd.o zebra_mpls.o"
382 AC_MSG_RESULT(OpenBSD MPLS)
385 MPLS_METHOD="zebra_mpls_null.o"
386 AC_MSG_RESULT(Unsupported kernel)
389 AC_SUBST(MPLS_METHOD)
391 if test "${enable_datacenter}" = "yes" ; then
392 AC_DEFINE(HAVE_DATACENTER,,Compile extensions for a DataCenter)
393 DFLT_NAME="datacenter"
395 DFLT_NAME="traditional"
398 if test "${enable_cumulus}" = "yes" ; then
399 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
403 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
405 if test "${enable_shell_access}" = "yes"; then
406 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
409 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
411 if test "x${enable_dev_build}" = "xyes"; then
412 AC_DEFINE(DEV_BUILD,,Build for development)
414 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
417 # Logic for protobuf support.
419 if test "$enable_protobuf" = "yes"; then
423 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
424 if test "x$PROTOC_C" = "x/bin/false"; then
428 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
429 [found_protobuf_c=yes],
430 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
432 if test "x$found_protobuf_c" = "xyes"; then
433 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
434 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
436 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
437 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
443 # Logic for old vpn commans support.
445 if test "$enable_oldvpn_commands" = "yes"; then
446 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
449 # Fail if the user explicity enabled protobuf support and we couldn't
450 # find the compiler or libraries.
451 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
452 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
455 if test "x$have_protobuf" = "xyes"; then
456 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
459 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
462 # End of logic for protobuf support.
465 if test "${enable_tcp_zebra}" = "yes"; then
466 AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
469 if test "${enable_linux24_tcp_md5}" = "yes"; then
470 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
473 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
474 if test "${enable_rtadv}" != "no"; then
476 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
481 if test "${enable_irdp}" = "yes"; then
482 AC_DEFINE(HAVE_IRDP,, IRDP )
485 if test x"${enable_user}" = x"no"; then
488 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
491 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
494 if test x"${enable_group}" = x"no"; then
497 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
500 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
503 if test x"${enable_vty_group}" = x"yes" ; then
504 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
505 elif test x"${enable_vty_group}" != x""; then
506 if test x"${enable_vty_group}" != x"no"; then
507 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
510 AC_SUBST([enable_user])
511 AC_SUBST([enable_group])
512 AC_SUBST([enable_vty_group])
514 enable_configfile_mask=${enable_configfile_mask:-0600}
515 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
517 enable_logfile_mask=${enable_logfile_mask:-0600}
518 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
522 case "${enable_multipath}" in
526 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
527 MPATH_NUM="${enable_multipath}"
532 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
536 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
538 AC_DEFINE_UNQUOTED(VTYSH_PAGER, "$VTYSH_PAGER", [What pager to use])
540 dnl -----------------------------------
541 dnl Add extra version string to package
542 dnl name, string and version fields.
543 dnl -----------------------------------
544 if test "x${EXTRAVERSION}" != "x" ; then
545 VERSION="${VERSION}${EXTRAVERSION}"
546 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
547 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
548 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
551 if test "x$with_pkg_git_version" = "xyes"; then
552 if test -d "${srcdir}/.git"; then
553 AC_DEFINE(GIT_VERSION, [1], [include git version info])
554 else with_pkg_git_version="no"
555 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
558 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
560 dnl ------------------------------------
561 dnl Check C keywords and standard types
562 dnl ------------------------------------
573 dnl -------------------------
574 dnl Check other header files.
575 dnl -------------------------
576 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
577 linux/version.h asm/types.h \
580 ac_stdatomic_ok=false
581 AC_DEFINE(FRR_AUTOCONF_ATOMIC, 1, [did autoconf checks for atomic funcs])
582 AC_CHECK_HEADER([stdatomic.h],[
584 AC_MSG_CHECKING([whether _Atomic qualifier works])
585 AC_LINK_IFELSE([AC_LANG_SOURCE([[
586 #include <stdatomic.h>
587 int main(int argc, char **argv) {
592 AC_DEFINE(HAVE_STDATOMIC_H, 1, [found stdatomic.h])
600 AS_IF([$ac_stdatomic_ok], [true], [
601 AC_MSG_CHECKING([for __atomic_* builtins])
602 AC_LINK_IFELSE([AC_LANG_SOURCE([[
603 int main(int argc, char **argv) {
605 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
606 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
609 AC_DEFINE(HAVE___ATOMIC, 1, [found __atomic builtins])
614 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
615 AC_MSG_CHECKING([for __sync_* builtins])
616 AC_LINK_IFELSE([AC_LANG_SOURCE([[
617 int main(int argc, char **argv) {
619 __sync_fetch_and_sub (&i, 1);
620 return __sync_val_compare_and_swap (&i, 0, 1);
623 AC_DEFINE(HAVE___SYNC, 1, [found __sync builtins])
626 AC_MSG_CHECKING([for __sync_swap builtin])
627 AC_LINK_IFELSE([AC_LANG_SOURCE([[
628 int main(int argc, char **argv) {
630 return __sync_swap (&i, 2);
633 AC_DEFINE(HAVE___SYNC_SWAP, 1, [found __sync_swap builtin])
641 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
646 dnl Utility macro to avoid retyping includes all the time
647 m4_define([FRR_INCLUDES],
650 #define __EXTENSIONS__
655 #include <sys/types.h>
656 /* sys/conf.h depends on param.h on FBSD at least */
657 #include <sys/param.h>
658 /* Required for MAXSIG */
660 #include <sys/socket.h>
662 # define __APPLE_USE_RFC_3542
664 #include <netinet/in.h>
665 #include <sys/time.h>
670 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
671 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
672 dnl an additional round for it.
674 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
676 m4_define([FRR_INCLUDES],
678 [#if HAVE_NET_IF_VAR_H
679 # include <net/if_var.h>
683 AC_CHECK_HEADERS([netinet/in_var.h \
684 net/if_dl.h net/netopt.h \
685 inet/nd.h netinet/ip_icmp.h \
686 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
687 [], [], FRR_INCLUDES)
689 AC_CHECK_HEADERS([ucontext.h], [], [],
692 #endif /* __USE_GNU */
696 m4_define([UCONTEXT_INCLUDES],
697 [#include <ucontext.h>])dnl
699 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
700 [], [], [UCONTEXT_INCLUDES])
701 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
702 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
703 [], [], [UCONTEXT_INCLUDES])],
704 [], [UCONTEXT_INCLUDES])
705 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
706 [], [], [UCONTEXT_INCLUDES])
708 m4_define([FRR_INCLUDES],
712 #include <netinet/in_systm.h>
713 #if HAVE_NETINET_IN_VAR_H
714 # include <netinet/in_var.h>
717 # include <net/if_dl.h>
719 #if HAVE_NET_NETOPT_H
720 # include <net/netopt.h>
722 #include <net/route.h>
724 # include <inet/nd.h>
726 #include <arpa/inet.h>
727 /* Required for IDRP */
728 #if HAVE_NETINET_IP_ICMP_H
729 # include <netinet/ip_icmp.h>
733 dnl V6 headers are checked below, after we check for v6
735 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
737 [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
739 AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
740 AC_DEFINE(SUNOS_5, 1, SunOS 5)
741 AC_CHECK_LIB(xnet, main)
746 | [*-sunos5.1[0-9]] \
747 | [*-sunos5.1[0-9].[0-9]] \
748 | [*-solaris2.[8-9]] \
749 | [*-solaris2.1[0-9]] \
750 | [*-solaris2.1[0-9].[0-9]])
752 AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
753 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
754 AC_CHECK_LIB(socket, main)
755 AC_CHECK_LIB(nsl, main)
756 AC_CHECK_LIB(umem, main)
757 AC_CHECK_FUNCS([printstack],
758 [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
759 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
764 *-sunos5* | *-solaris2*)
765 AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
766 AC_CHECK_LIB(socket, main)
767 AC_CHECK_LIB(nsl, main)
773 AC_DEFINE(GNU_LINUX,,GNU Linux)
777 AC_DEFINE(OPEN_BSD,,OpenBSD)
783 dnl ---------------------
784 dnl Integrated VTY option
785 dnl ---------------------
786 case "${enable_vtysh}" in
789 AC_DEFINE(VTYSH,,VTY shell)
790 dnl Vtysh uses libreadline, which looks for termcap functions at
791 dnl configure time. We follow readlines search order.
792 dnl The required procedures are in libtermcap on NetBSD, in
793 dnl [TODO] on Linux, and in [TODO] on Solaris.
794 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
795 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
796 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
797 [AC_CHECK_LIB(ncurses, tputs,
798 LIBREADLINE="$LIBREADLINE -lncurses")]
802 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
804 if test $ac_cv_lib_readline_main = no; then
805 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
807 AC_CHECK_HEADER(readline/history.h)
808 if test $ac_cv_header_readline_history_h = no;then
809 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
811 AC_CHECK_LIB(readline, rl_completion_matches,
812 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
813 if test $ac_cv_lib_readline_rl_completion_matches = no; then
814 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
818 AC_SUBST(LIBREADLINE)
819 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
824 dnl Quagga detects the PAM library it is built against by checking for a
825 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
826 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
827 dnl openpam.h doesn't do that, although depends on the header too. Hence a
828 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
831 if test "$with_libpam" = "yes"; then
832 AC_CHECK_HEADER([security/pam_misc.h],
833 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
834 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
835 pam_conv_func="misc_conv"
838 AC_CHECK_HEADER([security/openpam.h],
839 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
840 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
841 pam_conv_func="openpam_ttyconv"
843 [], FRR_INCLUDES[#include <security/pam_appl.h>])
844 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
845 AC_MSG_WARN([*** pam support will not be built ***])
850 if test "$with_libpam" = "yes"; then
851 dnl took this test from proftpds configure.in and suited to our needs
852 dnl -------------------------------------------------------------------------
854 dnl This next check looks funky due to a linker problem with some versions
855 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
856 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
857 dnl with RedHat 6.2 and Debian 2.2 or better.
858 AC_CHECK_LIB(pam, pam_start,
859 [AC_CHECK_LIB(pam, $pam_conv_func,
860 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
862 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
863 LIBPAM="-lpam -lpam_misc"]
867 [AC_CHECK_LIB(pam, pam_end,
868 [AC_CHECK_LIB(pam, $pam_conv_func,
869 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
870 LIBPAM="-lpam -ldl"],
871 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
872 LIBPAM="-lpam -ldl -lpam_misc"]
874 ],AC_MSG_WARN([*** pam support will not be built ***]),
881 dnl -------------------------------
882 dnl Endian-ness check
883 dnl -------------------------------
886 dnl -------------------------------
887 dnl check the size in byte of the C
888 dnl -------------------------------
889 dnl AC_CHECK_SIZEOF(char)
890 dnl AC_CHECK_SIZEOF(int)
891 dnl AC_CHECK_SIZEOF(short)
892 dnl AC_CHECK_SIZEOF(long)
894 dnl ----------------------------
895 dnl check existance of functions
896 dnl ----------------------------
902 dnl -------------------------------
903 dnl bgpd needs pow() and hence libm
904 dnl -------------------------------
906 AC_CHECK_HEADER([math.h],
907 [AC_CHECK_LIB([m], [pow],
910 AC_CHECK_FUNCS(pow,[],[LIBM=""])
913 if test x"$LIBM" = x ; then
914 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
927 AC_CHECK_HEADER([asm-generic/unistd.h],
928 [AC_CHECK_DECL(__NR_setns,
929 AC_DEFINE(HAVE_NETNS,, Have netns),,
930 FRR_INCLUDES [#include <asm-generic/unistd.h>
932 AC_CHECK_FUNCS(setns)]
935 dnl ------------------------------------
936 dnl Determine routing get and set method
937 dnl ------------------------------------
938 AC_MSG_CHECKING(zebra between kernel interface method)
939 if test x"$opsys" = x"gnu-linux"; then
940 AC_MSG_RESULT(netlink)
941 RT_METHOD=rt_netlink.o
942 KERNEL_METHOD=kernel_netlink.o
943 AC_DEFINE(HAVE_NETLINK,,netlink)
945 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
947 AC_MSG_RESULT(Route socket)
948 KERNEL_METHOD="kernel_socket.o"
949 RT_METHOD="rt_socket.o"
952 AC_SUBST(KERNEL_METHOD)
953 AM_CONDITIONAL([HAVE_NETLINK], [test "x$netlink" = "xyes"])
955 dnl --------------------------
956 dnl Determine IS-IS I/O method
957 dnl --------------------------
958 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
959 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
960 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
961 AC_CHECK_HEADER(net/bpf.h)
962 AC_CHECK_HEADER(sys/dlpi.h)
963 AC_MSG_CHECKING(zebra IS-IS I/O method)
964 if test x"$opsys" = x"gnu-linux"; then
965 AC_MSG_RESULT(pfpacket)
966 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
967 elif test x"$opsys" = x"sol2-6" -o x"$opsys" = x"sol8"; then
969 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
971 if test $ac_cv_header_net_bpf_h = no; then
972 if test $ac_cv_header_sys_dlpi_h = no; then
974 AC_MSG_WARN([*** IS-IS support will not be built ***])
979 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
982 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
985 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
987 dnl ------------------------------------
988 dnl check for broken CMSG_FIRSTHDR macro
989 dnl ------------------------------------
990 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
991 AC_RUN_IFELSE([AC_LANG_SOURCE([[
994 #define __EXTENSIONS__
997 #include <sys/types.h>
998 #include <sys/socket.h>
1005 msg.msg_control = buf;
1006 msg.msg_controllen = 0;
1008 if (CMSG_FIRSTHDR(&msg) != NULL)
1011 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
1012 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
1014 dnl ------------------------------
1015 dnl check kernel route read method
1016 dnl ------------------------------
1017 AC_CACHE_CHECK([route read method], [frr_cv_rtread_method],
1018 [if test "x$netlink" = xyes; then
1019 frr_cv_rtread_method="netlink"
1021 for frr_cv_rtread_method in /dev/ip /dev/null;
1023 test x`ls $frr_cv_rtread_method 2>/dev/null` = x"$frr_cv_rtread_method" && break
1025 case $frr_cv_rtread_method in
1028 *-freebsd*) frr_cv_rtread_method="sysctl";;
1029 *) frr_cv_rtread_method="getmsg";;
1032 frr_cv_rtread_method="sysctl";;
1035 RTREAD_METHOD=rtread_${frr_cv_rtread_method}.o
1036 AC_SUBST(RTREAD_METHOD)
1038 dnl -----------------------------
1039 dnl check interface lookup method
1040 dnl -----------------------------
1041 IOCTL_METHOD=ioctl.o
1042 AC_MSG_CHECKING(interface looking up method)
1043 if test "$netlink" = yes; then
1044 AC_MSG_RESULT(netlink)
1045 IF_METHOD=if_netlink.o
1046 elif test "$opsys" = "sol2-6";then
1047 AC_MSG_RESULT(Solaris GIF)
1048 IF_METHOD=if_ioctl.o
1049 elif test "$opsys" = "sol8";then
1050 AC_MSG_RESULT(Solaris GLIF)
1051 IF_METHOD=if_ioctl_solaris.o
1052 IOCTL_METHOD=ioctl_solaris.o
1053 elif test "$opsys" = "openbsd";then
1054 AC_MSG_RESULT(openbsd)
1055 IF_METHOD=if_ioctl.o
1056 elif grep NET_RT_IFLIST /usr/include/sys/socket.h >/dev/null 2>&1; then
1057 AC_MSG_RESULT(sysctl)
1058 IF_METHOD=if_sysctl.o
1059 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
1061 AC_MSG_RESULT(ioctl)
1062 IF_METHOD=if_ioctl.o
1065 AC_SUBST(IOCTL_METHOD)
1067 dnl ---------------------------------------------------------------
1068 dnl figure out how to specify an interface in multicast sockets API
1069 dnl ---------------------------------------------------------------
1070 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1072 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1073 #include <sys/socket.h>
1074 #include <netinet/in.h>
1075 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1076 #include <linux/types.h>
1079 m4_define([FRR_INCLUDES],
1081 [#if HAVE_LINUX_MROUTE_H
1082 # include <linux/mroute.h>
1086 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1087 #include <sys/socket.h>
1088 #include <sys/types.h>
1089 #include <netinet/in.h>
1090 #include <net/route.h>
1093 m4_define([FRR_INCLUDES],
1095 [#if HAVE_NETINET_IP_MROUTE_H
1096 # include <netinet/ip_mroute.h>
1100 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1101 AC_TRY_COMPILE([#include <sys/param.h>],
1102 [#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)
1105 #error No support for BSD struct ip_mreq hack detected
1106 #endif],[AC_MSG_RESULT(yes)
1107 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1110 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1112 #include <sys/types.h>
1113 #include <netinet/in.h>
1114 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1115 ], [AC_MSG_RESULT(yes)
1116 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1119 dnl ---------------------------------------------------------------
1120 dnl figure out how to check link-state
1121 dnl ---------------------------------------------------------------
1122 AC_CHECK_HEADER( [net/if_media.h],
1123 [m4_define([LINK_DETECT_INCLUDES],
1125 [#include <net/if_media.h>
1127 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1128 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1129 [], LINK_DETECT_INCLUDES)],
1133 dnl ---------------------------------------------------------------
1134 dnl Additional, newer way to check link-state using ifi_link_state.
1135 dnl Not available in all BSD's when ifmediareq available
1136 dnl ---------------------------------------------------------------
1137 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1138 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1141 dnl ------------------------
1142 dnl TCP_MD5SIG socket option
1143 dnl ------------------------
1145 AC_CHECK_HEADER([netinet/tcp.h],
1146 [m4_define([MD5_INCLUDES],
1148 [#include <netinet/tcp.h>
1150 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1153 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1154 AC_CHECK_HEADER([linux/tcp.h],
1155 [m4_define([MD5_INCLUDES],
1157 [#include <linux/tcp.h>
1159 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1162 dnl -----------------------------
1163 dnl check ipforward detect method
1164 dnl -----------------------------
1165 AC_CACHE_CHECK([ipforward method], [frr_cv_ipforward_method],
1166 [if test x$cross_compiling = xyes; then
1167 if test x"$opsys" = x"gnu-linux"; then
1168 frr_cv_ipforward_method=/proc/net/snmp
1170 frr_cv_ipforward_method=/dev/ip
1173 for frr_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null;
1175 test x`ls $frr_cv_ipforward_method 2>/dev/null` = x"$frr_cv_ipforward_method" && break
1178 case $frr_cv_ipforward_method in
1179 "/proc/net/snmp") frr_cv_ipforward_method="proc";;
1182 *-freebsd*) frr_cv_ipforward_method="sysctl";;
1183 *) frr_cv_ipforward_method="solaris";;
1185 *) frr_cv_ipforward_method="sysctl";;
1187 IPFORWARD=ipforward_${frr_cv_ipforward_method}.o
1190 dnl ----------------------------------------------------------------------------
1191 dnl figure out if domainname is available in the utsname struct (GNU extension).
1192 dnl ----------------------------------------------------------------------------
1193 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1198 AC_MSG_CHECKING(whether does this OS have IPv6 stack)
1202 if grep WIDE /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1203 AC_DEFINE(KAME,1,KAME IPv6)
1205 dnl ------------------------------------
1206 dnl Solaris 9, 10 and potentially higher
1207 dnl ------------------------------------
1208 elif test x"$opsys" = x"sol8"; then
1209 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
1210 AC_MSG_RESULT(Solaris IPv6)
1214 elif test x"$opsys" = x"gnu-linux"; then
1215 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
1216 dnl Linux has a compilation problem with mixing
1217 dnl netinet/in.h and linux/in6.h they are not
1218 dnl compatible. There has been discussion on
1219 dnl how to fix it but no real progress on implementation
1220 dnl when they fix it, remove this
1221 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
1222 AC_MSG_RESULT(Linux IPv6)
1224 AC_MSG_ERROR([Failed to detect IPv6 stack])
1227 dnl ------------------
1228 dnl IPv6 header checks
1229 dnl ------------------
1230 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1231 netinet6/in6_var.h netinet6/nd6.h], [], [],
1234 m4_define([FRR_INCLUDES],dnl
1236 [#if HAVE_NETINET6_IN6_H
1237 #include <netinet6/in6.h>
1239 #if HAVE_NETINET_IN6_VAR_H
1240 #include <netinet/in6_var.h>
1242 #include <netinet/icmp6.h>
1243 #if HAVE_NETINET6_IN6_VAR_H
1244 # include <netinet6/in6_var.h>
1246 #if HAVE_NETINET6_ND6_H
1247 # include <netinet6/nd6.h>
1251 dnl disable doc check
1252 if test "${enable_doc}" = "no";then
1258 dnl --------------------
1259 dnl Daemon disable check
1260 dnl --------------------
1261 if test "${enable_zebra}" = "no";then
1266 AM_CONDITIONAL(ZEBRA, test "x$ZEBRA" = "xzebra")
1268 if test "${enable_bgpd}" = "no";then
1273 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1275 if test "${enable_ripd}" = "no";then
1280 AM_CONDITIONAL(RIPD, test "x$RIPD" = "xripd")
1282 if test "${enable_ospfd}" = "no";then
1287 AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd")
1289 if test "${enable_ldpd}" = "no";then
1292 AX_PROG_PERL_MODULES(XML::LibXML, , [
1293 if test -f "${srcdir}/ldpd/ldp_vty_cmds.c"; then
1294 AC_MSG_WARN([XML::LibXML perl module not found, using pregenerated ldp_vty_cmds.c])
1296 AC_MSG_ERROR([XML::LibXML perl module not found and pregenerated ldp_vty_cmds.c missing])
1301 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1303 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1306 if test "$opsys" = "gnu-linux"; then
1307 if test "${enable_nhrpd}" != "no"; then
1311 if test "${enable_nhrpd}" = "yes"; then
1312 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1315 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1317 if test "${enable_eigrpd}" = "no";then
1322 AM_CONDITIONAL(EIGRPD, test "x$EIGRPD" = "xeigrpd")
1324 if test "${enable_watchfrr}" = "no";then
1329 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1332 if test "${enable_ospfapi}" != "no";then
1333 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1335 if test "${enable_ospfclient}" != "no";then
1336 OSPFCLIENT="ospfclient"
1340 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1342 case "${enable_ripngd}" in
1344 * ) RIPNGD="ripngd";;
1346 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1348 case "${enable_ospf6d}" in
1350 * ) OSPF6D="ospf6d";;
1352 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1354 case "${enable_isisd}" in
1358 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1360 case "${enable_pimd}" in
1364 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1366 if test "${enable_bgp_announce}" = "no";then
1367 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1369 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1372 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1373 with_rfp_path="bgpd/rfp-example"
1375 if test "${with_rfp_path}" != "no"; then
1376 VNC_RFP_PATH="${with_rfp_path}"
1377 AC_SUBST(VNC_RFP_PATH)
1380 if test "${enable_bgp_vnc}" != "no";then
1381 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1382 RFPTEST="${with_rfp_path}/rfptest"
1383 LIBRFP="${with_rfp_path}/librfp"
1384 RFPINC="${with_rfp_path}/librfp"
1388 RFPINC="bgpd/rfp-example/librfp"
1391 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1412 AC_SUBST(OSPFCLIENT)
1414 AC_CHECK_LIB(crypt, crypt)
1415 AC_CHECK_LIB(resolv, res_init)
1417 dnl ---------------------------
1418 dnl check system has PCRE regexp
1419 dnl ---------------------------
1420 if test "x$enable_pcreposix" = "xyes"; then
1421 AC_CHECK_LIB(pcreposix, pcreposix_regexec, ,[enable_pcreposix=no
1422 AC_MSG_WARN([*** falling back to other regex library ***]) ])
1424 AC_SUBST(HAVE_LIBPCREPOSIX)
1426 dnl ------------------
1427 dnl check C-Ares library
1428 dnl ------------------
1429 if test "${NHRPD}" != ""; then
1430 PKG_CHECK_MODULES([CARES], [libcares])
1434 dnl ------------------
1435 dnl check Net-SNMP library
1436 dnl ------------------
1437 if test "${enable_snmp}" != ""; then
1438 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1439 if test x"$NETSNMP_CONFIG" = x"no"; then
1440 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1442 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1443 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1444 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1445 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1452 ])],[AC_MSG_RESULT(yes)],[
1454 AC_MSG_ERROR([--enable-snmp given but not usable])])
1455 case "${enable_snmp}" in
1460 SNMP_METHOD="${enable_snmp}"
1463 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1466 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1467 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1468 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1470 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1472 AC_SUBST(SNMP_CFLAGS)
1477 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1478 AC_MSG_ERROR([unable to find the dlopen()])
1481 AC_CHECK_HEADERS([link.h])
1483 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1484 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1492 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1495 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1500 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1501 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1508 struct link_map *lm = NULL;
1509 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1512 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1518 AM_CONDITIONAL(SNMP, test "x$SNMP_METHOD" = "xagentx")
1520 dnl ---------------------------
1521 dnl sockaddr and netinet checks
1522 dnl ---------------------------
1525 struct vifctl, struct mfcctl, struct sioc_sg_req,
1526 vifi_t, struct sioc_vif_req, struct igmpmsg,
1527 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1528 struct nd_opt_adv_interval, struct rt_addrinfo,
1529 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1530 [], [], FRR_INCLUDES)
1532 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1533 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1534 struct sockaddr_dl.sdl_len,
1535 struct if6_aliasreq.ifra_lifetime,
1536 struct nd_opt_adv_interval.nd_opt_ai_type],
1537 [], [], FRR_INCLUDES)
1539 dnl ---------------------------
1540 dnl IRDP/pktinfo/icmphdr checks
1541 dnl ---------------------------
1542 AC_CHECK_TYPES([struct in_pktinfo],
1543 [AC_CHECK_TYPES([struct icmphdr],
1544 [if test "${enable_irdp}" != "no"; then
1545 AC_DEFINE(HAVE_IRDP,, IRDP)
1547 [if test "${enable_irdp}" = "yes"; then
1548 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1549 fi], [FRR_INCLUDES])],
1550 [if test "${enable_irdp}" = "yes"; then
1551 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1552 fi], [FRR_INCLUDES])
1554 dnl -----------------------
1555 dnl checking for IP_PKTINFO
1556 dnl -----------------------
1557 AC_MSG_CHECKING(for IP_PKTINFO)
1558 AC_TRY_COMPILE([#include <netdb.h>], [
1559 int opt = IP_PKTINFO;
1562 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1567 dnl ---------------------------
1568 dnl checking for IP_RECVDSTADDR
1569 dnl ---------------------------
1570 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1571 AC_TRY_COMPILE([#include <netinet/in.h>], [
1572 int opt = IP_RECVDSTADDR;
1575 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1580 dnl ----------------------
1581 dnl checking for IP_RECVIF
1582 dnl ----------------------
1583 AC_MSG_CHECKING(for IP_RECVIF)
1584 AC_TRY_COMPILE([#include <netinet/in.h>], [
1585 int opt = IP_RECVIF;
1588 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1593 dnl ----------------------
1594 dnl checking for SO_BINDANY
1595 dnl ----------------------
1596 AC_MSG_CHECKING(for SO_BINDANY)
1597 AC_TRY_COMPILE([#include <sys/socket.h>], [
1598 int opt = SO_BINDANY;
1601 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1606 dnl ----------------------
1607 dnl checking for IP_FREEBIND
1608 dnl ----------------------
1609 AC_MSG_CHECKING(for IP_FREEBIND)
1610 AC_TRY_COMPILE([#include <netinet/in.h>], [
1611 int opt = IP_FREEBIND;
1614 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1619 dnl --------------------------------------
1620 dnl checking for be32dec existence or not
1621 dnl --------------------------------------
1622 AC_CHECK_DECLS([be32enc, be32dec], [], [],
1623 [#include <sys/endian.h>])
1625 dnl --------------------------------------
1626 dnl checking for clock_time monotonic struct and call
1627 dnl --------------------------------------
1628 AC_CHECK_DECL(CLOCK_MONOTONIC,
1629 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1630 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1631 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1633 dnl --------------------------------------
1634 dnl checking for flex and bison
1635 dnl --------------------------------------
1638 AC_MSG_CHECKING(version of flex)
1639 quagga_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1640 quagga_ac_flex_version="${quagga_ac_flex_version##* }"
1641 AC_MSG_RESULT([$quagga_ac_flex_version])
1642 AX_COMPARE_VERSION([$quagga_ac_flex_version], [lt], [2.5.20], [
1643 LEX="$SHELL $missing_dir/missing flex"
1644 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1645 AC_MSG_WARN([using pregenerated flex output files])
1647 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1649 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1650 AC_SUBST([LEXLIB], [''])
1654 dnl thanks GNU bison for this b*llshit...
1655 AC_MSG_CHECKING(version of bison)
1656 quagga_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1657 quagga_ac_bison_version="${quagga_ac_bison_version##* }"
1658 quagga_ac_bison_missing="false"
1659 case "x${quagga_ac_bison_version}" in
1662 BISON_CLOSEBRACE='"'
1664 AC_MSG_RESULT([$quagga_ac_bison_version - 2.7 or older])
1667 AC_MSG_RESULT([$quagga_ac_bison_version])
1668 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1669 quagga_ac_bison_missing="true"
1672 AC_MSG_RESULT([none])
1673 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1674 quagga_ac_bison_missing="true"
1678 BISON_CLOSEBRACE='}'
1679 BISON_VERBOSE='-Dparse.error=verbose'
1680 AC_MSG_RESULT([$quagga_ac_bison_version - 3.0 or newer])
1683 AC_SUBST(BISON_OPENBRACE)
1684 AC_SUBST(BISON_CLOSEBRACE)
1685 AC_SUBST(BISON_VERBOSE)
1687 if $quagga_ac_bison_missing; then
1688 YACC="$SHELL $missing_dir/missing bison -y"
1689 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1690 AC_MSG_WARN([using pregenerated bison output files])
1692 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1696 dnl -------------------
1697 dnl capabilities checks
1698 dnl -------------------
1699 if test "${enable_capabilities}" != "no"; then
1700 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1701 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1703 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1704 frr_ac_keepcaps="yes"],
1707 if test x"${frr_ac_keepcaps}" = x"yes"; then
1708 AC_CHECK_HEADERS(sys/capability.h)
1710 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1711 AC_CHECK_LIB(cap, cap_init,
1712 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1717 AC_CHECK_HEADERS(priv.h,
1718 [AC_MSG_CHECKING(Solaris style privileges are available)
1719 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1721 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1722 frr_ac_scaps="yes"],
1728 if test x"${frr_ac_scaps}" = x"yes" \
1729 -o x"${frr_ac_lcaps}" = x"yes"; then
1730 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1735 dnl ---------------------------
1736 dnl check for glibc 'backtrace'
1737 dnl ---------------------------
1738 if test x"${enable_backtrace}" != x"no" ; then
1740 AC_CHECK_HEADER([execinfo.h], [
1741 AC_SEARCH_LIBS([backtrace], [execinfo], [
1742 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1743 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1748 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1749 dnl user explicitly requested backtrace but we failed to find support
1750 AC_MSG_FAILURE([failed to find backtrace support])
1754 dnl -----------------------------------------
1755 dnl check for malloc mallinfo struct and call
1756 dnl this must try and link using LIBS, in
1757 dnl order to check no alternative allocator
1758 dnl has been specified, which might not provide
1759 dnl mallinfo, e.g. such as Umem on Solaris.
1760 dnl -----------------------------------------
1761 AC_CHECK_HEADER([malloc.h],
1762 [AC_MSG_CHECKING(whether mallinfo is available)
1763 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1764 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1766 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1769 ], [], FRR_INCLUDES)
1774 CONFDATE=`date '+%Y%m%d'`
1777 dnl ------------------------------
1778 dnl set paths for state directory
1779 dnl ------------------------------
1780 AC_MSG_CHECKING(directory to use for state file)
1781 if test "${prefix}" = "NONE"; then
1782 frr_statedir_prefix="";
1784 frr_statedir_prefix=${prefix}
1786 if test "${localstatedir}" = '${prefix}/var'; then
1787 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1788 ${frr_statedir_prefix}/var/adm dnl
1789 ${frr_statedir_prefix}/etc dnl
1795 test -d $FRR_STATE_DIR && break
1797 frr_statedir=$FRR_STATE_DIR
1799 frr_statedir=${localstatedir}
1801 if test $frr_statedir = "/dev/null"; then
1802 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1804 AC_MSG_RESULT(${frr_statedir})
1805 AC_SUBST(frr_statedir)
1807 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1808 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1809 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1811 dnl autoconf does this, but it does it too late...
1812 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1813 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1815 dnl get the full path, recursing through variables...
1816 vtysh_bin="$bindir/vtysh"
1817 for I in 1 2 3 4 5 6 7 8 9 10; do
1818 eval vtysh_bin="\"$vtysh_bin\""
1820 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1822 CFG_SYSCONF="$sysconfdir"
1824 CFG_STATE="$frr_statedir"
1825 CFG_MODULE="$moduledir"
1826 for I in 1 2 3 4 5 6 7 8 9 10; do
1827 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1828 eval CFG_SBIN="\"$CFG_SBIN\""
1829 eval CFG_STATE="\"$CFG_STATE\""
1830 eval CFG_MODULE="\"$CFG_MODULE\""
1832 AC_SUBST(CFG_SYSCONF)
1835 AC_SUBST(CFG_MODULE)
1836 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1838 dnl ---------------------------
1839 dnl Check htonl works correctly
1840 dnl ---------------------------
1841 AC_MSG_CHECKING(for working htonl)
1842 AC_CACHE_VAL(ac_cv_htonl_works,
1843 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1844 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1847 AC_MSG_RESULT($ac_cv_htonl_works)
1849 AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile
1850 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile
1851 ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile
1852 doc/Makefile ospfclient/Makefile tests/Makefile m4/Makefile
1862 snapcraft/snapcraft.yaml
1864 tests/lib/cli/test_cli.refout
1881 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1882 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1885 if test "${enable_bgp_vnc}" != "no"; then
1886 if test "${with_rfp_path}" = "bgpd/rfp-example" ; then
1887 AC_CONFIG_FILES([bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile])
1889 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1893 AC_CONFIG_FILES([solaris/Makefile])
1895 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1897 ## Hack, but working solution to avoid rebuilding of quagga.info.
1898 ## It's already in CVS until texinfo 4.7 is more common.
1902 FRRouting configuration
1903 ------------------------------
1904 FRR version : ${PACKAGE_VERSION}
1905 host operating system : ${host_os}
1906 source code location : ${srcdir}
1908 compiler flags : ${CFLAGS}
1910 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1911 state file directory : ${frr_statedir}
1912 config file directory : `eval echo \`echo ${sysconfdir}\``
1913 example directory : `eval echo \`echo ${exampledir}\``
1914 module directory : ${CFG_MODULE}
1915 user to run as : ${enable_user}
1916 group to run as : ${enable_group}
1917 group for vty sockets : ${enable_vty_group}
1918 config file mask : ${enable_configfile_mask}
1919 log file mask : ${enable_logfile_mask}
1920 zebra protobuf enabled : ${have_protobuf:-no}
1922 The above user and group must have read/write access to the state file
1923 directory and to the config files in the config file directory."