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(babeld,
257 AS_HELP_STRING([--disable-babeld], [do not build babeld]))
258 AC_ARG_ENABLE(watchfrr,
259 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
261 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
263 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
264 AC_ARG_ENABLE(bgp-announce,
265 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
266 AC_ARG_ENABLE(bgp-vnc,
267 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
268 AC_ARG_WITH(rfp-path,
269 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
271 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
273 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
274 AC_ARG_ENABLE(tcp-zebra,
275 AS_HELP_STRING([--enable-tcp-zebra], [enable TCP/IP socket connection between zebra and protocol daemon]))
276 AC_ARG_ENABLE(ospfapi,
277 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
278 AC_ARG_ENABLE(ospfclient,
279 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
280 (this is the default if --disable-ospfapi is set)]))
281 AC_ARG_ENABLE(multipath,
282 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
284 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
286 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
287 AC_ARG_ENABLE(vty_group,
288 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
289 AC_ARG_ENABLE(configfile_mask,
290 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
291 AC_ARG_ENABLE(logfile_mask,
292 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
293 AC_ARG_ENABLE(shell_access,
294 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
296 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
298 AS_HELP_STRING([--enable-irdp], [enable IRDP server support in zebra]))
299 AC_ARG_ENABLE(capabilities,
300 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
301 AC_ARG_ENABLE(rusage,
302 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
303 AC_ARG_ENABLE(gcc_ultra_verbose,
304 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
305 AC_ARG_ENABLE(linux24_tcp_md5,
306 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
307 AC_ARG_ENABLE(backtrace,
308 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
309 AC_ARG_ENABLE(time-check,
310 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
311 AC_ARG_ENABLE(pcreposix,
312 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
314 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
315 AC_ARG_ENABLE(systemd,
316 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
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)
370 AC_MSG_CHECKING(whether this OS has MPLS stack)
373 MPLS_METHOD="zebra_mpls_netlink.o"
374 AC_MSG_RESULT(Linux MPLS)
377 MPLS_METHOD="zebra_mpls_openbsd.o"
378 AC_MSG_RESULT(OpenBSD MPLS)
381 MPLS_METHOD="zebra_mpls_null.o"
382 AC_MSG_RESULT(Unsupported kernel)
385 AC_SUBST(MPLS_METHOD)
387 if test "${enable_datacenter}" = "yes" ; then
388 AC_DEFINE(HAVE_DATACENTER,,Compile extensions for a DataCenter)
389 DFLT_NAME="datacenter"
391 DFLT_NAME="traditional"
394 if test "${enable_cumulus}" = "yes" ; then
395 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
399 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
401 if test "${enable_shell_access}" = "yes"; then
402 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
405 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
407 if test "x${enable_dev_build}" = "xyes"; then
408 AC_DEFINE(DEV_BUILD,,Build for development)
410 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
413 # Logic for protobuf support.
415 if test "$enable_protobuf" = "yes"; then
419 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
420 if test "x$PROTOC_C" = "x/bin/false"; then
424 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
425 [found_protobuf_c=yes],
426 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
428 if test "x$found_protobuf_c" = "xyes"; then
429 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
430 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
432 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
433 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
439 # Logic for old vpn commans support.
441 if test "$enable_oldvpn_commands" = "yes"; then
442 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
445 # Fail if the user explicity enabled protobuf support and we couldn't
446 # find the compiler or libraries.
447 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
448 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
451 if test "x$have_protobuf" = "xyes"; then
452 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
455 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
458 # End of logic for protobuf support.
461 if test "${enable_tcp_zebra}" = "yes"; then
462 AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
465 if test "${enable_linux24_tcp_md5}" = "yes"; then
466 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
469 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
470 if test "${enable_rtadv}" != "no"; then
472 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
477 if test "${enable_irdp}" = "yes"; then
478 AC_DEFINE(HAVE_IRDP,, IRDP )
481 if test x"${enable_user}" = x"no"; then
484 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
487 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
490 if test x"${enable_group}" = x"no"; then
493 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
496 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
499 if test x"${enable_vty_group}" = x"yes" ; then
500 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
501 elif test x"${enable_vty_group}" != x""; then
502 if test x"${enable_vty_group}" != x"no"; then
503 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
506 AC_SUBST([enable_user])
507 AC_SUBST([enable_group])
508 AC_SUBST([enable_vty_group])
510 enable_configfile_mask=${enable_configfile_mask:-0600}
511 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
513 enable_logfile_mask=${enable_logfile_mask:-0600}
514 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
518 case "${enable_multipath}" in
522 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
523 MPATH_NUM="${enable_multipath}"
528 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
532 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
534 AC_DEFINE_UNQUOTED(VTYSH_PAGER, "$VTYSH_PAGER", [What pager to use])
536 dnl -----------------------------------
537 dnl Add extra version string to package
538 dnl name, string and version fields.
539 dnl -----------------------------------
540 if test "x${EXTRAVERSION}" != "x" ; then
541 VERSION="${VERSION}${EXTRAVERSION}"
542 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
543 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
544 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
547 if test "x$with_pkg_git_version" = "xyes"; then
548 if test -d "${srcdir}/.git"; then
549 AC_DEFINE(GIT_VERSION, [1], [include git version info])
550 else with_pkg_git_version="no"
551 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
554 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
556 dnl ------------------------------------
557 dnl Check C keywords and standard types
558 dnl ------------------------------------
569 dnl -------------------------
570 dnl Check other header files.
571 dnl -------------------------
572 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
573 linux/version.h asm/types.h \
576 ac_stdatomic_ok=false
577 AC_DEFINE(FRR_AUTOCONF_ATOMIC, 1, [did autoconf checks for atomic funcs])
578 AC_CHECK_HEADER([stdatomic.h],[
580 AC_MSG_CHECKING([whether _Atomic qualifier works])
581 AC_LINK_IFELSE([AC_LANG_SOURCE([[
582 #include <stdatomic.h>
583 int main(int argc, char **argv) {
588 AC_DEFINE(HAVE_STDATOMIC_H, 1, [found stdatomic.h])
596 AS_IF([$ac_stdatomic_ok], [true], [
597 AC_MSG_CHECKING([for __atomic_* builtins])
598 AC_LINK_IFELSE([AC_LANG_SOURCE([[
599 int main(int argc, char **argv) {
601 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
602 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
605 AC_DEFINE(HAVE___ATOMIC, 1, [found __atomic builtins])
610 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
611 AC_MSG_CHECKING([for __sync_* builtins])
612 AC_LINK_IFELSE([AC_LANG_SOURCE([[
613 int main(int argc, char **argv) {
615 __sync_fetch_and_sub (&i, 1);
616 return __sync_val_compare_and_swap (&i, 0, 1);
619 AC_DEFINE(HAVE___SYNC, 1, [found __sync builtins])
622 AC_MSG_CHECKING([for __sync_swap builtin])
623 AC_LINK_IFELSE([AC_LANG_SOURCE([[
624 int main(int argc, char **argv) {
626 return __sync_swap (&i, 2);
629 AC_DEFINE(HAVE___SYNC_SWAP, 1, [found __sync_swap builtin])
637 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
642 dnl Utility macro to avoid retyping includes all the time
643 m4_define([FRR_INCLUDES],
646 #define __EXTENSIONS__
651 #include <sys/types.h>
652 /* sys/conf.h depends on param.h on FBSD at least */
653 #include <sys/param.h>
654 /* Required for MAXSIG */
656 #include <sys/socket.h>
658 # define __APPLE_USE_RFC_3542
660 #include <netinet/in.h>
661 #include <sys/time.h>
666 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
667 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
668 dnl an additional round for it.
670 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
672 m4_define([FRR_INCLUDES],
674 [#if HAVE_NET_IF_VAR_H
675 # include <net/if_var.h>
679 AC_CHECK_HEADERS([netinet/in_var.h \
680 net/if_dl.h net/netopt.h \
681 inet/nd.h netinet/ip_icmp.h \
682 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
683 [], [], FRR_INCLUDES)
685 AC_CHECK_HEADERS([ucontext.h], [], [],
688 #endif /* __USE_GNU */
692 m4_define([UCONTEXT_INCLUDES],
693 [#include <ucontext.h>])dnl
695 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
696 [], [], [UCONTEXT_INCLUDES])
697 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
698 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
699 [], [], [UCONTEXT_INCLUDES])],
700 [], [UCONTEXT_INCLUDES])
701 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
702 [], [], [UCONTEXT_INCLUDES])
704 m4_define([FRR_INCLUDES],
708 #include <netinet/in_systm.h>
709 #if HAVE_NETINET_IN_VAR_H
710 # include <netinet/in_var.h>
713 # include <net/if_dl.h>
715 #if HAVE_NET_NETOPT_H
716 # include <net/netopt.h>
718 #include <net/route.h>
720 # include <inet/nd.h>
722 #include <arpa/inet.h>
723 /* Required for IDRP */
724 #if HAVE_NETINET_IP_ICMP_H
725 # include <netinet/ip_icmp.h>
729 dnl V6 headers are checked below, after we check for v6
731 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
733 [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
735 AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
736 AC_DEFINE(SUNOS_5, 1, SunOS 5)
737 AC_CHECK_LIB(xnet, main)
742 | [*-sunos5.1[0-9]] \
743 | [*-sunos5.1[0-9].[0-9]] \
744 | [*-solaris2.[8-9]] \
745 | [*-solaris2.1[0-9]] \
746 | [*-solaris2.1[0-9].[0-9]])
748 AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
749 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
750 AC_CHECK_LIB(socket, main)
751 AC_CHECK_LIB(nsl, main)
752 AC_CHECK_LIB(umem, main)
753 AC_CHECK_FUNCS([printstack],
754 [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
755 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
760 *-sunos5* | *-solaris2*)
761 AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
762 AC_CHECK_LIB(socket, main)
763 AC_CHECK_LIB(nsl, main)
769 AC_DEFINE(GNU_LINUX,,GNU Linux)
773 AC_DEFINE(OPEN_BSD,,OpenBSD)
779 dnl ---------------------
780 dnl Integrated VTY option
781 dnl ---------------------
782 case "${enable_vtysh}" in
785 AC_DEFINE(VTYSH,,VTY shell)
786 dnl Vtysh uses libreadline, which looks for termcap functions at
787 dnl configure time. We follow readlines search order.
788 dnl The required procedures are in libtermcap on NetBSD, in
789 dnl [TODO] on Linux, and in [TODO] on Solaris.
790 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
791 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
792 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
793 [AC_CHECK_LIB(ncurses, tputs,
794 LIBREADLINE="$LIBREADLINE -lncurses")]
798 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
800 if test $ac_cv_lib_readline_main = no; then
801 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
803 AC_CHECK_HEADER(readline/history.h)
804 if test $ac_cv_header_readline_history_h = no;then
805 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
807 AC_CHECK_LIB(readline, rl_completion_matches,
808 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
809 if test $ac_cv_lib_readline_rl_completion_matches = no; then
810 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
814 AC_SUBST(LIBREADLINE)
815 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
820 dnl Quagga detects the PAM library it is built against by checking for a
821 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
822 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
823 dnl openpam.h doesn't do that, although depends on the header too. Hence a
824 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
827 if test "$with_libpam" = "yes"; then
828 AC_CHECK_HEADER([security/pam_misc.h],
829 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
830 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
831 pam_conv_func="misc_conv"
834 AC_CHECK_HEADER([security/openpam.h],
835 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
836 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
837 pam_conv_func="openpam_ttyconv"
839 [], FRR_INCLUDES[#include <security/pam_appl.h>])
840 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
841 AC_MSG_WARN([*** pam support will not be built ***])
846 if test "$with_libpam" = "yes"; then
847 dnl took this test from proftpds configure.in and suited to our needs
848 dnl -------------------------------------------------------------------------
850 dnl This next check looks funky due to a linker problem with some versions
851 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
852 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
853 dnl with RedHat 6.2 and Debian 2.2 or better.
854 AC_CHECK_LIB(pam, pam_start,
855 [AC_CHECK_LIB(pam, $pam_conv_func,
856 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
858 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
859 LIBPAM="-lpam -lpam_misc"]
863 [AC_CHECK_LIB(pam, pam_end,
864 [AC_CHECK_LIB(pam, $pam_conv_func,
865 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
866 LIBPAM="-lpam -ldl"],
867 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
868 LIBPAM="-lpam -ldl -lpam_misc"]
870 ],AC_MSG_WARN([*** pam support will not be built ***]),
877 dnl -------------------------------
878 dnl Endian-ness check
879 dnl -------------------------------
882 dnl -------------------------------
883 dnl check the size in byte of the C
884 dnl -------------------------------
885 dnl AC_CHECK_SIZEOF(char)
886 dnl AC_CHECK_SIZEOF(int)
887 dnl AC_CHECK_SIZEOF(short)
888 dnl AC_CHECK_SIZEOF(long)
890 dnl ----------------------------
891 dnl check existance of functions
892 dnl ----------------------------
898 dnl -------------------------------
899 dnl bgpd needs pow() and hence libm
900 dnl -------------------------------
902 AC_CHECK_HEADER([math.h],
903 [AC_CHECK_LIB([m], [pow],
906 AC_CHECK_FUNCS(pow,[],[LIBM=""])
909 if test x"$LIBM" = x ; then
910 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
1288 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1290 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1293 if test "$opsys" = "gnu-linux"; then
1294 if test "${enable_nhrpd}" != "no"; then
1298 if test "${enable_nhrpd}" = "yes"; then
1299 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1302 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1304 if test "${enable_eigrpd}" = "no";then
1309 AM_CONDITIONAL(EIGRPD, test "x$EIGRPD" = "xeigrpd")
1311 if test "${enable_watchfrr}" = "no";then
1316 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1319 if test "${enable_ospfapi}" != "no";then
1320 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1322 if test "${enable_ospfclient}" != "no";then
1323 OSPFCLIENT="ospfclient"
1327 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1329 case "${enable_ripngd}" in
1331 * ) RIPNGD="ripngd";;
1333 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1335 case "${enable_babeld}" in
1337 * ) BABELD="babeld";;
1339 AM_CONDITIONAL(BABELD, test "x$BABELD" = "xbabeld")
1341 case "${enable_ospf6d}" in
1343 * ) OSPF6D="ospf6d";;
1345 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1347 case "${enable_isisd}" in
1351 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1353 case "${enable_pimd}" in
1357 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1359 if test "${enable_bgp_announce}" = "no";then
1360 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1362 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1365 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1366 with_rfp_path="bgpd/rfp-example"
1368 if test "${with_rfp_path}" != "no"; then
1369 VNC_RFP_PATH="${with_rfp_path}"
1370 AC_SUBST(VNC_RFP_PATH)
1373 if test "${enable_bgp_vnc}" != "no";then
1374 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1375 RFPTEST="${with_rfp_path}/rfptest"
1376 LIBRFP="${with_rfp_path}/librfp"
1377 RFPINC="${with_rfp_path}/librfp"
1381 RFPINC="bgpd/rfp-example/librfp"
1384 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1406 AC_SUBST(OSPFCLIENT)
1408 AC_CHECK_LIB(crypt, crypt)
1409 AC_CHECK_LIB(resolv, res_init)
1411 dnl ---------------------------
1412 dnl check system has PCRE regexp
1413 dnl ---------------------------
1414 if test "x$enable_pcreposix" = "xyes"; then
1415 AC_CHECK_LIB(pcreposix, regexec, [], [
1416 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
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
1858 snapcraft/snapcraft.yaml
1860 tests/lib/cli/test_cli.refout
1877 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1878 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1881 if test "${enable_bgp_vnc}" != "no"; then
1882 if test "${with_rfp_path}" = "bgpd/rfp-example" ; then
1883 AC_CONFIG_FILES([bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile])
1885 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1889 AC_CONFIG_FILES([solaris/Makefile])
1891 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1893 ## Hack, but working solution to avoid rebuilding of quagga.info.
1894 ## It's already in CVS until texinfo 4.7 is more common.
1898 FRRouting configuration
1899 ------------------------------
1900 FRR version : ${PACKAGE_VERSION}
1901 host operating system : ${host_os}
1902 source code location : ${srcdir}
1904 compiler flags : ${CFLAGS}
1906 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1907 state file directory : ${frr_statedir}
1908 config file directory : `eval echo \`echo ${sysconfdir}\``
1909 example directory : `eval echo \`echo ${exampledir}\``
1910 module directory : ${CFG_MODULE}
1911 user to run as : ${enable_user}
1912 group to run as : ${enable_group}
1913 group for vty sockets : ${enable_vty_group}
1914 config file mask : ${enable_configfile_mask}
1915 log file mask : ${enable_logfile_mask}
1916 zebra protobuf enabled : ${have_protobuf:-no}
1918 The above user and group must have read/write access to the state file
1919 directory and to the config files in the config file directory."