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.0, [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 --------------------
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-oldvpn-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_CALL,,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)
362 DFLT_NAME="datacenter"
364 DFLT_NAME="traditional"
367 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
369 if test "${enable_shell_access}" = "yes"; then
370 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
373 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
375 if test "x${enable_dev_build}" = "xyes"; then
376 AC_DEFINE(DEV_BUILD,,Build for development)
378 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
381 # Logic for protobuf support.
383 if test "$enable_protobuf" = "yes"; then
387 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
388 if test "x$PROTOC_C" = "x/bin/false"; then
392 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
393 [found_protobuf_c=yes],
394 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
396 if test "x$found_protobuf_c" = "xyes"; then
397 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
398 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
400 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
401 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
407 # Logic for old vpn commans support.
409 if test "$enable_oldvpn_commands" = "yes"; then
410 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
413 # Fail if the user explicity enabled protobuf support and we couldn't
414 # find the compiler or libraries.
415 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
416 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
419 if test "x$have_protobuf" = "xyes"; then
420 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
423 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
426 # End of logic for protobuf support.
429 if test "${enable_tcp_zebra}" = "yes"; then
430 AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
433 if test "${enable_linux24_tcp_md5}" = "yes"; then
434 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
437 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
438 if test "${enable_rtadv}" != "no"; then
440 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
445 if test "${enable_irdp}" = "yes"; then
446 AC_DEFINE(HAVE_IRDP,, IRDP )
449 if test x"${enable_user}" = x"no"; then
452 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
455 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
458 if test x"${enable_group}" = x"no"; then
461 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
464 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
467 if test x"${enable_vty_group}" = x"yes" ; then
468 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
469 elif test x"${enable_vty_group}" != x""; then
470 if test x"${enable_vty_group}" != x"no"; then
471 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
474 AC_SUBST([enable_user])
475 AC_SUBST([enable_group])
476 AC_SUBST([enable_vty_group])
478 enable_configfile_mask=${enable_configfile_mask:-0600}
479 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
481 enable_logfile_mask=${enable_logfile_mask:-0600}
482 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
486 case "${enable_multipath}" in
490 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
491 MPATH_NUM="${enable_multipath}"
496 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
500 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
502 dnl -----------------------------------
503 dnl Add extra version string to package
504 dnl name, string and version fields.
505 dnl -----------------------------------
506 if test "x${EXTRAVERSION}" != "x" ; then
507 VERSION="${VERSION}${EXTRAVERSION}"
508 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
509 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
510 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
513 if test "x$with_pkg_git_version" = "xyes"; then
514 if test -d "${srcdir}/.git"; then
515 AC_DEFINE(GIT_VERSION, [1], [include git version info])
516 else with_pkg_git_version="no"
517 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
520 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
522 dnl ------------------------------------
523 dnl Check C keywords and standard types
524 dnl ------------------------------------
535 dnl -------------------------
536 dnl Check other header files.
537 dnl -------------------------
538 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
539 linux/version.h asm/types.h \
542 dnl Utility macro to avoid retyping includes all the time
543 m4_define([FRR_INCLUDES],
546 #define __EXTENSIONS__
551 #include <sys/types.h>
552 /* sys/conf.h depends on param.h on FBSD at least */
553 #include <sys/param.h>
554 /* Required for MAXSIG */
556 #include <sys/socket.h>
558 # define __APPLE_USE_RFC_3542
560 #include <netinet/in.h>
561 #include <sys/time.h>
566 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
567 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
568 dnl an additional round for it.
570 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
572 m4_define([FRR_INCLUDES],
574 [#if HAVE_NET_IF_VAR_H
575 # include <net/if_var.h>
579 AC_CHECK_HEADERS([netinet/in_var.h \
580 net/if_dl.h net/netopt.h \
581 inet/nd.h netinet/ip_icmp.h \
582 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
583 [], [], FRR_INCLUDES)
585 AC_CHECK_HEADERS([ucontext.h], [], [],
588 #endif /* __USE_GNU */
592 m4_define([UCONTEXT_INCLUDES],
593 [#include <ucontext.h>])dnl
595 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
596 [], [], [UCONTEXT_INCLUDES])
597 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
598 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
599 [], [], [UCONTEXT_INCLUDES])],
600 [], [UCONTEXT_INCLUDES])
601 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
602 [], [], [UCONTEXT_INCLUDES])
604 m4_define([FRR_INCLUDES],
608 #include <netinet/in_systm.h>
609 #if HAVE_NETINET_IN_VAR_H
610 # include <netinet/in_var.h>
613 # include <net/if_dl.h>
615 #if HAVE_NET_NETOPT_H
616 # include <net/netopt.h>
618 #include <net/route.h>
620 # include <inet/nd.h>
622 #include <arpa/inet.h>
623 /* Required for IDRP */
624 #if HAVE_NETINET_IP_ICMP_H
625 # include <netinet/ip_icmp.h>
629 dnl V6 headers are checked below, after we check for v6
631 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
633 [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
635 AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
636 AC_DEFINE(SUNOS_5, 1, SunOS 5)
637 AC_CHECK_LIB(xnet, main)
642 | [*-sunos5.1[0-9]] \
643 | [*-sunos5.1[0-9].[0-9]] \
644 | [*-solaris2.[8-9]] \
645 | [*-solaris2.1[0-9]] \
646 | [*-solaris2.1[0-9].[0-9]])
648 AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
649 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
650 AC_CHECK_LIB(socket, main)
651 AC_CHECK_LIB(nsl, main)
652 AC_CHECK_LIB(umem, main)
653 AC_CHECK_FUNCS([printstack],
654 [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
655 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
660 *-sunos5* | *-solaris2*)
661 AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
662 AC_CHECK_LIB(socket, main)
663 AC_CHECK_LIB(nsl, main)
669 AC_DEFINE(GNU_LINUX,,GNU Linux)
673 AC_DEFINE(OPEN_BSD,,OpenBSD)
679 dnl ---------------------
680 dnl Integrated VTY option
681 dnl ---------------------
682 case "${enable_vtysh}" in
685 AC_DEFINE(VTYSH,,VTY shell)
686 dnl Vtysh uses libreadline, which looks for termcap functions at
687 dnl configure time. We follow readlines search order.
688 dnl The required procedures are in libtermcap on NetBSD, in
689 dnl [TODO] on Linux, and in [TODO] on Solaris.
690 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
691 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
692 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
693 [AC_CHECK_LIB(ncurses, tputs,
694 LIBREADLINE="$LIBREADLINE -lncurses")]
698 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
700 if test $ac_cv_lib_readline_main = no; then
701 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
703 AC_CHECK_HEADER(readline/history.h)
704 if test $ac_cv_header_readline_history_h = no;then
705 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
707 AC_CHECK_LIB(readline, rl_completion_matches,
708 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
709 if test $ac_cv_lib_readline_rl_completion_matches = no; then
710 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
714 AC_SUBST(LIBREADLINE)
715 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
720 dnl Quagga detects the PAM library it is built against by checking for a
721 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
722 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
723 dnl openpam.h doesn't do that, although depends on the header too. Hence a
724 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
727 if test "$with_libpam" = "yes"; then
728 AC_CHECK_HEADER([security/pam_misc.h],
729 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
730 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
731 pam_conv_func="misc_conv"
734 AC_CHECK_HEADER([security/openpam.h],
735 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
736 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
737 pam_conv_func="openpam_ttyconv"
739 [], FRR_INCLUDES[#include <security/pam_appl.h>])
740 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
741 AC_MSG_WARN([*** pam support will not be built ***])
746 if test "$with_libpam" = "yes"; then
747 dnl took this test from proftpds configure.in and suited to our needs
748 dnl -------------------------------------------------------------------------
750 dnl This next check looks funky due to a linker problem with some versions
751 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
752 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
753 dnl with RedHat 6.2 and Debian 2.2 or better.
754 AC_CHECK_LIB(pam, pam_start,
755 [AC_CHECK_LIB(pam, $pam_conv_func,
756 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
758 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
759 LIBPAM="-lpam -lpam_misc"]
763 [AC_CHECK_LIB(pam, pam_end,
764 [AC_CHECK_LIB(pam, $pam_conv_func,
765 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
766 LIBPAM="-lpam -ldl"],
767 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
768 LIBPAM="-lpam -ldl -lpam_misc"]
770 ],AC_MSG_WARN([*** pam support will not be built ***]),
777 dnl -------------------------------
778 dnl Endian-ness check
779 dnl -------------------------------
782 dnl -------------------------------
783 dnl check the size in byte of the C
784 dnl -------------------------------
785 dnl AC_CHECK_SIZEOF(char)
786 dnl AC_CHECK_SIZEOF(int)
787 dnl AC_CHECK_SIZEOF(short)
788 dnl AC_CHECK_SIZEOF(long)
790 dnl ----------------------------
791 dnl check existance of functions
792 dnl ----------------------------
798 dnl -------------------------------
799 dnl bgpd needs pow() and hence libm
800 dnl -------------------------------
802 AC_CHECK_HEADER([math.h],
803 [AC_CHECK_LIB([m], [pow],
806 AC_CHECK_FUNCS(pow,[],[LIBM=""])
809 if test x"$LIBM" = x ; then
810 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
823 AC_CHECK_HEADER([asm-generic/unistd.h],
824 [AC_CHECK_DECL(__NR_setns,
825 AC_DEFINE(HAVE_NETNS,, Have netns),,
826 FRR_INCLUDES [#include <asm-generic/unistd.h>
828 AC_CHECK_FUNCS(setns)]
831 dnl ------------------------------------
832 dnl Determine routing get and set method
833 dnl ------------------------------------
834 AC_MSG_CHECKING(zebra between kernel interface method)
835 if test x"$opsys" = x"gnu-linux"; then
836 AC_MSG_RESULT(netlink)
837 RT_METHOD=rt_netlink.o
838 KERNEL_METHOD=kernel_netlink.o
839 AC_DEFINE(HAVE_NETLINK,,netlink)
841 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
843 AC_MSG_RESULT(Route socket)
844 KERNEL_METHOD="kernel_socket.o"
845 RT_METHOD="rt_socket.o"
848 AC_SUBST(KERNEL_METHOD)
849 AM_CONDITIONAL([HAVE_NETLINK], [test "x$netlink" = "xyes"])
851 dnl --------------------------
852 dnl Determine IS-IS I/O method
853 dnl --------------------------
854 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
855 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
856 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
857 AC_CHECK_HEADER(net/bpf.h)
858 AC_CHECK_HEADER(sys/dlpi.h)
859 AC_MSG_CHECKING(zebra IS-IS I/O method)
860 if test x"$opsys" = x"gnu-linux"; then
861 AC_MSG_RESULT(pfpacket)
862 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
863 elif test x"$opsys" = x"sol2-6" -o x"$opsys" = x"sol8"; then
865 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
867 if test $ac_cv_header_net_bpf_h = no; then
868 if test $ac_cv_header_sys_dlpi_h = no; then
870 AC_MSG_WARN([*** IS-IS support will not be built ***])
875 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
878 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
881 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
883 dnl ------------------------------------
884 dnl check for broken CMSG_FIRSTHDR macro
885 dnl ------------------------------------
886 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
887 AC_RUN_IFELSE([AC_LANG_SOURCE([[
890 #define __EXTENSIONS__
893 #include <sys/types.h>
894 #include <sys/socket.h>
901 msg.msg_control = buf;
902 msg.msg_controllen = 0;
904 if (CMSG_FIRSTHDR(&msg) != NULL)
907 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
908 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
910 dnl ------------------------------
911 dnl check kernel route read method
912 dnl ------------------------------
913 AC_CACHE_CHECK([route read method], [frr_cv_rtread_method],
914 [if test "x$netlink" = xyes; then
915 frr_cv_rtread_method="netlink"
917 for frr_cv_rtread_method in /dev/ip /dev/null;
919 test x`ls $frr_cv_rtread_method 2>/dev/null` = x"$frr_cv_rtread_method" && break
921 case $frr_cv_rtread_method in
924 *-freebsd*) frr_cv_rtread_method="sysctl";;
925 *) frr_cv_rtread_method="getmsg";;
928 frr_cv_rtread_method="sysctl";;
931 RTREAD_METHOD=rtread_${frr_cv_rtread_method}.o
932 AC_SUBST(RTREAD_METHOD)
934 dnl -----------------------------
935 dnl check interface lookup method
936 dnl -----------------------------
938 AC_MSG_CHECKING(interface looking up method)
939 if test "$netlink" = yes; then
940 AC_MSG_RESULT(netlink)
941 IF_METHOD=if_netlink.o
942 elif test "$opsys" = "sol2-6";then
943 AC_MSG_RESULT(Solaris GIF)
945 elif test "$opsys" = "sol8";then
946 AC_MSG_RESULT(Solaris GLIF)
947 IF_METHOD=if_ioctl_solaris.o
948 IOCTL_METHOD=ioctl_solaris.o
949 elif test "$opsys" = "openbsd";then
950 AC_MSG_RESULT(openbsd)
952 elif grep NET_RT_IFLIST /usr/include/sys/socket.h >/dev/null 2>&1; then
953 AC_MSG_RESULT(sysctl)
954 IF_METHOD=if_sysctl.o
955 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
961 AC_SUBST(IOCTL_METHOD)
963 dnl ---------------------------------------------------------------
964 dnl figure out how to specify an interface in multicast sockets API
965 dnl ---------------------------------------------------------------
966 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
968 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
969 #include <sys/socket.h>
970 #include <netinet/in.h>
971 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
972 #include <linux/types.h>
975 m4_define([FRR_INCLUDES],
977 [#if HAVE_LINUX_MROUTE_H
978 # include <linux/mroute.h>
982 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
983 #include <sys/socket.h>
984 #include <sys/types.h>
985 #include <netinet/in.h>
986 #include <net/route.h>
989 m4_define([FRR_INCLUDES],
991 [#if HAVE_NETINET_IP_MROUTE_H
992 # include <netinet/ip_mroute.h>
996 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
997 AC_TRY_COMPILE([#include <sys/param.h>],
998 [#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)
1001 #error No support for BSD struct ip_mreq hack detected
1002 #endif],[AC_MSG_RESULT(yes)
1003 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1006 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1008 #include <sys/types.h>
1009 #include <netinet/in.h>
1010 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1011 ], [AC_MSG_RESULT(yes)
1012 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1015 dnl ---------------------------------------------------------------
1016 dnl figure out how to check link-state
1017 dnl ---------------------------------------------------------------
1018 AC_CHECK_HEADER( [net/if_media.h],
1019 [m4_define([LINK_DETECT_INCLUDES],
1021 [#include <net/if_media.h>
1023 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1024 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1025 [], LINK_DETECT_INCLUDES)],
1029 dnl ---------------------------------------------------------------
1030 dnl Additional, newer way to check link-state using ifi_link_state.
1031 dnl Not available in all BSD's when ifmediareq available
1032 dnl ---------------------------------------------------------------
1033 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1034 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1037 dnl ------------------------
1038 dnl TCP_MD5SIG socket option
1039 dnl ------------------------
1041 AC_CHECK_HEADER([netinet/tcp.h],
1042 [m4_define([MD5_INCLUDES],
1044 [#include <netinet/tcp.h>
1046 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1049 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1050 AC_CHECK_HEADER([linux/tcp.h],
1051 [m4_define([MD5_INCLUDES],
1053 [#include <linux/tcp.h>
1055 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1058 dnl -----------------------------
1059 dnl check ipforward detect method
1060 dnl -----------------------------
1061 AC_CACHE_CHECK([ipforward method], [frr_cv_ipforward_method],
1062 [if test x$cross_compiling = xyes; then
1063 if test x"$opsys" = x"gnu-linux"; then
1064 frr_cv_ipforward_method=/proc/net/snmp
1066 frr_cv_ipforward_method=/dev/ip
1069 for frr_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null;
1071 test x`ls $frr_cv_ipforward_method 2>/dev/null` = x"$frr_cv_ipforward_method" && break
1074 case $frr_cv_ipforward_method in
1075 "/proc/net/snmp") frr_cv_ipforward_method="proc";;
1078 *-freebsd*) frr_cv_ipforward_method="sysctl";;
1079 *) frr_cv_ipforward_method="solaris";;
1081 *) frr_cv_ipforward_method="sysctl";;
1083 IPFORWARD=ipforward_${frr_cv_ipforward_method}.o
1086 dnl ----------------------------------------------------------------------------
1087 dnl figure out if domainname is available in the utsname struct (GNU extension).
1088 dnl ----------------------------------------------------------------------------
1089 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1094 AC_MSG_CHECKING(whether does this OS have IPv6 stack)
1098 if grep WIDE /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1099 AC_DEFINE(KAME,1,KAME IPv6)
1101 dnl ------------------------------------
1102 dnl Solaris 9, 10 and potentially higher
1103 dnl ------------------------------------
1104 elif test x"$opsys" = x"sol8"; then
1105 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
1106 AC_MSG_RESULT(Solaris IPv6)
1110 elif test x"$opsys" = x"gnu-linux"; then
1111 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
1112 dnl Linux has a compilation problem with mixing
1113 dnl netinet/in.h and linux/in6.h they are not
1114 dnl compatible. There has been discussion on
1115 dnl how to fix it but no real progress on implementation
1116 dnl when they fix it, remove this
1117 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
1118 AC_MSG_RESULT(Linux IPv6)
1120 AC_MSG_ERROR([Failed to detect IPv6 stack])
1123 dnl ------------------
1124 dnl IPv6 header checks
1125 dnl ------------------
1126 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1127 netinet6/in6_var.h netinet6/nd6.h], [], [],
1130 m4_define([FRR_INCLUDES],dnl
1132 [#if HAVE_NETINET6_IN6_H
1133 #include <netinet6/in6.h>
1135 #if HAVE_NETINET_IN6_VAR_H
1136 #include <netinet/in6_var.h>
1138 #include <netinet/icmp6.h>
1139 #if HAVE_NETINET6_IN6_VAR_H
1140 # include <netinet6/in6_var.h>
1142 #if HAVE_NETINET6_ND6_H
1143 # include <netinet6/nd6.h>
1147 dnl disable doc check
1148 if test "${enable_doc}" = "no";then
1154 dnl --------------------
1155 dnl Daemon disable check
1156 dnl --------------------
1157 if test "${enable_zebra}" = "no";then
1162 AM_CONDITIONAL(ZEBRA, test "x$ZEBRA" = "xzebra")
1164 if test "${enable_bgpd}" = "no";then
1169 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1171 if test "${enable_ripd}" = "no";then
1176 AM_CONDITIONAL(RIPD, test "x$RIPD" = "xripd")
1178 if test "${enable_ospfd}" = "no";then
1183 AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd")
1185 if test "${enable_ldpd}" = "no";then
1188 AX_PROG_PERL_MODULES(XML::LibXML, , [
1189 if test -f "${srcdir}/ldpd/ldp_vty_cmds.c"; then
1190 AC_MSG_WARN([XML::LibXML perl module not found, using pregenerated ldp_vty_cmds.c])
1192 AC_MSG_ERROR([XML::LibXML perl module not found and pregenerated ldp_vty_cmds.c missing])
1197 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1199 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1202 if test "$opsys" = "gnu-linux"; then
1203 if test "${enable_nhrpd}" != "no"; then
1207 if test "${enable_nhrpd}" = "yes"; then
1208 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1211 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1213 if test "${enable_watchfrr}" = "no";then
1218 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1221 if test "${enable_ospfapi}" != "no";then
1222 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1224 if test "${enable_ospfclient}" != "no";then
1225 OSPFCLIENT="ospfclient"
1229 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1231 case "${enable_ripngd}" in
1233 * ) RIPNGD="ripngd";;
1235 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1237 case "${enable_ospf6d}" in
1239 * ) OSPF6D="ospf6d";;
1241 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1243 case "${enable_isisd}" in
1247 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1249 case "${enable_pimd}" in
1253 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1255 if test "${enable_bgp_announce}" = "no";then
1256 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1258 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1261 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1262 with_rfp_path="bgpd/rfp-example"
1264 if test "${with_rfp_path}" != "no"; then
1265 VNC_RFP_PATH="${with_rfp_path}"
1266 AC_SUBST(VNC_RFP_PATH)
1269 if test "${enable_bgp_vnc}" != "no";then
1270 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1271 RFPTEST="${with_rfp_path}/rfptest"
1272 LIBRFP="${with_rfp_path}/librfp"
1273 RFPINC="${with_rfp_path}/librfp"
1277 RFPINC="bgpd/rfp-example/librfp"
1280 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1300 AC_SUBST(OSPFCLIENT)
1302 AC_CHECK_LIB(crypt, crypt)
1303 AC_CHECK_LIB(resolv, res_init)
1305 dnl ---------------------------
1306 dnl check system has PCRE regexp
1307 dnl ---------------------------
1308 if test "x$enable_pcreposix" = "xyes"; then
1309 AC_CHECK_LIB(pcreposix, pcreposix_regexec, ,[enable_pcreposix=no
1310 AC_MSG_WARN([*** falling back to other regex library ***]) ])
1312 AC_SUBST(HAVE_LIBPCREPOSIX)
1314 dnl ------------------
1315 dnl check C-Ares library
1316 dnl ------------------
1317 if test "${NHRPD}" != ""; then
1318 PKG_CHECK_MODULES([CARES], [libcares])
1322 dnl ------------------
1323 dnl check Net-SNMP library
1324 dnl ------------------
1325 if test "${enable_snmp}" != ""; then
1326 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1327 if test x"$NETSNMP_CONFIG" = x"no"; then
1328 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1330 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1331 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1332 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1333 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1340 ])],[AC_MSG_RESULT(yes)],[
1342 AC_MSG_ERROR([--enable-snmp given but not usable])])
1343 case "${enable_snmp}" in
1348 SNMP_METHOD="${enable_snmp}"
1351 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1354 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1355 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1356 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1358 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1360 AC_SUBST(SNMP_CFLAGS)
1365 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1366 AC_MSG_ERROR([unable to find the dlopen()])
1369 AC_CHECK_HEADERS([link.h])
1371 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1372 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1380 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1383 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1388 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1389 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1396 struct link_map *lm = NULL;
1397 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1400 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1406 dnl ---------------------------
1407 dnl sockaddr and netinet checks
1408 dnl ---------------------------
1411 struct vifctl, struct mfcctl, struct sioc_sg_req,
1412 vifi_t, struct sioc_vif_req, struct igmpmsg,
1413 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1414 struct nd_opt_adv_interval, struct rt_addrinfo,
1415 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1416 [], [], FRR_INCLUDES)
1418 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1419 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1420 struct sockaddr_dl.sdl_len,
1421 struct if6_aliasreq.ifra_lifetime,
1422 struct nd_opt_adv_interval.nd_opt_ai_type],
1423 [], [], FRR_INCLUDES)
1425 dnl ---------------------------
1426 dnl IRDP/pktinfo/icmphdr checks
1427 dnl ---------------------------
1428 AC_CHECK_TYPES([struct in_pktinfo],
1429 [AC_CHECK_TYPES([struct icmphdr],
1430 [if test "${enable_irdp}" != "no"; then
1431 AC_DEFINE(HAVE_IRDP,, IRDP)
1433 [if test "${enable_irdp}" = "yes"; then
1434 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1435 fi], [FRR_INCLUDES])],
1436 [if test "${enable_irdp}" = "yes"; then
1437 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1438 fi], [FRR_INCLUDES])
1440 dnl -----------------------
1441 dnl checking for IP_PKTINFO
1442 dnl -----------------------
1443 AC_MSG_CHECKING(for IP_PKTINFO)
1444 AC_TRY_COMPILE([#include <netdb.h>], [
1445 int opt = IP_PKTINFO;
1448 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1453 dnl ---------------------------
1454 dnl checking for IP_RECVDSTADDR
1455 dnl ---------------------------
1456 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1457 AC_TRY_COMPILE([#include <netinet/in.h>], [
1458 int opt = IP_RECVDSTADDR;
1461 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1466 dnl ----------------------
1467 dnl checking for IP_RECVIF
1468 dnl ----------------------
1469 AC_MSG_CHECKING(for IP_RECVIF)
1470 AC_TRY_COMPILE([#include <netinet/in.h>], [
1471 int opt = IP_RECVIF;
1474 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1479 dnl ----------------------
1480 dnl checking for SO_BINDANY
1481 dnl ----------------------
1482 AC_MSG_CHECKING(for SO_BINDANY)
1483 AC_TRY_COMPILE([#include <sys/socket.h>], [
1484 int opt = SO_BINDANY;
1487 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1492 dnl ----------------------
1493 dnl checking for IP_FREEBIND
1494 dnl ----------------------
1495 AC_MSG_CHECKING(for IP_FREEBIND)
1496 AC_TRY_COMPILE([#include <netinet/in.h>], [
1497 int opt = IP_FREEBIND;
1500 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1505 dnl --------------------------------------
1506 dnl checking for clock_time monotonic struct and call
1507 dnl --------------------------------------
1508 AC_CHECK_DECL(CLOCK_MONOTONIC,
1509 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1510 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1511 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1513 dnl --------------------------------------
1514 dnl checking for flex and bison
1515 dnl --------------------------------------
1518 AC_MSG_CHECKING(version of flex)
1519 quagga_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1520 quagga_ac_flex_version="${quagga_ac_flex_version##* }"
1521 AC_MSG_RESULT([$quagga_ac_flex_version])
1522 AX_COMPARE_VERSION([$quagga_ac_flex_version], [lt], [2.5.20], [
1523 LEX="$SHELL $missing_dir/missing flex"
1524 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1525 AC_MSG_WARN([using pregenerated flex output files])
1527 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1529 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1530 AC_SUBST([LEXLIB], [''])
1534 dnl thanks GNU bison for this b*llshit...
1535 AC_MSG_CHECKING(version of bison)
1536 quagga_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1537 quagga_ac_bison_version="${quagga_ac_bison_version##* }"
1538 quagga_ac_bison_missing="false"
1539 case "x${quagga_ac_bison_version}" in
1542 BISON_CLOSEBRACE='"'
1544 AC_MSG_RESULT([$quagga_ac_bison_version - 2.7 or older])
1547 AC_MSG_RESULT([$quagga_ac_bison_version])
1548 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1549 quagga_ac_bison_missing="true"
1552 AC_MSG_RESULT([none])
1553 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1554 quagga_ac_bison_missing="true"
1558 BISON_CLOSEBRACE='}'
1559 BISON_VERBOSE='-Dparse.error=verbose'
1560 AC_MSG_RESULT([$quagga_ac_bison_version - 3.0 or newer])
1563 AC_SUBST(BISON_OPENBRACE)
1564 AC_SUBST(BISON_CLOSEBRACE)
1565 AC_SUBST(BISON_VERBOSE)
1567 if $quagga_ac_bison_missing; then
1568 YACC="$SHELL $missing_dir/missing bison -y"
1569 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1570 AC_MSG_WARN([using pregenerated bison output files])
1572 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1576 dnl -------------------
1577 dnl capabilities checks
1578 dnl -------------------
1579 if test "${enable_capabilities}" != "no"; then
1580 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1581 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1583 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1584 frr_ac_keepcaps="yes"],
1587 if test x"${frr_ac_keepcaps}" = x"yes"; then
1588 AC_CHECK_HEADERS(sys/capability.h)
1590 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1591 AC_CHECK_LIB(cap, cap_init,
1592 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1597 AC_CHECK_HEADERS(priv.h,
1598 [AC_MSG_CHECKING(Solaris style privileges are available)
1599 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1601 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1602 frr_ac_scaps="yes"],
1608 if test x"${frr_ac_scaps}" = x"yes" \
1609 -o x"${frr_ac_lcaps}" = x"yes"; then
1610 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1615 dnl ---------------------------
1616 dnl check for glibc 'backtrace'
1617 dnl ---------------------------
1618 if test x"${enable_backtrace}" != x"no" ; then
1620 AC_CHECK_HEADER([execinfo.h], [
1621 AC_SEARCH_LIBS([backtrace], [execinfo], [
1622 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1623 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1628 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1629 dnl user explicitly requested backtrace but we failed to find support
1630 AC_MSG_FAILURE([failed to find backtrace support])
1634 dnl -----------------------------------------
1635 dnl check for malloc mallinfo struct and call
1636 dnl this must try and link using LIBS, in
1637 dnl order to check no alternative allocator
1638 dnl has been specified, which might not provide
1639 dnl mallinfo, e.g. such as Umem on Solaris.
1640 dnl -----------------------------------------
1641 AC_CHECK_HEADER([malloc.h],
1642 [AC_MSG_CHECKING(whether mallinfo is available)
1643 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1644 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1646 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1649 ], [], FRR_INCLUDES)
1654 CONFDATE=`date '+%Y%m%d'`
1657 dnl ------------------------------
1658 dnl set paths for state directory
1659 dnl ------------------------------
1660 AC_MSG_CHECKING(directory to use for state file)
1661 if test "${prefix}" = "NONE"; then
1662 frr_statedir_prefix="";
1664 frr_statedir_prefix=${prefix}
1666 if test "${localstatedir}" = '${prefix}/var'; then
1667 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1668 ${frr_statedir_prefix}/var/adm dnl
1669 ${frr_statedir_prefix}/etc dnl
1675 test -d $FRR_STATE_DIR && break
1677 frr_statedir=$FRR_STATE_DIR
1679 frr_statedir=${localstatedir}
1681 if test $frr_statedir = "/dev/null"; then
1682 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1684 AC_MSG_RESULT(${frr_statedir})
1685 AC_SUBST(frr_statedir)
1687 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1688 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1689 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1691 dnl autoconf does this, but it does it too late...
1692 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1693 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1695 dnl get the full path, recursing through variables...
1696 vtysh_bin="$bindir/vtysh"
1697 for I in 1 2 3 4 5 6 7 8 9 10; do
1698 eval vtysh_bin="\"$vtysh_bin\""
1700 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1702 CFG_SYSCONF="$sysconfdir"
1704 CFG_STATE="$frr_statedir"
1705 CFG_MODULE="$moduledir"
1706 for I in 1 2 3 4 5 6 7 8 9 10; do
1707 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1708 eval CFG_SBIN="\"$CFG_SBIN\""
1709 eval CFG_STATE="\"$CFG_STATE\""
1710 eval CFG_MODULE="\"$CFG_MODULE\""
1712 AC_SUBST(CFG_SYSCONF)
1715 AC_SUBST(CFG_MODULE)
1716 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1718 dnl ---------------------------
1719 dnl Check htonl works correctly
1720 dnl ---------------------------
1721 AC_MSG_CHECKING(for working htonl)
1722 AC_CACHE_VAL(ac_cv_htonl_works,
1723 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1724 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1727 AC_MSG_RESULT($ac_cv_htonl_works)
1729 AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile
1730 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile
1731 ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile
1732 doc/Makefile ospfclient/Makefile tests/Makefile m4/Makefile
1742 snapcraft/snapcraft.yaml
1744 tests/lib/cli/test_cli.refout
1760 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1761 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh])
1763 if test "${enable_bgp_vnc}" != "no"; then
1764 if test "${with_rfp_path}" = "bgpd/rfp-example" ; then
1765 AC_CONFIG_FILES([bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile])
1767 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1771 AC_CONFIG_FILES([solaris/Makefile])
1773 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1775 ## Hack, but working solution to avoid rebuilding of quagga.info.
1776 ## It's already in CVS until texinfo 4.7 is more common.
1780 FRRouting configuration
1781 ------------------------------
1782 FRR version : ${PACKAGE_VERSION}
1783 host operating system : ${host_os}
1784 source code location : ${srcdir}
1786 compiler flags : ${CFLAGS}
1788 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1789 state file directory : ${frr_statedir}
1790 config file directory : `eval echo \`echo ${sysconfdir}\``
1791 example directory : `eval echo \`echo ${exampledir}\``
1792 module directory : ${CFG_MODULE}
1793 user to run as : ${enable_user}
1794 group to run as : ${enable_group}
1795 group for vty sockets : ${enable_vty_group}
1796 config file mask : ${enable_configfile_mask}
1797 log file mask : ${enable_logfile_mask}
1798 zebra protobuf enabled : ${have_protobuf:-no}
1800 The above user and group must have read/write access to the state file
1801 directory and to the config files in the config file directory."