2 ## Configure template file for FreeRangeRouting.
3 ## autoconf will generate configure script.
5 ## Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
6 ## Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
10 AC_INIT(frr, 2.1-dev, [https://github.com/freerangerouting/frr/issues])
11 PACKAGE_URL="https://freerangerouting.org/"
12 PACKAGE_FULLNAME="FreeRangeRouting"
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 --------------------
77 dnl Check CC and friends
78 dnl --------------------
79 dnl note orig_cflags is also used further down
85 dnl remove autoconf default "-g -O2"
92 dnl autoconf 2.59 appears not to support AC_PROG_SED
94 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
96 dnl try and enable CFLAGS that are useful for Quagga
97 dnl - specifically, options to control warnings
99 AC_USE_SYSTEM_EXTENSIONS()
100 AC_DEFUN([AC_C_FLAG], [{
102 ac_c_flag_save="$CFLAGS"
104 AC_MSG_CHECKING([[whether $CC supports $1]])
106 [AC_LANG_PROGRAM([[]])],
109 m4_if([$3], [], [], [
110 CFLAGS="$ac_c_flag_save"
114 CFLAGS="$ac_c_flag_save"
121 dnl ICC won't bail on unknown options without -diag-error 10006
122 dnl need to do this first so we get useful results for the other options
123 AC_C_FLAG([-diag-error 10006])
125 dnl if the user specified any CFLAGS, we don't add "-g -Os/-O2" here
126 if test "z$orig_cflags" = "z"; then
133 dnl always want these CFLAGS
134 AC_C_FLAG([-fno-omit-frame-pointer])
137 AC_C_FLAG([-Wmissing-prototypes])
138 AC_C_FLAG([-Wmissing-declarations])
139 AC_C_FLAG([-Wpointer-arith])
140 AC_C_FLAG([-Wbad-function-cast])
141 AC_C_FLAG([-Wwrite-strings])
142 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
143 AC_C_FLAG([-Wcast-qual])
144 AC_C_FLAG([-Wstrict-prototypes])
145 AC_C_FLAG([-Wmissing-noreturn])
146 AC_C_FLAG([-Wmissing-format-attribute])
147 AC_C_FLAG([-Wunreachable-code])
148 AC_C_FLAG([-Wpacked])
149 AC_C_FLAG([-Wpadded])
151 AC_C_FLAG([-Wno-unused-result])
153 AC_C_FLAG([-Wno-unused-parameter])
154 AC_C_FLAG([-Wno-missing-field-initializers])
156 dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
157 dnl for some reason the string consts get 'promoted' to char *,
158 dnl triggering a const to non-const conversion warning.
159 AC_C_FLAG([-diag-disable 3179])
161 if test x"${enable_werror}" = x"yes" ; then
166 dnl need link on this one, not compile
168 ac_ld_flag_save="$LDFLAGS"
169 LDFLAGS="$LDFLAGS -rdynamic"
170 AC_MSG_CHECKING([[whether linker supports -rdynamic]])
172 [AC_LANG_PROGRAM([[]])],
173 [AC_MSG_RESULT([yes])],
175 LDFLAGS="$ac_ld_flag_save"
186 AC_CHECK_TOOL(AR, ar)
188 dnl -----------------
189 dnl System extensions
190 dnl -----------------
198 dnl ----------------------
199 dnl Packages configuration
200 dnl ----------------------
201 AC_ARG_WITH(pkg-extra-version,
202 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]),
203 [EXTRAVERSION=$withval],)
204 AC_ARG_WITH(pkg-git-version,
205 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
206 [ test "x$withval" != "xno" && with_pkg_git_version="yes" ])
208 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for Quagga]))
210 AS_HELP_STRING([--disable-doc], [do not build docs]))
212 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
214 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
216 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
217 AC_ARG_ENABLE(ripngd,
218 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
220 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
221 AC_ARG_ENABLE(ospf6d,
222 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
224 AS_HELP_STRING([--enable-ldpd], [build ldpd]))
226 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
227 AC_ARG_ENABLE(watchfrr,
228 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
230 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
232 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
233 AC_ARG_ENABLE(bgp-announce,
234 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
235 AC_ARG_ENABLE(bgp-vnc,
236 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
237 AC_ARG_WITH(rfp-path,
238 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
240 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
242 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
243 AC_ARG_ENABLE(tcp-zebra,
244 AS_HELP_STRING([--enable-tcp-zebra], [enable TCP/IP socket connection between zebra and protocol daemon]))
245 AC_ARG_ENABLE(ospfapi,
246 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
247 AC_ARG_ENABLE(ospfclient,
248 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
249 (this is the default if --disable-ospfapi is set)]))
250 AC_ARG_ENABLE(multipath,
251 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
253 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
255 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
256 AC_ARG_ENABLE(vty_group,
257 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
258 AC_ARG_ENABLE(configfile_mask,
259 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
260 AC_ARG_ENABLE(logfile_mask,
261 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
262 AC_ARG_ENABLE(shell_access,
263 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
265 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
267 AS_HELP_STRING([--enable-irdp], [enable IRDP server support in zebra]))
268 AC_ARG_ENABLE(capabilities,
269 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
270 AC_ARG_ENABLE(rusage,
271 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
272 AC_ARG_ENABLE(gcc_ultra_verbose,
273 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
274 AC_ARG_ENABLE(linux24_tcp_md5,
275 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
276 AC_ARG_ENABLE(backtrace,
277 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
278 AC_ARG_ENABLE(time-check,
279 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
280 AC_ARG_ENABLE(pcreposix,
281 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
283 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
284 AC_ARG_ENABLE(systemd,
285 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
287 AS_HELP_STRING([--enable-poll], [enable usage of Poll instead of select]))
288 AC_ARG_ENABLE(werror,
289 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
290 AC_ARG_ENABLE(cumulus,
291 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
292 AC_ARG_ENABLE(rr-semantics,
293 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
294 AC_ARG_ENABLE([protobuf],
295 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
296 AC_ARG_ENABLE([oldvpn_commands],
297 AS_HELP_STRING([--enable-old-vpn-commands], [Keep old vpn commands]))
299 AC_CHECK_HEADERS(json-c/json.h)
300 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c")
301 if test $ac_cv_lib_json_c_json_object_get = no; then
302 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
303 if test $ac_cv_lib_json_json_object_get = no; then
304 AC_MSG_ERROR([lib json is needed to compile])
308 AC_ARG_ENABLE([dev_build],
309 AS_HELP_STRING([--enable-dev-build], [build for development]))
311 if test x"${enable_time_check}" != x"no" ; then
312 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
313 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
315 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
319 case "${enable_systemd}" in
322 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
323 if test $ac_cv_lib_systemd_sd_notify = no; then
324 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
326 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
332 if test "${enable_rr_semantics}" != "no" ; then
333 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
336 if test "${enable_poll}" = "yes" ; then
337 AC_DEFINE(HAVE_POLL,,Compile systemd support in)
343 AC_MSG_CHECKING(whether this OS has MPLS stack)
346 MPLS_METHOD="zebra_mpls_netlink.o"
347 AC_MSG_RESULT(Linux MPLS)
350 MPLS_METHOD="zebra_mpls_openbsd.o"
351 AC_MSG_RESULT(OpenBSD MPLS)
354 MPLS_METHOD="zebra_mpls_null.o"
355 AC_MSG_RESULT(Unsupported kernel)
358 AC_SUBST(MPLS_METHOD)
360 if test "${enable_cumulus}" = "yes" ; then
361 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
364 if test "${enable_shell_access}" = "yes"; then
365 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
368 if test "${enable_fpm}" = "yes"; then
369 AC_DEFINE(HAVE_FPM,,Forwarding Plane Manager support)
372 if test "x${enable_dev_build}" = "xyes"; then
373 AC_DEFINE(DEV_BUILD,,Build for development)
375 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
378 # Logic for protobuf support.
380 if test "$enable_protobuf" = "yes"; then
384 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
385 if test "x$PROTOC_C" = "x/bin/false"; then
389 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
390 [found_protobuf_c=yes],
391 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
393 if test "x$found_protobuf_c" = "xyes"; then
394 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
395 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
397 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
398 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
404 # Logic for old vpn commans support.
406 if test "$enable_old_vpn_commands" = "yes"; then
407 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
410 # Fail if the user explicity enabled protobuf support and we couldn't
411 # find the compiler or libraries.
412 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
413 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
416 if test "x$have_protobuf" = "xyes"; then
417 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
420 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
423 # End of logic for protobuf support.
426 if test "${enable_tcp_zebra}" = "yes"; then
427 AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
430 if test "${enable_linux24_tcp_md5}" = "yes"; then
431 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
434 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
435 if test "${enable_rtadv}" != "no"; then
437 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
442 if test "${enable_irdp}" = "yes"; then
443 AC_DEFINE(HAVE_IRDP,, IRDP )
446 if test x"${enable_user}" = x"no"; then
449 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
452 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
455 if test x"${enable_group}" = x"no"; then
458 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
461 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
464 if test x"${enable_vty_group}" = x"yes" ; then
465 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
466 elif test x"${enable_vty_group}" != x""; then
467 if test x"${enable_vty_group}" != x"no"; then
468 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
471 AC_SUBST([enable_user])
472 AC_SUBST([enable_group])
473 AC_SUBST([enable_vty_group])
475 enable_configfile_mask=${enable_configfile_mask:-0600}
476 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
478 enable_logfile_mask=${enable_logfile_mask:-0600}
479 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
483 case "${enable_multipath}" in
487 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
488 MPATH_NUM="${enable_multipath}"
493 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
497 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
499 dnl -----------------------------------
500 dnl Add extra version string to package
501 dnl name, string and version fields.
502 dnl -----------------------------------
503 if test "x${EXTRAVERSION}" != "x" ; then
504 VERSION="${VERSION}${EXTRAVERSION}"
505 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
506 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
507 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
510 if test "x$with_pkg_git_version" = "xyes"; then
511 if test -d "${srcdir}/.git"; then
512 AC_DEFINE(GIT_VERSION, [1], [include git version info])
513 else with_pkg_git_version="no"
514 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
517 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
519 dnl ------------------------------------
520 dnl Check C keywords and standard types
521 dnl ------------------------------------
532 dnl -------------------------
533 dnl Check other header files.
534 dnl -------------------------
535 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
536 linux/version.h asm/types.h \
539 dnl Utility macro to avoid retyping includes all the time
540 m4_define([FRR_INCLUDES],
543 #define __EXTENSIONS__
548 #include <sys/types.h>
549 /* sys/conf.h depends on param.h on FBSD at least */
550 #include <sys/param.h>
551 /* Required for MAXSIG */
553 #include <sys/socket.h>
555 # define __APPLE_USE_RFC_3542
557 #include <netinet/in.h>
558 #include <sys/time.h>
563 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
564 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
565 dnl an additional round for it.
567 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
569 m4_define([FRR_INCLUDES],
571 [#if HAVE_NET_IF_VAR_H
572 # include <net/if_var.h>
576 AC_CHECK_HEADERS([netinet/in_var.h \
577 net/if_dl.h net/netopt.h \
578 inet/nd.h netinet/ip_icmp.h \
579 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
580 [], [], FRR_INCLUDES)
582 AC_CHECK_HEADERS([ucontext.h], [], [],
585 #endif /* __USE_GNU */
589 m4_define([UCONTEXT_INCLUDES],
590 [#include <ucontext.h>])dnl
592 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
593 [], [], [UCONTEXT_INCLUDES])
594 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
595 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
596 [], [], [UCONTEXT_INCLUDES])],
597 [], [UCONTEXT_INCLUDES])
598 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
599 [], [], [UCONTEXT_INCLUDES])
601 m4_define([FRR_INCLUDES],
605 #include <netinet/in_systm.h>
606 #if HAVE_NETINET_IN_VAR_H
607 # include <netinet/in_var.h>
610 # include <net/if_dl.h>
612 #if HAVE_NET_NETOPT_H
613 # include <net/netopt.h>
615 #include <net/route.h>
617 # include <inet/nd.h>
619 #include <arpa/inet.h>
620 /* Required for IDRP */
621 #if HAVE_NETINET_IP_ICMP_H
622 # include <netinet/ip_icmp.h>
626 dnl V6 headers are checked below, after we check for v6
628 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
630 [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
632 AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
633 AC_DEFINE(SUNOS_5, 1, SunOS 5)
634 AC_CHECK_LIB(xnet, main)
639 | [*-sunos5.1[0-9]] \
640 | [*-sunos5.1[0-9].[0-9]] \
641 | [*-solaris2.[8-9]] \
642 | [*-solaris2.1[0-9]] \
643 | [*-solaris2.1[0-9].[0-9]])
645 AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
646 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
647 AC_CHECK_LIB(socket, main)
648 AC_CHECK_LIB(nsl, main)
649 AC_CHECK_LIB(umem, main)
650 AC_CHECK_FUNCS([printstack],
651 [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
652 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
657 *-sunos5* | *-solaris2*)
658 AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
659 AC_CHECK_LIB(socket, main)
660 AC_CHECK_LIB(nsl, main)
666 AC_DEFINE(GNU_LINUX,,GNU Linux)
670 AC_DEFINE(OPEN_BSD,,OpenBSD)
676 dnl ---------------------
677 dnl Integrated VTY option
678 dnl ---------------------
679 case "${enable_vtysh}" in
682 AC_DEFINE(VTYSH,,VTY shell)
683 dnl Vtysh uses libreadline, which looks for termcap functions at
684 dnl configure time. We follow readlines search order.
685 dnl The required procedures are in libtermcap on NetBSD, in
686 dnl [TODO] on Linux, and in [TODO] on Solaris.
687 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
688 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
689 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
690 [AC_CHECK_LIB(ncurses, tputs,
691 LIBREADLINE="$LIBREADLINE -lncurses")]
695 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
697 if test $ac_cv_lib_readline_main = no; then
698 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
700 AC_CHECK_HEADER(readline/history.h)
701 if test $ac_cv_header_readline_history_h = no;then
702 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
704 AC_CHECK_LIB(readline, rl_completion_matches,
705 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
706 if test $ac_cv_lib_readline_rl_completion_matches = no; then
707 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
711 AC_SUBST(LIBREADLINE)
712 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
717 dnl Quagga detects the PAM library it is built against by checking for a
718 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
719 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
720 dnl openpam.h doesn't do that, although depends on the header too. Hence a
721 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
724 if test "$with_libpam" = "yes"; then
725 AC_CHECK_HEADER([security/pam_misc.h],
726 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
727 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
728 pam_conv_func="misc_conv"
731 AC_CHECK_HEADER([security/openpam.h],
732 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
733 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
734 pam_conv_func="openpam_ttyconv"
736 [], FRR_INCLUDES[#include <security/pam_appl.h>])
737 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
738 AC_MSG_WARN([*** pam support will not be built ***])
743 if test "$with_libpam" = "yes"; then
744 dnl took this test from proftpds configure.in and suited to our needs
745 dnl -------------------------------------------------------------------------
747 dnl This next check looks funky due to a linker problem with some versions
748 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
749 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
750 dnl with RedHat 6.2 and Debian 2.2 or better.
751 AC_CHECK_LIB(pam, pam_start,
752 [AC_CHECK_LIB(pam, $pam_conv_func,
753 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
755 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
756 LIBPAM="-lpam -lpam_misc"]
760 [AC_CHECK_LIB(pam, pam_end,
761 [AC_CHECK_LIB(pam, $pam_conv_func,
762 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
763 LIBPAM="-lpam -ldl"],
764 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
765 LIBPAM="-lpam -ldl -lpam_misc"]
767 ],AC_MSG_WARN([*** pam support will not be built ***]),
774 dnl -------------------------------
775 dnl Endian-ness check
776 dnl -------------------------------
779 dnl -------------------------------
780 dnl check the size in byte of the C
781 dnl -------------------------------
782 dnl AC_CHECK_SIZEOF(char)
783 dnl AC_CHECK_SIZEOF(int)
784 dnl AC_CHECK_SIZEOF(short)
785 dnl AC_CHECK_SIZEOF(long)
787 dnl ----------------------------
788 dnl check existance of functions
789 dnl ----------------------------
795 dnl -------------------------------
796 dnl bgpd needs pow() and hence libm
797 dnl -------------------------------
799 AC_CHECK_HEADER([math.h],
800 [AC_CHECK_LIB([m], [pow],
803 AC_CHECK_FUNCS(pow,[],[LIBM=""])
806 if test x"$LIBM" = x ; then
807 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
820 AC_CHECK_HEADER([asm-generic/unistd.h],
821 [AC_CHECK_DECL(__NR_setns,
822 AC_DEFINE(HAVE_NETNS,, Have netns),,
823 FRR_INCLUDES [#include <asm-generic/unistd.h>
825 AC_CHECK_FUNCS(setns)]
828 dnl ------------------------------------
829 dnl Determine routing get and set method
830 dnl ------------------------------------
831 AC_MSG_CHECKING(zebra between kernel interface method)
832 if test x"$opsys" = x"gnu-linux"; then
833 AC_MSG_RESULT(netlink)
834 RT_METHOD=rt_netlink.o
835 KERNEL_METHOD=kernel_netlink.o
836 AC_DEFINE(HAVE_NETLINK,,netlink)
838 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
840 AC_MSG_RESULT(Route socket)
841 KERNEL_METHOD="kernel_socket.o"
842 RT_METHOD="rt_socket.o"
845 AC_SUBST(KERNEL_METHOD)
846 AM_CONDITIONAL([HAVE_NETLINK], [test "x$netlink" = "xyes"])
848 dnl --------------------------
849 dnl Determine IS-IS I/O method
850 dnl --------------------------
851 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
852 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
853 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
854 AC_CHECK_HEADER(net/bpf.h)
855 AC_CHECK_HEADER(sys/dlpi.h)
856 AC_MSG_CHECKING(zebra IS-IS I/O method)
857 if test x"$opsys" = x"gnu-linux"; then
858 AC_MSG_RESULT(pfpacket)
859 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
860 elif test x"$opsys" = x"sol2-6" -o x"$opsys" = x"sol8"; then
862 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
864 if test $ac_cv_header_net_bpf_h = no; then
865 if test $ac_cv_header_sys_dlpi_h = no; then
867 AC_MSG_WARN([*** IS-IS support will not be built ***])
872 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
875 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
878 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
880 dnl ------------------------------------
881 dnl check for broken CMSG_FIRSTHDR macro
882 dnl ------------------------------------
883 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
884 AC_RUN_IFELSE([AC_LANG_SOURCE([[
887 #define __EXTENSIONS__
890 #include <sys/types.h>
891 #include <sys/socket.h>
898 msg.msg_control = buf;
899 msg.msg_controllen = 0;
901 if (CMSG_FIRSTHDR(&msg) != NULL)
904 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
905 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
907 dnl ------------------------------
908 dnl check kernel route read method
909 dnl ------------------------------
910 AC_CACHE_CHECK([route read method], [frr_cv_rtread_method],
911 [if test "x$netlink" = xyes; then
912 frr_cv_rtread_method="netlink"
914 for frr_cv_rtread_method in /dev/ip /dev/null;
916 test x`ls $frr_cv_rtread_method 2>/dev/null` = x"$frr_cv_rtread_method" && break
918 case $frr_cv_rtread_method in
921 *-freebsd*) frr_cv_rtread_method="sysctl";;
922 *) frr_cv_rtread_method="getmsg";;
925 frr_cv_rtread_method="sysctl";;
928 RTREAD_METHOD=rtread_${frr_cv_rtread_method}.o
929 AC_SUBST(RTREAD_METHOD)
931 dnl -----------------------------
932 dnl check interface lookup method
933 dnl -----------------------------
935 AC_MSG_CHECKING(interface looking up method)
936 if test "$netlink" = yes; then
937 AC_MSG_RESULT(netlink)
938 IF_METHOD=if_netlink.o
939 elif test "$opsys" = "sol2-6";then
940 AC_MSG_RESULT(Solaris GIF)
942 elif test "$opsys" = "sol8";then
943 AC_MSG_RESULT(Solaris GLIF)
944 IF_METHOD=if_ioctl_solaris.o
945 IOCTL_METHOD=ioctl_solaris.o
946 elif test "$opsys" = "openbsd";then
947 AC_MSG_RESULT(openbsd)
949 elif grep NET_RT_IFLIST /usr/include/sys/socket.h >/dev/null 2>&1; then
950 AC_MSG_RESULT(sysctl)
951 IF_METHOD=if_sysctl.o
952 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
958 AC_SUBST(IOCTL_METHOD)
960 dnl ---------------------------------------------------------------
961 dnl figure out how to specify an interface in multicast sockets API
962 dnl ---------------------------------------------------------------
963 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
965 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
966 #include <sys/socket.h>
967 #include <netinet/in.h>
968 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
969 #include <linux/types.h>
972 m4_define([FRR_INCLUDES],
974 [#if HAVE_LINUX_MROUTE_H
975 # include <linux/mroute.h>
979 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
980 #include <sys/socket.h>
981 #include <sys/types.h>
982 #include <netinet/in.h>
983 #include <net/route.h>
986 m4_define([FRR_INCLUDES],
988 [#if HAVE_NETINET_IP_MROUTE_H
989 # include <netinet/ip_mroute.h>
993 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
994 AC_TRY_COMPILE([#include <sys/param.h>],
995 [#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)
998 #error No support for BSD struct ip_mreq hack detected
999 #endif],[AC_MSG_RESULT(yes)
1000 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1003 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1005 #include <sys/types.h>
1006 #include <netinet/in.h>
1007 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1008 ], [AC_MSG_RESULT(yes)
1009 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1012 dnl ---------------------------------------------------------------
1013 dnl figure out how to check link-state
1014 dnl ---------------------------------------------------------------
1015 AC_CHECK_HEADER( [net/if_media.h],
1016 [m4_define([LINK_DETECT_INCLUDES],
1018 [#include <net/if_media.h>
1020 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1021 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1022 [], LINK_DETECT_INCLUDES)],
1026 dnl ---------------------------------------------------------------
1027 dnl Additional, newer way to check link-state using ifi_link_state.
1028 dnl Not available in all BSD's when ifmediareq available
1029 dnl ---------------------------------------------------------------
1030 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1031 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1034 dnl ------------------------
1035 dnl TCP_MD5SIG socket option
1036 dnl ------------------------
1038 AC_CHECK_HEADER([netinet/tcp.h],
1039 [m4_define([MD5_INCLUDES],
1041 [#include <netinet/tcp.h>
1043 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1046 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1047 AC_CHECK_HEADER([linux/tcp.h],
1048 [m4_define([MD5_INCLUDES],
1050 [#include <linux/tcp.h>
1052 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1055 dnl -----------------------------
1056 dnl check ipforward detect method
1057 dnl -----------------------------
1058 AC_CACHE_CHECK([ipforward method], [frr_cv_ipforward_method],
1059 [if test x$cross_compiling = xyes; then
1060 if test x"$opsys" = x"gnu-linux"; then
1061 frr_cv_ipforward_method=/proc/net/snmp
1063 frr_cv_ipforward_method=/dev/ip
1066 for frr_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null;
1068 test x`ls $frr_cv_ipforward_method 2>/dev/null` = x"$frr_cv_ipforward_method" && break
1071 case $frr_cv_ipforward_method in
1072 "/proc/net/snmp") frr_cv_ipforward_method="proc";;
1075 *-freebsd*) frr_cv_ipforward_method="sysctl";;
1076 *) frr_cv_ipforward_method="solaris";;
1078 *) frr_cv_ipforward_method="sysctl";;
1080 IPFORWARD=ipforward_${frr_cv_ipforward_method}.o
1083 dnl ----------------------------------------------------------------------------
1084 dnl figure out if domainname is available in the utsname struct (GNU extension).
1085 dnl ----------------------------------------------------------------------------
1086 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1091 AC_MSG_CHECKING(whether does this OS have IPv6 stack)
1095 if grep WIDE /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1096 AC_DEFINE(KAME,1,KAME IPv6)
1098 dnl ------------------------------------
1099 dnl Solaris 9, 10 and potentially higher
1100 dnl ------------------------------------
1101 elif test x"$opsys" = x"sol8"; then
1102 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
1103 AC_MSG_RESULT(Solaris IPv6)
1107 elif test x"$opsys" = x"gnu-linux"; then
1108 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
1109 dnl Linux has a compilation problem with mixing
1110 dnl netinet/in.h and linux/in6.h they are not
1111 dnl compatible. There has been discussion on
1112 dnl how to fix it but no real progress on implementation
1113 dnl when they fix it, remove this
1114 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
1115 AC_MSG_RESULT(Linux IPv6)
1117 AC_MSG_ERROR([Failed to detect IPv6 stack])
1120 dnl ------------------
1121 dnl IPv6 header checks
1122 dnl ------------------
1123 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1124 netinet6/in6_var.h netinet6/nd6.h], [], [],
1127 m4_define([FRR_INCLUDES],dnl
1129 [#if HAVE_NETINET6_IN6_H
1130 #include <netinet6/in6.h>
1132 #if HAVE_NETINET_IN6_VAR_H
1133 #include <netinet/in6_var.h>
1135 #include <netinet/icmp6.h>
1136 #if HAVE_NETINET6_IN6_VAR_H
1137 # include <netinet6/in6_var.h>
1139 #if HAVE_NETINET6_ND6_H
1140 # include <netinet6/nd6.h>
1144 dnl disable doc check
1145 if test "${enable_doc}" = "no";then
1151 dnl --------------------
1152 dnl Daemon disable check
1153 dnl --------------------
1154 if test "${enable_zebra}" = "no";then
1159 AM_CONDITIONAL(ZEBRA, test "x$ZEBRA" = "xzebra")
1161 if test "${enable_bgpd}" = "no";then
1166 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1168 if test "${enable_ripd}" = "no";then
1173 AM_CONDITIONAL(RIPD, test "x$RIPD" = "xripd")
1175 if test "${enable_ospfd}" = "no";then
1180 AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd")
1182 if test "${enable_ldpd}" = "no";then
1185 AX_PROG_PERL_MODULES(XML::LibXML, , [
1186 if test -f "${srcdir}/ldpd/ldp_vty_cmds.c"; then
1187 AC_MSG_WARN([XML::LibXML perl module not found, using pregenerated ldp_vty_cmds.c])
1189 AC_MSG_ERROR([XML::LibXML perl module not found and pregenerated ldp_vty_cmds.c missing])
1194 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1196 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1199 if test "$opsys" = "gnu-linux"; then
1200 if test "${enable_nhrpd}" != "no"; then
1204 if test "${enable_nhrpd}" = "yes"; then
1205 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1208 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1210 if test "${enable_watchfrr}" = "no";then
1215 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1218 if test "${enable_ospfapi}" != "no";then
1219 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1221 if test "${enable_ospfclient}" != "no";then
1222 OSPFCLIENT="ospfclient"
1226 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1228 case "${enable_ripngd}" in
1230 * ) RIPNGD="ripngd";;
1232 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1234 case "${enable_ospf6d}" in
1236 * ) OSPF6D="ospf6d";;
1238 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1240 case "${enable_isisd}" in
1244 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1246 case "${enable_pimd}" in
1250 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1252 if test "${enable_bgp_announce}" = "no";then
1253 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1255 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1258 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1259 with_rfp_path="bgpd/rfp-example"
1261 if test "${with_rfp_path}" != "no"; then
1262 VNC_RFP_PATH="${with_rfp_path}"
1263 AC_SUBST(VNC_RFP_PATH)
1266 if test "${enable_bgp_vnc}" != "no";then
1267 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1268 RFPTEST="${with_rfp_path}/rfptest"
1269 LIBRFP="${with_rfp_path}/librfp"
1270 RFPINC="${with_rfp_path}/librfp"
1274 RFPINC="bgpd/rfp-example/librfp"
1277 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1297 AC_SUBST(OSPFCLIENT)
1299 AC_CHECK_LIB(crypt, crypt)
1300 AC_CHECK_LIB(resolv, res_init)
1302 dnl ---------------------------
1303 dnl check system has PCRE regexp
1304 dnl ---------------------------
1305 if test "x$enable_pcreposix" = "xyes"; then
1306 AC_CHECK_LIB(pcreposix, pcreposix_regexec, ,[enable_pcreposix=no
1307 AC_MSG_WARN([*** falling back to other regex library ***]) ])
1309 AC_SUBST(HAVE_LIBPCREPOSIX)
1311 dnl ------------------
1312 dnl check C-Ares library
1313 dnl ------------------
1314 if test "${NHRPD}" != ""; then
1315 PKG_CHECK_MODULES([CARES], [libcares])
1319 dnl ------------------
1320 dnl check Net-SNMP library
1321 dnl ------------------
1322 if test "${enable_snmp}" != ""; then
1323 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1324 if test x"$NETSNMP_CONFIG" = x"no"; then
1325 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1327 LIBS="$LIBS `${NETSNMP_CONFIG} --agent-libs`"
1328 CFLAGS="`${NETSNMP_CONFIG} --base-cflags` $CFLAGS"
1329 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1330 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1337 ])],[AC_MSG_RESULT(yes)],[
1339 AC_MSG_ERROR([--enable-snmp given but not usable])])
1340 AC_DEFINE(HAVE_SNMP,,SNMP)
1341 case "${enable_snmp}" in
1346 SNMP_METHOD="${enable_snmp}"
1349 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1352 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1353 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1354 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1360 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1361 AC_MSG_ERROR([unable to find the dlopen()])
1365 dnl ---------------------------
1366 dnl sockaddr and netinet checks
1367 dnl ---------------------------
1370 struct vifctl, struct mfcctl, struct sioc_sg_req,
1371 vifi_t, struct sioc_vif_req, struct igmpmsg,
1372 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1373 struct nd_opt_adv_interval, struct rt_addrinfo,
1374 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1375 [], [], FRR_INCLUDES)
1377 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1378 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1379 struct sockaddr_dl.sdl_len,
1380 struct if6_aliasreq.ifra_lifetime,
1381 struct nd_opt_adv_interval.nd_opt_ai_type],
1382 [], [], FRR_INCLUDES)
1384 dnl ---------------------------
1385 dnl IRDP/pktinfo/icmphdr checks
1386 dnl ---------------------------
1387 AC_CHECK_TYPES([struct in_pktinfo],
1388 [AC_CHECK_TYPES([struct icmphdr],
1389 [if test "${enable_irdp}" != "no"; then
1390 AC_DEFINE(HAVE_IRDP,, IRDP)
1392 [if test "${enable_irdp}" = "yes"; then
1393 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1394 fi], [FRR_INCLUDES])],
1395 [if test "${enable_irdp}" = "yes"; then
1396 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1397 fi], [FRR_INCLUDES])
1399 dnl -----------------------
1400 dnl checking for IP_PKTINFO
1401 dnl -----------------------
1402 AC_MSG_CHECKING(for IP_PKTINFO)
1403 AC_TRY_COMPILE([#include <netdb.h>], [
1404 int opt = IP_PKTINFO;
1407 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1412 dnl ---------------------------
1413 dnl checking for IP_RECVDSTADDR
1414 dnl ---------------------------
1415 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1416 AC_TRY_COMPILE([#include <netinet/in.h>], [
1417 int opt = IP_RECVDSTADDR;
1420 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1425 dnl ----------------------
1426 dnl checking for IP_RECVIF
1427 dnl ----------------------
1428 AC_MSG_CHECKING(for IP_RECVIF)
1429 AC_TRY_COMPILE([#include <netinet/in.h>], [
1430 int opt = IP_RECVIF;
1433 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1438 dnl ----------------------
1439 dnl checking for SO_BINDANY
1440 dnl ----------------------
1441 AC_MSG_CHECKING(for SO_BINDANY)
1442 AC_TRY_COMPILE([#include <sys/socket.h>], [
1443 int opt = SO_BINDANY;
1446 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1451 dnl ----------------------
1452 dnl checking for IP_FREEBIND
1453 dnl ----------------------
1454 AC_MSG_CHECKING(for IP_FREEBIND)
1455 AC_TRY_COMPILE([#include <netinet/in.h>], [
1456 int opt = IP_FREEBIND;
1459 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1464 dnl --------------------------------------
1465 dnl checking for clock_time monotonic struct and call
1466 dnl --------------------------------------
1467 AC_CHECK_DECL(CLOCK_MONOTONIC,
1468 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1469 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1470 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1472 dnl --------------------------------------
1473 dnl checking for flex and bison
1474 dnl --------------------------------------
1477 AC_MSG_CHECKING(version of flex)
1478 quagga_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1479 quagga_ac_flex_version="${quagga_ac_flex_version##* }"
1480 AC_MSG_RESULT([$quagga_ac_flex_version])
1481 AX_COMPARE_VERSION([$quagga_ac_flex_version], [lt], [2.5.20], [
1482 LEX="$SHELL $missing_dir/missing flex"
1483 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1484 AC_MSG_WARN([using pregenerated flex output files])
1486 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1488 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1489 AC_SUBST([LEXLIB], [''])
1493 dnl thanks GNU bison for this b*llshit...
1494 AC_MSG_CHECKING(version of bison)
1495 quagga_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1496 quagga_ac_bison_version="${quagga_ac_bison_version##* }"
1497 quagga_ac_bison_missing="false"
1498 case "x${quagga_ac_bison_version}" in
1501 BISON_CLOSEBRACE='"'
1503 AC_MSG_RESULT([$quagga_ac_bison_version - 2.7 or older])
1506 AC_MSG_RESULT([$quagga_ac_bison_version])
1507 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1508 quagga_ac_bison_missing="true"
1511 AC_MSG_RESULT([none])
1512 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1513 quagga_ac_bison_missing="true"
1517 BISON_CLOSEBRACE='}'
1518 BISON_VERBOSE='-Dparse.error=verbose'
1519 AC_MSG_RESULT([$quagga_ac_bison_version - 3.0 or newer])
1522 AC_SUBST(BISON_OPENBRACE)
1523 AC_SUBST(BISON_CLOSEBRACE)
1524 AC_SUBST(BISON_VERBOSE)
1526 if $quagga_ac_bison_missing; then
1527 YACC="$SHELL $missing_dir/missing bison -y"
1528 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1529 AC_MSG_WARN([using pregenerated bison output files])
1531 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1535 dnl -------------------
1536 dnl capabilities checks
1537 dnl -------------------
1538 if test "${enable_capabilities}" != "no"; then
1539 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1540 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1542 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1543 frr_ac_keepcaps="yes"],
1546 if test x"${frr_ac_keepcaps}" = x"yes"; then
1547 AC_CHECK_HEADERS(sys/capability.h)
1549 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1550 AC_CHECK_LIB(cap, cap_init,
1551 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1556 AC_CHECK_HEADERS(priv.h,
1557 [AC_MSG_CHECKING(Solaris style privileges are available)
1558 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1560 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1561 frr_ac_scaps="yes"],
1567 if test x"${frr_ac_scaps}" = x"yes" \
1568 -o x"${frr_ac_lcaps}" = x"yes"; then
1569 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1574 dnl ---------------------------
1575 dnl check for glibc 'backtrace'
1576 dnl ---------------------------
1577 if test x"${enable_backtrace}" != x"no" ; then
1579 AC_CHECK_HEADER([execinfo.h], [
1580 AC_SEARCH_LIBS([backtrace], [execinfo], [
1581 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1582 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1587 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1588 dnl user explicitly requested backtrace but we failed to find support
1589 AC_MSG_FAILURE([failed to find backtrace support])
1593 dnl -----------------------------------------
1594 dnl check for malloc mallinfo struct and call
1595 dnl this must try and link using LIBS, in
1596 dnl order to check no alternative allocator
1597 dnl has been specified, which might not provide
1598 dnl mallinfo, e.g. such as Umem on Solaris.
1599 dnl -----------------------------------------
1600 AC_CHECK_HEADER([malloc.h],
1601 [AC_MSG_CHECKING(whether mallinfo is available)
1602 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1603 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1605 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1608 ], [], FRR_INCLUDES)
1613 CONFDATE=`date '+%Y%m%d'`
1616 dnl ------------------------------
1617 dnl set paths for state directory
1618 dnl ------------------------------
1619 AC_MSG_CHECKING(directory to use for state file)
1620 if test "${prefix}" = "NONE"; then
1621 frr_statedir_prefix="";
1623 frr_statedir_prefix=${prefix}
1625 if test "${localstatedir}" = '${prefix}/var'; then
1626 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1627 ${frr_statedir_prefix}/var/adm dnl
1628 ${frr_statedir_prefix}/etc dnl
1634 test -d $FRR_STATE_DIR && break
1636 frr_statedir=$FRR_STATE_DIR
1638 frr_statedir=${localstatedir}
1640 if test $frr_statedir = "/dev/null"; then
1641 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1643 AC_MSG_RESULT(${frr_statedir})
1644 AC_SUBST(frr_statedir)
1646 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1647 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1648 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1650 dnl autoconf does this, but it does it too late...
1651 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1652 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1654 dnl get the full path, recursing through variables...
1655 vtysh_bin="$bindir/vtysh"
1656 for I in 1 2 3 4 5 6 7 8 9 10; do
1657 eval vtysh_bin="\"$vtysh_bin\""
1659 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1661 CFG_SYSCONF="$sysconfdir"
1663 CFG_STATE="$frr_statedir"
1664 CFG_MODULE="$moduledir"
1665 for I in 1 2 3 4 5 6 7 8 9 10; do
1666 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1667 eval CFG_SBIN="\"$CFG_SBIN\""
1668 eval CFG_STATE="\"$CFG_STATE\""
1669 eval CFG_MODULE="\"$CFG_MODULE\""
1671 AC_SUBST(CFG_SYSCONF)
1674 AC_SUBST(CFG_MODULE)
1675 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1677 dnl ---------------------------
1678 dnl Check htonl works correctly
1679 dnl ---------------------------
1680 AC_MSG_CHECKING(for working htonl)
1681 AC_CACHE_VAL(ac_cv_htonl_works,
1682 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1683 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1686 AC_MSG_RESULT($ac_cv_htonl_works)
1688 AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile
1689 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile
1690 ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile
1691 doc/Makefile ospfclient/Makefile tests/Makefile m4/Makefile
1701 snapcraft/snapcraft.yaml
1718 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1719 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh])
1721 if test "${enable_bgp_vnc}" != "no"; then
1722 if test "${with_rfp_path}" = "bgpd/rfp-example" ; then
1723 AC_CONFIG_FILES([bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile])
1725 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1729 AC_CONFIG_FILES([solaris/Makefile])
1731 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1733 ## Hack, but working solution to avoid rebuilding of quagga.info.
1734 ## It's already in CVS until texinfo 4.7 is more common.
1738 FreeRangeRouting configuration
1739 ------------------------------
1740 FRR version : ${PACKAGE_VERSION}
1741 host operating system : ${host_os}
1742 source code location : ${srcdir}
1744 compiler flags : ${CFLAGS}
1746 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1747 state file directory : ${frr_statedir}
1748 config file directory : `eval echo \`echo ${sysconfdir}\``
1749 example directory : `eval echo \`echo ${exampledir}\``
1750 module directory : ${CFG_MODULE}
1751 user to run as : ${enable_user}
1752 group to run as : ${enable_group}
1753 group for vty sockets : ${enable_vty_group}
1754 config file mask : ${enable_configfile_mask}
1755 log file mask : ${enable_logfile_mask}
1756 zebra protobuf enabled : ${have_protobuf:-no}
1758 The above user and group must have read/write access to the state file
1759 directory and to the config files in the config file directory."