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-rc0, [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])
822 AC_CHECK_HEADER([asm-generic/unistd.h],
823 [AC_CHECK_DECL(__NR_setns,
824 AC_DEFINE(HAVE_NETNS,, Have netns),,
825 FRR_INCLUDES [#include <asm-generic/unistd.h>
827 AC_CHECK_FUNCS(setns)]
830 dnl ------------------------------------
831 dnl Determine routing get and set method
832 dnl ------------------------------------
833 AC_MSG_CHECKING(zebra between kernel interface method)
834 if test x"$opsys" = x"gnu-linux"; then
835 AC_MSG_RESULT(netlink)
836 RT_METHOD=rt_netlink.o
837 KERNEL_METHOD=kernel_netlink.o
838 AC_DEFINE(HAVE_NETLINK,,netlink)
840 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
842 AC_MSG_RESULT(Route socket)
843 KERNEL_METHOD="kernel_socket.o"
844 RT_METHOD="rt_socket.o"
847 AC_SUBST(KERNEL_METHOD)
848 AM_CONDITIONAL([HAVE_NETLINK], [test "x$netlink" = "xyes"])
850 dnl --------------------------
851 dnl Determine IS-IS I/O method
852 dnl --------------------------
853 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
854 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
855 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
856 AC_CHECK_HEADER(net/bpf.h)
857 AC_CHECK_HEADER(sys/dlpi.h)
858 AC_MSG_CHECKING(zebra IS-IS I/O method)
859 if test x"$opsys" = x"gnu-linux"; then
860 AC_MSG_RESULT(pfpacket)
861 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
862 elif test x"$opsys" = x"sol2-6" -o x"$opsys" = x"sol8"; then
864 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
866 if test $ac_cv_header_net_bpf_h = no; then
867 if test $ac_cv_header_sys_dlpi_h = no; then
869 AC_MSG_WARN([*** IS-IS support will not be built ***])
874 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
877 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
880 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
882 dnl ------------------------------------
883 dnl check for broken CMSG_FIRSTHDR macro
884 dnl ------------------------------------
885 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
886 AC_RUN_IFELSE([AC_LANG_SOURCE([[
889 #define __EXTENSIONS__
892 #include <sys/types.h>
893 #include <sys/socket.h>
900 msg.msg_control = buf;
901 msg.msg_controllen = 0;
903 if (CMSG_FIRSTHDR(&msg) != NULL)
906 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
907 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
909 dnl ------------------------------
910 dnl check kernel route read method
911 dnl ------------------------------
912 AC_CACHE_CHECK([route read method], [frr_cv_rtread_method],
913 [if test "x$netlink" = xyes; then
914 frr_cv_rtread_method="netlink"
916 for frr_cv_rtread_method in /dev/ip /dev/null;
918 test x`ls $frr_cv_rtread_method 2>/dev/null` = x"$frr_cv_rtread_method" && break
920 case $frr_cv_rtread_method in
923 *-freebsd*) frr_cv_rtread_method="sysctl";;
924 *) frr_cv_rtread_method="getmsg";;
927 frr_cv_rtread_method="sysctl";;
930 RTREAD_METHOD=rtread_${frr_cv_rtread_method}.o
931 AC_SUBST(RTREAD_METHOD)
933 dnl -----------------------------
934 dnl check interface lookup method
935 dnl -----------------------------
937 AC_MSG_CHECKING(interface looking up method)
938 if test "$netlink" = yes; then
939 AC_MSG_RESULT(netlink)
940 IF_METHOD=if_netlink.o
941 elif test "$opsys" = "sol2-6";then
942 AC_MSG_RESULT(Solaris GIF)
944 elif test "$opsys" = "sol8";then
945 AC_MSG_RESULT(Solaris GLIF)
946 IF_METHOD=if_ioctl_solaris.o
947 IOCTL_METHOD=ioctl_solaris.o
948 elif test "$opsys" = "openbsd";then
949 AC_MSG_RESULT(openbsd)
951 elif grep NET_RT_IFLIST /usr/include/sys/socket.h >/dev/null 2>&1; then
952 AC_MSG_RESULT(sysctl)
953 IF_METHOD=if_sysctl.o
954 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
960 AC_SUBST(IOCTL_METHOD)
962 dnl ---------------------------------------------------------------
963 dnl figure out how to specify an interface in multicast sockets API
964 dnl ---------------------------------------------------------------
965 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
967 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
968 #include <sys/socket.h>
969 #include <netinet/in.h>
970 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
971 #include <linux/types.h>
974 m4_define([FRR_INCLUDES],
976 [#if HAVE_LINUX_MROUTE_H
977 # include <linux/mroute.h>
981 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
982 #include <sys/socket.h>
983 #include <sys/types.h>
984 #include <netinet/in.h>
985 #include <net/route.h>
988 m4_define([FRR_INCLUDES],
990 [#if HAVE_NETINET_IP_MROUTE_H
991 # include <netinet/ip_mroute.h>
995 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
996 AC_TRY_COMPILE([#include <sys/param.h>],
997 [#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)
1000 #error No support for BSD struct ip_mreq hack detected
1001 #endif],[AC_MSG_RESULT(yes)
1002 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1005 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1007 #include <sys/types.h>
1008 #include <netinet/in.h>
1009 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1010 ], [AC_MSG_RESULT(yes)
1011 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1014 dnl ---------------------------------------------------------------
1015 dnl figure out how to check link-state
1016 dnl ---------------------------------------------------------------
1017 AC_CHECK_HEADER( [net/if_media.h],
1018 [m4_define([LINK_DETECT_INCLUDES],
1020 [#include <net/if_media.h>
1022 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1023 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1024 [], LINK_DETECT_INCLUDES)],
1028 dnl ---------------------------------------------------------------
1029 dnl Additional, newer way to check link-state using ifi_link_state.
1030 dnl Not available in all BSD's when ifmediareq available
1031 dnl ---------------------------------------------------------------
1032 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1033 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1036 dnl ------------------------
1037 dnl TCP_MD5SIG socket option
1038 dnl ------------------------
1040 AC_CHECK_HEADER([netinet/tcp.h],
1041 [m4_define([MD5_INCLUDES],
1043 [#include <netinet/tcp.h>
1045 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1048 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1049 AC_CHECK_HEADER([linux/tcp.h],
1050 [m4_define([MD5_INCLUDES],
1052 [#include <linux/tcp.h>
1054 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1057 dnl -----------------------------
1058 dnl check ipforward detect method
1059 dnl -----------------------------
1060 AC_CACHE_CHECK([ipforward method], [frr_cv_ipforward_method],
1061 [if test x$cross_compiling = xyes; then
1062 if test x"$opsys" = x"gnu-linux"; then
1063 frr_cv_ipforward_method=/proc/net/snmp
1065 frr_cv_ipforward_method=/dev/ip
1068 for frr_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null;
1070 test x`ls $frr_cv_ipforward_method 2>/dev/null` = x"$frr_cv_ipforward_method" && break
1073 case $frr_cv_ipforward_method in
1074 "/proc/net/snmp") frr_cv_ipforward_method="proc";;
1077 *-freebsd*) frr_cv_ipforward_method="sysctl";;
1078 *) frr_cv_ipforward_method="solaris";;
1080 *) frr_cv_ipforward_method="sysctl";;
1082 IPFORWARD=ipforward_${frr_cv_ipforward_method}.o
1085 dnl ----------------------------------------------------------------------------
1086 dnl figure out if domainname is available in the utsname struct (GNU extension).
1087 dnl ----------------------------------------------------------------------------
1088 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1093 AC_MSG_CHECKING(whether does this OS have IPv6 stack)
1097 if grep WIDE /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1098 AC_DEFINE(KAME,1,KAME IPv6)
1100 dnl ------------------------------------
1101 dnl Solaris 9, 10 and potentially higher
1102 dnl ------------------------------------
1103 elif test x"$opsys" = x"sol8"; then
1104 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
1105 AC_MSG_RESULT(Solaris IPv6)
1109 elif test x"$opsys" = x"gnu-linux"; then
1110 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
1111 dnl Linux has a compilation problem with mixing
1112 dnl netinet/in.h and linux/in6.h they are not
1113 dnl compatible. There has been discussion on
1114 dnl how to fix it but no real progress on implementation
1115 dnl when they fix it, remove this
1116 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
1117 AC_MSG_RESULT(Linux IPv6)
1119 AC_MSG_ERROR([Failed to detect IPv6 stack])
1122 dnl ------------------
1123 dnl IPv6 header checks
1124 dnl ------------------
1125 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1126 netinet6/in6_var.h netinet6/nd6.h], [], [],
1129 m4_define([FRR_INCLUDES],dnl
1131 [#if HAVE_NETINET6_IN6_H
1132 #include <netinet6/in6.h>
1134 #if HAVE_NETINET_IN6_VAR_H
1135 #include <netinet/in6_var.h>
1137 #include <netinet/icmp6.h>
1138 #if HAVE_NETINET6_IN6_VAR_H
1139 # include <netinet6/in6_var.h>
1141 #if HAVE_NETINET6_ND6_H
1142 # include <netinet6/nd6.h>
1146 dnl disable doc check
1147 if test "${enable_doc}" = "no";then
1153 dnl --------------------
1154 dnl Daemon disable check
1155 dnl --------------------
1156 if test "${enable_zebra}" = "no";then
1161 AM_CONDITIONAL(ZEBRA, test "x$ZEBRA" = "xzebra")
1163 if test "${enable_bgpd}" = "no";then
1168 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1170 if test "${enable_ripd}" = "no";then
1175 AM_CONDITIONAL(RIPD, test "x$RIPD" = "xripd")
1177 if test "${enable_ospfd}" = "no";then
1182 AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd")
1184 if test "${enable_ldpd}" = "no";then
1187 AX_PROG_PERL_MODULES(XML::LibXML, , [
1188 if test -f "${srcdir}/ldpd/ldp_vty_cmds.c"; then
1189 AC_MSG_WARN([XML::LibXML perl module not found, using pregenerated ldp_vty_cmds.c])
1191 AC_MSG_ERROR([XML::LibXML perl module not found and pregenerated ldp_vty_cmds.c missing])
1196 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1198 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1201 if test "$opsys" = "gnu-linux"; then
1202 if test "${enable_nhrpd}" != "no"; then
1206 if test "${enable_nhrpd}" = "yes"; then
1207 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1210 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1212 if test "${enable_watchfrr}" = "no";then
1217 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1220 if test "${enable_ospfapi}" != "no";then
1221 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1223 if test "${enable_ospfclient}" != "no";then
1224 OSPFCLIENT="ospfclient"
1228 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1230 case "${enable_ripngd}" in
1232 * ) RIPNGD="ripngd";;
1234 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1236 case "${enable_ospf6d}" in
1238 * ) OSPF6D="ospf6d";;
1240 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1242 case "${enable_isisd}" in
1246 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1248 case "${enable_pimd}" in
1252 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1254 if test "${enable_bgp_announce}" = "no";then
1255 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1257 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1260 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1261 with_rfp_path="bgpd/rfp-example"
1263 if test "${with_rfp_path}" != "no"; then
1264 VNC_RFP_PATH="${with_rfp_path}"
1265 AC_SUBST(VNC_RFP_PATH)
1268 if test "${enable_bgp_vnc}" != "no";then
1269 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1270 RFPTEST="${with_rfp_path}/rfptest"
1271 LIBRFP="${with_rfp_path}/librfp"
1272 RFPINC="${with_rfp_path}/librfp"
1276 RFPINC="bgpd/rfp-example/librfp"
1279 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1299 AC_SUBST(OSPFCLIENT)
1301 AC_CHECK_LIB(crypt, crypt)
1302 AC_CHECK_LIB(resolv, res_init)
1304 dnl ---------------------------
1305 dnl check system has PCRE regexp
1306 dnl ---------------------------
1307 if test "x$enable_pcreposix" = "xyes"; then
1308 AC_CHECK_LIB(pcreposix, pcreposix_regexec, ,[enable_pcreposix=no
1309 AC_MSG_WARN([*** falling back to other regex library ***]) ])
1311 AC_SUBST(HAVE_LIBPCREPOSIX)
1313 dnl ------------------
1314 dnl check C-Ares library
1315 dnl ------------------
1316 if test "${NHRPD}" != ""; then
1317 PKG_CHECK_MODULES([CARES], [libcares])
1321 dnl ------------------
1322 dnl check Net-SNMP library
1323 dnl ------------------
1324 if test "${enable_snmp}" != ""; then
1325 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1326 if test x"$NETSNMP_CONFIG" = x"no"; then
1327 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1329 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1330 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1331 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1332 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1339 ])],[AC_MSG_RESULT(yes)],[
1341 AC_MSG_ERROR([--enable-snmp given but not usable])])
1342 case "${enable_snmp}" in
1347 SNMP_METHOD="${enable_snmp}"
1350 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1353 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1354 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1355 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1357 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1359 AC_SUBST(SNMP_CFLAGS)
1364 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1365 AC_MSG_ERROR([unable to find the dlopen()])
1368 AC_CHECK_HEADERS([link.h])
1370 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1371 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1379 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1382 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1387 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1388 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1395 struct link_map *lm = NULL;
1396 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1399 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1405 dnl ---------------------------
1406 dnl sockaddr and netinet checks
1407 dnl ---------------------------
1410 struct vifctl, struct mfcctl, struct sioc_sg_req,
1411 vifi_t, struct sioc_vif_req, struct igmpmsg,
1412 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1413 struct nd_opt_adv_interval, struct rt_addrinfo,
1414 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1415 [], [], FRR_INCLUDES)
1417 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1418 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1419 struct sockaddr_dl.sdl_len,
1420 struct if6_aliasreq.ifra_lifetime,
1421 struct nd_opt_adv_interval.nd_opt_ai_type],
1422 [], [], FRR_INCLUDES)
1424 dnl ---------------------------
1425 dnl IRDP/pktinfo/icmphdr checks
1426 dnl ---------------------------
1427 AC_CHECK_TYPES([struct in_pktinfo],
1428 [AC_CHECK_TYPES([struct icmphdr],
1429 [if test "${enable_irdp}" != "no"; then
1430 AC_DEFINE(HAVE_IRDP,, IRDP)
1432 [if test "${enable_irdp}" = "yes"; then
1433 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1434 fi], [FRR_INCLUDES])],
1435 [if test "${enable_irdp}" = "yes"; then
1436 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1437 fi], [FRR_INCLUDES])
1439 dnl -----------------------
1440 dnl checking for IP_PKTINFO
1441 dnl -----------------------
1442 AC_MSG_CHECKING(for IP_PKTINFO)
1443 AC_TRY_COMPILE([#include <netdb.h>], [
1444 int opt = IP_PKTINFO;
1447 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1452 dnl ---------------------------
1453 dnl checking for IP_RECVDSTADDR
1454 dnl ---------------------------
1455 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1456 AC_TRY_COMPILE([#include <netinet/in.h>], [
1457 int opt = IP_RECVDSTADDR;
1460 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1465 dnl ----------------------
1466 dnl checking for IP_RECVIF
1467 dnl ----------------------
1468 AC_MSG_CHECKING(for IP_RECVIF)
1469 AC_TRY_COMPILE([#include <netinet/in.h>], [
1470 int opt = IP_RECVIF;
1473 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1478 dnl ----------------------
1479 dnl checking for SO_BINDANY
1480 dnl ----------------------
1481 AC_MSG_CHECKING(for SO_BINDANY)
1482 AC_TRY_COMPILE([#include <sys/socket.h>], [
1483 int opt = SO_BINDANY;
1486 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1491 dnl ----------------------
1492 dnl checking for IP_FREEBIND
1493 dnl ----------------------
1494 AC_MSG_CHECKING(for IP_FREEBIND)
1495 AC_TRY_COMPILE([#include <netinet/in.h>], [
1496 int opt = IP_FREEBIND;
1499 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1504 dnl --------------------------------------
1505 dnl checking for clock_time monotonic struct and call
1506 dnl --------------------------------------
1507 AC_CHECK_DECL(CLOCK_MONOTONIC,
1508 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1509 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1510 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1512 dnl --------------------------------------
1513 dnl checking for flex and bison
1514 dnl --------------------------------------
1517 AC_MSG_CHECKING(version of flex)
1518 quagga_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1519 quagga_ac_flex_version="${quagga_ac_flex_version##* }"
1520 AC_MSG_RESULT([$quagga_ac_flex_version])
1521 AX_COMPARE_VERSION([$quagga_ac_flex_version], [lt], [2.5.20], [
1522 LEX="$SHELL $missing_dir/missing flex"
1523 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1524 AC_MSG_WARN([using pregenerated flex output files])
1526 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1528 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1529 AC_SUBST([LEXLIB], [''])
1533 dnl thanks GNU bison for this b*llshit...
1534 AC_MSG_CHECKING(version of bison)
1535 quagga_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1536 quagga_ac_bison_version="${quagga_ac_bison_version##* }"
1537 quagga_ac_bison_missing="false"
1538 case "x${quagga_ac_bison_version}" in
1541 BISON_CLOSEBRACE='"'
1543 AC_MSG_RESULT([$quagga_ac_bison_version - 2.7 or older])
1546 AC_MSG_RESULT([$quagga_ac_bison_version])
1547 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1548 quagga_ac_bison_missing="true"
1551 AC_MSG_RESULT([none])
1552 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1553 quagga_ac_bison_missing="true"
1557 BISON_CLOSEBRACE='}'
1558 BISON_VERBOSE='-Dparse.error=verbose'
1559 AC_MSG_RESULT([$quagga_ac_bison_version - 3.0 or newer])
1562 AC_SUBST(BISON_OPENBRACE)
1563 AC_SUBST(BISON_CLOSEBRACE)
1564 AC_SUBST(BISON_VERBOSE)
1566 if $quagga_ac_bison_missing; then
1567 YACC="$SHELL $missing_dir/missing bison -y"
1568 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1569 AC_MSG_WARN([using pregenerated bison output files])
1571 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1575 dnl -------------------
1576 dnl capabilities checks
1577 dnl -------------------
1578 if test "${enable_capabilities}" != "no"; then
1579 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1580 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1582 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1583 frr_ac_keepcaps="yes"],
1586 if test x"${frr_ac_keepcaps}" = x"yes"; then
1587 AC_CHECK_HEADERS(sys/capability.h)
1589 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1590 AC_CHECK_LIB(cap, cap_init,
1591 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1596 AC_CHECK_HEADERS(priv.h,
1597 [AC_MSG_CHECKING(Solaris style privileges are available)
1598 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1600 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1601 frr_ac_scaps="yes"],
1607 if test x"${frr_ac_scaps}" = x"yes" \
1608 -o x"${frr_ac_lcaps}" = x"yes"; then
1609 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1614 dnl ---------------------------
1615 dnl check for glibc 'backtrace'
1616 dnl ---------------------------
1617 if test x"${enable_backtrace}" != x"no" ; then
1619 AC_CHECK_HEADER([execinfo.h], [
1620 AC_SEARCH_LIBS([backtrace], [execinfo], [
1621 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1622 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1627 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1628 dnl user explicitly requested backtrace but we failed to find support
1629 AC_MSG_FAILURE([failed to find backtrace support])
1633 dnl -----------------------------------------
1634 dnl check for malloc mallinfo struct and call
1635 dnl this must try and link using LIBS, in
1636 dnl order to check no alternative allocator
1637 dnl has been specified, which might not provide
1638 dnl mallinfo, e.g. such as Umem on Solaris.
1639 dnl -----------------------------------------
1640 AC_CHECK_HEADER([malloc.h],
1641 [AC_MSG_CHECKING(whether mallinfo is available)
1642 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1643 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1645 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1648 ], [], FRR_INCLUDES)
1653 CONFDATE=`date '+%Y%m%d'`
1656 dnl ------------------------------
1657 dnl set paths for state directory
1658 dnl ------------------------------
1659 AC_MSG_CHECKING(directory to use for state file)
1660 if test "${prefix}" = "NONE"; then
1661 frr_statedir_prefix="";
1663 frr_statedir_prefix=${prefix}
1665 if test "${localstatedir}" = '${prefix}/var'; then
1666 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1667 ${frr_statedir_prefix}/var/adm dnl
1668 ${frr_statedir_prefix}/etc dnl
1674 test -d $FRR_STATE_DIR && break
1676 frr_statedir=$FRR_STATE_DIR
1678 frr_statedir=${localstatedir}
1680 if test $frr_statedir = "/dev/null"; then
1681 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1683 AC_MSG_RESULT(${frr_statedir})
1684 AC_SUBST(frr_statedir)
1686 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1687 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1688 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1690 dnl autoconf does this, but it does it too late...
1691 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1692 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1694 dnl get the full path, recursing through variables...
1695 vtysh_bin="$bindir/vtysh"
1696 for I in 1 2 3 4 5 6 7 8 9 10; do
1697 eval vtysh_bin="\"$vtysh_bin\""
1699 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1701 CFG_SYSCONF="$sysconfdir"
1703 CFG_STATE="$frr_statedir"
1704 CFG_MODULE="$moduledir"
1705 for I in 1 2 3 4 5 6 7 8 9 10; do
1706 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1707 eval CFG_SBIN="\"$CFG_SBIN\""
1708 eval CFG_STATE="\"$CFG_STATE\""
1709 eval CFG_MODULE="\"$CFG_MODULE\""
1711 AC_SUBST(CFG_SYSCONF)
1714 AC_SUBST(CFG_MODULE)
1715 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1717 dnl ---------------------------
1718 dnl Check htonl works correctly
1719 dnl ---------------------------
1720 AC_MSG_CHECKING(for working htonl)
1721 AC_CACHE_VAL(ac_cv_htonl_works,
1722 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1723 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1726 AC_MSG_RESULT($ac_cv_htonl_works)
1728 AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile
1729 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile
1730 ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile
1731 doc/Makefile ospfclient/Makefile tests/Makefile m4/Makefile
1741 snapcraft/snapcraft.yaml
1743 tests/lib/cli/test_cli.refout
1759 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1760 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh])
1762 if test "${enable_bgp_vnc}" != "no"; then
1763 if test "${with_rfp_path}" = "bgpd/rfp-example" ; then
1764 AC_CONFIG_FILES([bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile])
1766 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1770 AC_CONFIG_FILES([solaris/Makefile])
1772 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1774 ## Hack, but working solution to avoid rebuilding of quagga.info.
1775 ## It's already in CVS until texinfo 4.7 is more common.
1779 FRRouting configuration
1780 ------------------------------
1781 FRR version : ${PACKAGE_VERSION}
1782 host operating system : ${host_os}
1783 source code location : ${srcdir}
1785 compiler flags : ${CFLAGS}
1787 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1788 state file directory : ${frr_statedir}
1789 config file directory : `eval echo \`echo ${sysconfdir}\``
1790 example directory : `eval echo \`echo ${exampledir}\``
1791 module directory : ${CFG_MODULE}
1792 user to run as : ${enable_user}
1793 group to run as : ${enable_group}
1794 group for vty sockets : ${enable_vty_group}
1795 config file mask : ${enable_configfile_mask}
1796 log file mask : ${enable_logfile_mask}
1797 zebra protobuf enabled : ${have_protobuf:-no}
1799 The above user and group must have read/write access to the state file
1800 directory and to the config files in the config file directory."