2 ## Configure template file for FreeRangeRouting.
3 ## autoconf will generate configure script.
5 ## Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
6 ## Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
10 AC_INIT(frr, 2.1-dev, [https://github.com/freerangerouting/frr/issues])
11 PACKAGE_URL="https://freerangerouting.org/"
12 PACKAGE_FULLNAME="FreeRangeRouting"
13 AC_SUBST(PACKAGE_FULLNAME)
15 CONFIG_ARGS="$ac_configure_args"
18 AC_CONFIG_SRCDIR(lib/zebra.h)
19 AC_CONFIG_MACRO_DIR([m4])
21 dnl -----------------------------------
22 dnl Get hostname and other information.
23 dnl -----------------------------------
28 # Disable portability warnings -- our automake code (in particular
29 # common.am) uses some constructs specific to gmake.
30 AM_INIT_AUTOMAKE([1.12 -Wno-portability])
31 m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
32 AM_SILENT_RULES([yes])
33 AC_CONFIG_HEADERS(config.h)
35 AC_PATH_PROG(PERL, perl)
38 dnl default is to match previous behavior
39 exampledir=${sysconfdir}
40 AC_ARG_ENABLE([exampledir],
41 AS_HELP_STRING([--enable-exampledir],
42 [specify alternate directory for examples]),
43 exampledir="$enableval",)
44 dnl XXX add --exampledir to autoconf standard directory list somehow
47 dnl default is to match previous behavior
50 AC_ARG_ENABLE([pkgsrcrcdir],
51 AS_HELP_STRING([--enable-pkgsrcrcdir],
52 [specify directory for rc.d scripts]),
53 pkgsrcrcdir="$enableval"; pkgsrcdir="pkgsrc",)
54 dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
58 AC_ARG_ENABLE(tcmalloc,
59 AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
60 [case "${enableval}" in
61 yes) tcmalloc_enabled=true
62 LIBS="$LIBS -ltcmalloc_minimal"
64 no) tcmalloc_enabled=false ;;
65 *) AC_MSG_ERROR(bad value ${enableval} for --enable-tcmalloc) ;;
66 esac],[tcmalloc_enabled=false])
69 dnl --------------------
70 dnl Check CC and friends
71 dnl --------------------
72 dnl note orig_cflags is also used further down
78 dnl remove autoconf default "-g -O2"
85 dnl autoconf 2.59 appears not to support AC_PROG_SED
87 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
89 dnl try and enable CFLAGS that are useful for Quagga
90 dnl - specifically, options to control warnings
92 AC_USE_SYSTEM_EXTENSIONS()
93 AC_DEFUN([AC_C_FLAG], [{
95 ac_c_flag_save="$CFLAGS"
97 AC_MSG_CHECKING([[whether $CC supports $1]])
99 [AC_LANG_PROGRAM([[]])],
102 m4_if([$3], [], [], [
103 CFLAGS="$ac_c_flag_save"
107 CFLAGS="$ac_c_flag_save"
114 dnl ICC won't bail on unknown options without -diag-error 10006
115 dnl need to do this first so we get useful results for the other options
116 AC_C_FLAG([-diag-error 10006])
118 dnl if the user specified any CFLAGS, we don't add "-g -Os/-O2" here
119 if test "z$orig_cflags" = "z"; then
126 dnl always want these CFLAGS
127 AC_C_FLAG([-fno-omit-frame-pointer])
130 AC_C_FLAG([-Wmissing-prototypes])
131 AC_C_FLAG([-Wmissing-declarations])
132 AC_C_FLAG([-Wpointer-arith])
133 AC_C_FLAG([-Wbad-function-cast])
134 AC_C_FLAG([-Wwrite-strings])
135 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
136 AC_C_FLAG([-Wcast-qual])
137 AC_C_FLAG([-Wstrict-prototypes])
138 AC_C_FLAG([-Wmissing-noreturn])
139 AC_C_FLAG([-Wmissing-format-attribute])
140 AC_C_FLAG([-Wunreachable-code])
141 AC_C_FLAG([-Wpacked])
142 AC_C_FLAG([-Wpadded])
144 AC_C_FLAG([-Wno-unused-result])
146 AC_C_FLAG([-Wno-unused-parameter])
147 AC_C_FLAG([-Wno-missing-field-initializers])
149 dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
150 dnl for some reason the string consts get 'promoted' to char *,
151 dnl triggering a const to non-const conversion warning.
152 AC_C_FLAG([-diag-disable 3179])
154 if test x"${enable_werror}" = x"yes" ; then
159 dnl need link on this one, not compile
161 ac_ld_flag_save="$LDFLAGS"
162 LDFLAGS="$LDFLAGS -rdynamic"
163 AC_MSG_CHECKING([[whether linker supports -rdynamic]])
165 [AC_LANG_PROGRAM([[]])],
166 [AC_MSG_RESULT([yes])],
168 LDFLAGS="$ac_ld_flag_save"
179 AC_CHECK_TOOL(AR, ar)
181 dnl -----------------
182 dnl System extensions
183 dnl -----------------
191 dnl ----------------------
192 dnl Packages configuration
193 dnl ----------------------
194 AC_ARG_WITH(pkg-extra-version,
195 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]),
196 [EXTRAVERSION=$withval],)
197 AC_ARG_WITH(pkg-git-version,
198 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
199 [ test "x$withval" != "xno" && with_pkg_git_version="yes" ])
201 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for Quagga]))
203 AS_HELP_STRING([--disable-doc], [do not build docs]))
205 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
207 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
209 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
210 AC_ARG_ENABLE(ripngd,
211 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
213 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
214 AC_ARG_ENABLE(ospf6d,
215 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
217 AS_HELP_STRING([--enable-ldpd], [build ldpd]))
219 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
220 AC_ARG_ENABLE(watchfrr,
221 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
223 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
225 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
226 AC_ARG_ENABLE(bgp-announce,
227 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
228 AC_ARG_ENABLE(bgp-vnc,
229 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
230 AC_ARG_WITH(rfp-path,
231 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
233 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
235 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
236 AC_ARG_ENABLE(tcp-zebra,
237 AS_HELP_STRING([--enable-tcp-zebra], [enable TCP/IP socket connection between zebra and protocol daemon]))
238 AC_ARG_ENABLE(ospfapi,
239 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
240 AC_ARG_ENABLE(ospfclient,
241 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
242 (this is the default if --disable-ospfapi is set)]))
243 AC_ARG_ENABLE(multipath,
244 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
246 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
248 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
249 AC_ARG_ENABLE(vty_group,
250 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
251 AC_ARG_ENABLE(configfile_mask,
252 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
253 AC_ARG_ENABLE(logfile_mask,
254 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
255 AC_ARG_ENABLE(shell_access,
256 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
258 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
260 AS_HELP_STRING([--enable-irdp], [enable IRDP server support in zebra]))
261 AC_ARG_ENABLE(capabilities,
262 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
263 AC_ARG_ENABLE(rusage,
264 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
265 AC_ARG_ENABLE(gcc_ultra_verbose,
266 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
267 AC_ARG_ENABLE(linux24_tcp_md5,
268 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
269 AC_ARG_ENABLE(backtrace,
270 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
271 AC_ARG_ENABLE(time-check,
272 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
273 AC_ARG_ENABLE(pcreposix,
274 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
276 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
277 AC_ARG_ENABLE(systemd,
278 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
280 AS_HELP_STRING([--enable-poll], [enable usage of Poll instead of select]))
281 AC_ARG_ENABLE(werror,
282 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
283 AC_ARG_ENABLE(cumulus,
284 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
285 AC_ARG_ENABLE(rr-semantics,
286 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
287 AC_ARG_ENABLE([protobuf],
288 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
289 AC_ARG_ENABLE([oldvpn_commands],
290 AS_HELP_STRING([--enable-old-vpn-commands], [Keep old vpn commands]))
292 AC_CHECK_HEADERS(json-c/json.h)
293 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c")
294 if test $ac_cv_lib_json_c_json_object_get = no; then
295 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
296 if test $ac_cv_lib_json_json_object_get = no; then
297 AC_MSG_ERROR([lib json is needed to compile])
301 AC_ARG_ENABLE([dev_build],
302 AS_HELP_STRING([--enable-dev-build], [build for development]))
304 if test x"${enable_time_check}" != x"no" ; then
305 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
306 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
308 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
312 case "${enable_systemd}" in
315 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
316 if test $ac_cv_lib_systemd_sd_notify = no; then
317 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
319 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
325 if test "${enable_rr_semantics}" != "no" ; then
326 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
329 if test "${enable_poll}" = "yes" ; then
330 AC_DEFINE(HAVE_POLL,,Compile systemd support in)
336 AC_MSG_CHECKING(whether this OS has MPLS stack)
339 MPLS_METHOD="zebra_mpls_netlink.o"
340 AC_MSG_RESULT(Linux MPLS)
343 MPLS_METHOD="zebra_mpls_openbsd.o"
344 AC_MSG_RESULT(OpenBSD MPLS)
347 MPLS_METHOD="zebra_mpls_null.o"
348 AC_MSG_RESULT(Unsupported kernel)
351 AC_SUBST(MPLS_METHOD)
353 if test "${enable_cumulus}" = "yes" ; then
354 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
357 if test "${enable_shell_access}" = "yes"; then
358 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
361 if test "${enable_fpm}" = "yes"; then
362 AC_DEFINE(HAVE_FPM,,Forwarding Plane Manager support)
365 if test "x${enable_dev_build}" = "xyes"; then
366 AC_DEFINE(DEV_BUILD,,Build for development)
368 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
371 # Logic for protobuf support.
373 if test "$enable_protobuf" = "yes"; then
377 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
378 if test "x$PROTOC_C" = "x/bin/false"; then
382 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
383 [found_protobuf_c=yes],
384 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
386 if test "x$found_protobuf_c" = "xyes"; then
387 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
388 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
390 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
391 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
397 # Logic for old vpn commans support.
399 if test "$enable_old_vpn_commands" = "yes"; then
400 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
403 # Fail if the user explicity enabled protobuf support and we couldn't
404 # find the compiler or libraries.
405 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
406 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
409 if test "x$have_protobuf" = "xyes"; then
410 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
413 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
416 # End of logic for protobuf support.
419 if test "${enable_tcp_zebra}" = "yes"; then
420 AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
423 if test "${enable_linux24_tcp_md5}" = "yes"; then
424 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
427 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
428 if test "${enable_rtadv}" != "no"; then
430 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
435 if test "${enable_irdp}" = "yes"; then
436 AC_DEFINE(HAVE_IRDP,, IRDP )
439 if test x"${enable_user}" = x"no"; then
442 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
445 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
448 if test x"${enable_group}" = x"no"; then
451 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
454 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
457 if test x"${enable_vty_group}" = x"yes" ; then
458 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
459 elif test x"${enable_vty_group}" != x""; then
460 if test x"${enable_vty_group}" != x"no"; then
461 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
464 AC_SUBST([enable_user])
465 AC_SUBST([enable_group])
466 AC_SUBST([enable_vty_group])
468 enable_configfile_mask=${enable_configfile_mask:-0600}
469 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
471 enable_logfile_mask=${enable_logfile_mask:-0600}
472 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
476 case "${enable_multipath}" in
480 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
481 MPATH_NUM="${enable_multipath}"
486 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
490 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
492 dnl -----------------------------------
493 dnl Add extra version string to package
494 dnl name, string and version fields.
495 dnl -----------------------------------
496 if test "x${EXTRAVERSION}" != "x" ; then
497 VERSION="${VERSION}${EXTRAVERSION}"
498 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
499 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
500 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
503 if test "x$with_pkg_git_version" = "xyes"; then
504 if test -d "${srcdir}/.git"; then
505 AC_DEFINE(GIT_VERSION, [1], [include git version info])
506 else with_pkg_git_version="no"
507 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
510 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
512 dnl ------------------------------------
513 dnl Check C keywords and standard types
514 dnl ------------------------------------
525 dnl -------------------------
526 dnl Check other header files.
527 dnl -------------------------
528 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
529 linux/version.h asm/types.h \
532 dnl Utility macro to avoid retyping includes all the time
533 m4_define([FRR_INCLUDES],
536 #define __EXTENSIONS__
541 #include <sys/types.h>
542 /* sys/conf.h depends on param.h on FBSD at least */
543 #include <sys/param.h>
544 /* Required for MAXSIG */
546 #include <sys/socket.h>
548 # define __APPLE_USE_RFC_3542
550 #include <netinet/in.h>
551 #include <sys/time.h>
556 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
557 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
558 dnl an additional round for it.
560 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
562 m4_define([FRR_INCLUDES],
564 [#if HAVE_NET_IF_VAR_H
565 # include <net/if_var.h>
569 AC_CHECK_HEADERS([netinet/in_var.h \
570 net/if_dl.h net/netopt.h \
571 inet/nd.h netinet/ip_icmp.h \
572 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
573 [], [], FRR_INCLUDES)
575 AC_CHECK_HEADERS([ucontext.h], [], [],
578 #endif /* __USE_GNU */
582 m4_define([UCONTEXT_INCLUDES],
583 [#include <ucontext.h>])dnl
585 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
586 [], [], [UCONTEXT_INCLUDES])
587 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
588 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
589 [], [], [UCONTEXT_INCLUDES])],
590 [], [UCONTEXT_INCLUDES])
591 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
592 [], [], [UCONTEXT_INCLUDES])
594 m4_define([FRR_INCLUDES],
598 #include <netinet/in_systm.h>
599 #if HAVE_NETINET_IN_VAR_H
600 # include <netinet/in_var.h>
603 # include <net/if_dl.h>
605 #if HAVE_NET_NETOPT_H
606 # include <net/netopt.h>
608 #include <net/route.h>
610 # include <inet/nd.h>
612 #include <arpa/inet.h>
613 /* Required for IDRP */
614 #if HAVE_NETINET_IP_ICMP_H
615 # include <netinet/ip_icmp.h>
619 dnl V6 headers are checked below, after we check for v6
621 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
623 [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
625 AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
626 AC_DEFINE(SUNOS_5, 1, SunOS 5)
627 AC_CHECK_LIB(xnet, main)
632 | [*-sunos5.1[0-9]] \
633 | [*-sunos5.1[0-9].[0-9]] \
634 | [*-solaris2.[8-9]] \
635 | [*-solaris2.1[0-9]] \
636 | [*-solaris2.1[0-9].[0-9]])
638 AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
639 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
640 AC_CHECK_LIB(socket, main)
641 AC_CHECK_LIB(nsl, main)
642 AC_CHECK_LIB(umem, main)
643 AC_CHECK_FUNCS([printstack],
644 [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
645 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
650 *-sunos5* | *-solaris2*)
651 AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
652 AC_CHECK_LIB(socket, main)
653 AC_CHECK_LIB(nsl, main)
659 AC_DEFINE(GNU_LINUX,,GNU Linux)
663 AC_DEFINE(OPEN_BSD,,OpenBSD)
669 dnl ---------------------
670 dnl Integrated VTY option
671 dnl ---------------------
672 case "${enable_vtysh}" in
675 AC_DEFINE(VTYSH,,VTY shell)
676 dnl Vtysh uses libreadline, which looks for termcap functions at
677 dnl configure time. We follow readlines search order.
678 dnl The required procedures are in libtermcap on NetBSD, in
679 dnl [TODO] on Linux, and in [TODO] on Solaris.
680 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
681 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
682 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
683 [AC_CHECK_LIB(ncurses, tputs,
684 LIBREADLINE="$LIBREADLINE -lncurses")]
688 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
690 if test $ac_cv_lib_readline_main = no; then
691 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
693 AC_CHECK_HEADER(readline/history.h)
694 if test $ac_cv_header_readline_history_h = no;then
695 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
697 AC_CHECK_LIB(readline, rl_completion_matches,
698 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
699 if test $ac_cv_lib_readline_rl_completion_matches = no; then
700 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
704 AC_SUBST(LIBREADLINE)
705 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
710 dnl Quagga detects the PAM library it is built against by checking for a
711 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
712 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
713 dnl openpam.h doesn't do that, although depends on the header too. Hence a
714 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
717 if test "$with_libpam" = "yes"; then
718 AC_CHECK_HEADER([security/pam_misc.h],
719 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
720 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
721 pam_conv_func="misc_conv"
724 AC_CHECK_HEADER([security/openpam.h],
725 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
726 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
727 pam_conv_func="openpam_ttyconv"
729 [], FRR_INCLUDES[#include <security/pam_appl.h>])
730 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
731 AC_MSG_WARN([*** pam support will not be built ***])
736 if test "$with_libpam" = "yes"; then
737 dnl took this test from proftpds configure.in and suited to our needs
738 dnl -------------------------------------------------------------------------
740 dnl This next check looks funky due to a linker problem with some versions
741 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
742 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
743 dnl with RedHat 6.2 and Debian 2.2 or better.
744 AC_CHECK_LIB(pam, pam_start,
745 [AC_CHECK_LIB(pam, $pam_conv_func,
746 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
748 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
749 LIBPAM="-lpam -lpam_misc"]
753 [AC_CHECK_LIB(pam, pam_end,
754 [AC_CHECK_LIB(pam, $pam_conv_func,
755 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
756 LIBPAM="-lpam -ldl"],
757 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
758 LIBPAM="-lpam -ldl -lpam_misc"]
760 ],AC_MSG_WARN([*** pam support will not be built ***]),
767 dnl -------------------------------
768 dnl Endian-ness check
769 dnl -------------------------------
772 dnl -------------------------------
773 dnl check the size in byte of the C
774 dnl -------------------------------
775 dnl AC_CHECK_SIZEOF(char)
776 dnl AC_CHECK_SIZEOF(int)
777 dnl AC_CHECK_SIZEOF(short)
778 dnl AC_CHECK_SIZEOF(long)
780 dnl ----------------------------
781 dnl check existance of functions
782 dnl ----------------------------
788 dnl -------------------------------
789 dnl bgpd needs pow() and hence libm
790 dnl -------------------------------
792 AC_CHECK_HEADER([math.h],
793 [AC_CHECK_LIB([m], [pow],
796 AC_CHECK_FUNCS(pow,[],[LIBM=""])
799 if test x"$LIBM" = x ; then
800 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
813 AC_CHECK_HEADER([asm-generic/unistd.h],
814 [AC_CHECK_DECL(__NR_setns,
815 AC_DEFINE(HAVE_NETNS,, Have netns),,
816 FRR_INCLUDES [#include <asm-generic/unistd.h>
818 AC_CHECK_FUNCS(setns)]
821 dnl ------------------------------------
822 dnl Determine routing get and set method
823 dnl ------------------------------------
824 AC_MSG_CHECKING(zebra between kernel interface method)
825 if test x"$opsys" = x"gnu-linux"; then
826 AC_MSG_RESULT(netlink)
827 RT_METHOD=rt_netlink.o
828 KERNEL_METHOD=kernel_netlink.o
829 AC_DEFINE(HAVE_NETLINK,,netlink)
831 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
833 AC_MSG_RESULT(Route socket)
834 KERNEL_METHOD="kernel_socket.o"
835 RT_METHOD="rt_socket.o"
838 AC_SUBST(KERNEL_METHOD)
839 AM_CONDITIONAL([HAVE_NETLINK], [test "x$netlink" = "xyes"])
841 dnl --------------------------
842 dnl Determine IS-IS I/O method
843 dnl --------------------------
844 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
845 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
846 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
847 AC_CHECK_HEADER(net/bpf.h)
848 AC_CHECK_HEADER(sys/dlpi.h)
849 AC_MSG_CHECKING(zebra IS-IS I/O method)
850 if test x"$opsys" = x"gnu-linux"; then
851 AC_MSG_RESULT(pfpacket)
852 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
853 elif test x"$opsys" = x"sol2-6" -o x"$opsys" = x"sol8"; then
855 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
857 if test $ac_cv_header_net_bpf_h = no; then
858 if test $ac_cv_header_sys_dlpi_h = no; then
860 AC_MSG_WARN([*** IS-IS support will not be built ***])
865 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
868 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
871 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
873 dnl ------------------------------------
874 dnl check for broken CMSG_FIRSTHDR macro
875 dnl ------------------------------------
876 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
877 AC_RUN_IFELSE([AC_LANG_SOURCE([[
880 #define __EXTENSIONS__
883 #include <sys/types.h>
884 #include <sys/socket.h>
891 msg.msg_control = buf;
892 msg.msg_controllen = 0;
894 if (CMSG_FIRSTHDR(&msg) != NULL)
897 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
898 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
900 dnl ------------------------------
901 dnl check kernel route read method
902 dnl ------------------------------
903 AC_CACHE_CHECK([route read method], [frr_cv_rtread_method],
904 [if test "x$netlink" = xyes; then
905 frr_cv_rtread_method="netlink"
907 for frr_cv_rtread_method in /dev/ip /dev/null;
909 test x`ls $frr_cv_rtread_method 2>/dev/null` = x"$frr_cv_rtread_method" && break
911 case $frr_cv_rtread_method in
914 *-freebsd*) frr_cv_rtread_method="sysctl";;
915 *) frr_cv_rtread_method="getmsg";;
918 frr_cv_rtread_method="sysctl";;
921 RTREAD_METHOD=rtread_${frr_cv_rtread_method}.o
922 AC_SUBST(RTREAD_METHOD)
924 dnl -----------------------------
925 dnl check interface lookup method
926 dnl -----------------------------
928 AC_MSG_CHECKING(interface looking up method)
929 if test "$netlink" = yes; then
930 AC_MSG_RESULT(netlink)
931 IF_METHOD=if_netlink.o
932 elif test "$opsys" = "sol2-6";then
933 AC_MSG_RESULT(Solaris GIF)
935 elif test "$opsys" = "sol8";then
936 AC_MSG_RESULT(Solaris GLIF)
937 IF_METHOD=if_ioctl_solaris.o
938 IOCTL_METHOD=ioctl_solaris.o
939 elif test "$opsys" = "openbsd";then
940 AC_MSG_RESULT(openbsd)
942 elif grep NET_RT_IFLIST /usr/include/sys/socket.h >/dev/null 2>&1; then
943 AC_MSG_RESULT(sysctl)
944 IF_METHOD=if_sysctl.o
945 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
951 AC_SUBST(IOCTL_METHOD)
953 dnl ---------------------------------------------------------------
954 dnl figure out how to specify an interface in multicast sockets API
955 dnl ---------------------------------------------------------------
956 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
958 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
959 #include <sys/socket.h>
960 #include <netinet/in.h>
961 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
962 #include <linux/types.h>
965 m4_define([FRR_INCLUDES],
967 [#if HAVE_LINUX_MROUTE_H
968 # include <linux/mroute.h>
972 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
973 #include <sys/socket.h>
974 #include <sys/types.h>
975 #include <netinet/in.h>
976 #include <net/route.h>
979 m4_define([FRR_INCLUDES],
981 [#if HAVE_NETINET_IP_MROUTE_H
982 # include <netinet/ip_mroute.h>
986 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
987 AC_TRY_COMPILE([#include <sys/param.h>],
988 [#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)
991 #error No support for BSD struct ip_mreq hack detected
992 #endif],[AC_MSG_RESULT(yes)
993 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
996 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
998 #include <sys/types.h>
999 #include <netinet/in.h>
1000 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1001 ], [AC_MSG_RESULT(yes)
1002 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1005 dnl ---------------------------------------------------------------
1006 dnl figure out how to check link-state
1007 dnl ---------------------------------------------------------------
1008 AC_CHECK_HEADER( [net/if_media.h],
1009 [m4_define([LINK_DETECT_INCLUDES],
1011 [#include <net/if_media.h>
1013 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1014 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1015 [], LINK_DETECT_INCLUDES)],
1019 dnl ---------------------------------------------------------------
1020 dnl Additional, newer way to check link-state using ifi_link_state.
1021 dnl Not available in all BSD's when ifmediareq available
1022 dnl ---------------------------------------------------------------
1023 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1024 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1027 dnl ------------------------
1028 dnl TCP_MD5SIG socket option
1029 dnl ------------------------
1031 AC_CHECK_HEADER([netinet/tcp.h],
1032 [m4_define([MD5_INCLUDES],
1034 [#include <netinet/tcp.h>
1036 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1039 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1040 AC_CHECK_HEADER([linux/tcp.h],
1041 [m4_define([MD5_INCLUDES],
1043 [#include <linux/tcp.h>
1045 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1048 dnl -----------------------------
1049 dnl check ipforward detect method
1050 dnl -----------------------------
1051 AC_CACHE_CHECK([ipforward method], [frr_cv_ipforward_method],
1052 [if test x$cross_compiling = xyes; then
1053 if test x"$opsys" = x"gnu-linux"; then
1054 frr_cv_ipforward_method=/proc/net/snmp
1056 frr_cv_ipforward_method=/dev/ip
1059 for frr_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null;
1061 test x`ls $frr_cv_ipforward_method 2>/dev/null` = x"$frr_cv_ipforward_method" && break
1064 case $frr_cv_ipforward_method in
1065 "/proc/net/snmp") frr_cv_ipforward_method="proc";;
1068 *-freebsd*) frr_cv_ipforward_method="sysctl";;
1069 *) frr_cv_ipforward_method="solaris";;
1071 *) frr_cv_ipforward_method="sysctl";;
1073 IPFORWARD=ipforward_${frr_cv_ipforward_method}.o
1076 dnl ----------------------------------------------------------------------------
1077 dnl figure out if domainname is available in the utsname struct (GNU extension).
1078 dnl ----------------------------------------------------------------------------
1079 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1084 AC_MSG_CHECKING(whether does this OS have IPv6 stack)
1088 if grep WIDE /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1089 AC_DEFINE(KAME,1,KAME IPv6)
1091 dnl ------------------------------------
1092 dnl Solaris 9, 10 and potentially higher
1093 dnl ------------------------------------
1094 elif test x"$opsys" = x"sol8"; then
1095 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
1096 AC_MSG_RESULT(Solaris IPv6)
1100 elif test x"$opsys" = x"gnu-linux"; then
1101 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
1102 dnl Linux has a compilation problem with mixing
1103 dnl netinet/in.h and linux/in6.h they are not
1104 dnl compatible. There has been discussion on
1105 dnl how to fix it but no real progress on implementation
1106 dnl when they fix it, remove this
1107 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
1108 AC_MSG_RESULT(Linux IPv6)
1110 AC_MSG_ERROR([Failed to detect IPv6 stack])
1113 dnl ------------------
1114 dnl IPv6 header checks
1115 dnl ------------------
1116 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1117 netinet6/in6_var.h netinet6/nd6.h], [], [],
1120 m4_define([FRR_INCLUDES],dnl
1122 [#if HAVE_NETINET6_IN6_H
1123 #include <netinet6/in6.h>
1125 #if HAVE_NETINET_IN6_VAR_H
1126 #include <netinet/in6_var.h>
1128 #include <netinet/icmp6.h>
1129 #if HAVE_NETINET6_IN6_VAR_H
1130 # include <netinet6/in6_var.h>
1132 #if HAVE_NETINET6_ND6_H
1133 # include <netinet6/nd6.h>
1137 dnl disable doc check
1138 if test "${enable_doc}" = "no";then
1144 dnl --------------------
1145 dnl Daemon disable check
1146 dnl --------------------
1147 if test "${enable_zebra}" = "no";then
1152 AM_CONDITIONAL(ZEBRA, test "x$ZEBRA" = "xzebra")
1154 if test "${enable_bgpd}" = "no";then
1159 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1161 if test "${enable_ripd}" = "no";then
1166 AM_CONDITIONAL(RIPD, test "x$RIPD" = "xripd")
1168 if test "${enable_ospfd}" = "no";then
1173 AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd")
1175 if test "${enable_ldpd}" = "no";then
1178 AX_PROG_PERL_MODULES(XML::LibXML, , [
1179 if test -f "${srcdir}/ldpd/ldp_vty_cmds.c"; then
1180 AC_MSG_WARN([XML::LibXML perl module not found, using pregenerated ldp_vty_cmds.c])
1182 AC_MSG_ERROR([XML::LibXML perl module not found and pregenerated ldp_vty_cmds.c missing])
1187 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1189 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1192 if test "$opsys" = "gnu-linux"; then
1193 if test "${enable_nhrpd}" != "no"; then
1197 if test "${enable_nhrpd}" = "yes"; then
1198 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1201 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1203 if test "${enable_watchfrr}" = "no";then
1208 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1211 if test "${enable_ospfapi}" != "no";then
1212 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1214 if test "${enable_ospfclient}" != "no";then
1215 OSPFCLIENT="ospfclient"
1219 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1221 case "${enable_ripngd}" in
1223 * ) RIPNGD="ripngd";;
1225 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1227 case "${enable_ospf6d}" in
1229 * ) OSPF6D="ospf6d";;
1231 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1233 case "${enable_isisd}" in
1237 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1239 case "${enable_pimd}" in
1243 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1245 if test "${enable_bgp_announce}" = "no";then
1246 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1248 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1251 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1252 with_rfp_path="bgpd/rfp-example"
1254 if test "${with_rfp_path}" != "no"; then
1255 VNC_RFP_PATH="${with_rfp_path}"
1256 AC_SUBST(VNC_RFP_PATH)
1259 if test "${enable_bgp_vnc}" != "no";then
1260 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1261 RFPTEST="${with_rfp_path}/rfptest"
1262 LIBRFP="${with_rfp_path}/librfp"
1263 RFPINC="${with_rfp_path}/librfp"
1267 RFPINC="bgpd/rfp-example/librfp"
1270 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1290 AC_SUBST(OSPFCLIENT)
1292 AC_CHECK_LIB(crypt, crypt)
1293 AC_CHECK_LIB(resolv, res_init)
1295 dnl ---------------------------
1296 dnl check system has PCRE regexp
1297 dnl ---------------------------
1298 if test "x$enable_pcreposix" = "xyes"; then
1299 AC_CHECK_LIB(pcreposix, pcreposix_regexec, ,[enable_pcreposix=no
1300 AC_MSG_WARN([*** falling back to other regex library ***]) ])
1302 AC_SUBST(HAVE_LIBPCREPOSIX)
1304 dnl ------------------
1305 dnl check C-Ares library
1306 dnl ------------------
1307 if test "${NHRPD}" != ""; then
1308 PKG_CHECK_MODULES([CARES], [libcares])
1312 dnl ------------------
1313 dnl check Net-SNMP library
1314 dnl ------------------
1315 if test "${enable_snmp}" != ""; then
1316 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1317 if test x"$NETSNMP_CONFIG" = x"no"; then
1318 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1320 LIBS="$LIBS `${NETSNMP_CONFIG} --agent-libs`"
1321 CFLAGS="`${NETSNMP_CONFIG} --base-cflags` $CFLAGS"
1322 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1323 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1330 ])],[AC_MSG_RESULT(yes)],[
1332 AC_MSG_ERROR([--enable-snmp given but not usable])])
1333 AC_DEFINE(HAVE_SNMP,,SNMP)
1334 case "${enable_snmp}" in
1339 SNMP_METHOD="${enable_snmp}"
1342 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1345 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1346 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1347 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1350 dnl ---------------------------
1351 dnl sockaddr and netinet checks
1352 dnl ---------------------------
1355 struct vifctl, struct mfcctl, struct sioc_sg_req,
1356 vifi_t, struct sioc_vif_req, struct igmpmsg,
1357 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1358 struct nd_opt_adv_interval, struct rt_addrinfo,
1359 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1360 [], [], FRR_INCLUDES)
1362 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1363 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1364 struct sockaddr_dl.sdl_len,
1365 struct if6_aliasreq.ifra_lifetime,
1366 struct nd_opt_adv_interval.nd_opt_ai_type],
1367 [], [], FRR_INCLUDES)
1369 dnl ---------------------------
1370 dnl IRDP/pktinfo/icmphdr checks
1371 dnl ---------------------------
1372 AC_CHECK_TYPES([struct in_pktinfo],
1373 [AC_CHECK_TYPES([struct icmphdr],
1374 [if test "${enable_irdp}" != "no"; then
1375 AC_DEFINE(HAVE_IRDP,, IRDP)
1377 [if test "${enable_irdp}" = "yes"; then
1378 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1379 fi], [FRR_INCLUDES])],
1380 [if test "${enable_irdp}" = "yes"; then
1381 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1382 fi], [FRR_INCLUDES])
1384 dnl -----------------------
1385 dnl checking for IP_PKTINFO
1386 dnl -----------------------
1387 AC_MSG_CHECKING(for IP_PKTINFO)
1388 AC_TRY_COMPILE([#include <netdb.h>], [
1389 int opt = IP_PKTINFO;
1392 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1397 dnl ---------------------------
1398 dnl checking for IP_RECVDSTADDR
1399 dnl ---------------------------
1400 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1401 AC_TRY_COMPILE([#include <netinet/in.h>], [
1402 int opt = IP_RECVDSTADDR;
1405 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1410 dnl ----------------------
1411 dnl checking for IP_RECVIF
1412 dnl ----------------------
1413 AC_MSG_CHECKING(for IP_RECVIF)
1414 AC_TRY_COMPILE([#include <netinet/in.h>], [
1415 int opt = IP_RECVIF;
1418 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1423 dnl ----------------------
1424 dnl checking for SO_BINDANY
1425 dnl ----------------------
1426 AC_MSG_CHECKING(for SO_BINDANY)
1427 AC_TRY_COMPILE([#include <sys/socket.h>], [
1428 int opt = SO_BINDANY;
1431 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1436 dnl ----------------------
1437 dnl checking for IP_FREEBIND
1438 dnl ----------------------
1439 AC_MSG_CHECKING(for IP_FREEBIND)
1440 AC_TRY_COMPILE([#include <netinet/in.h>], [
1441 int opt = IP_FREEBIND;
1444 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1449 dnl --------------------------------------
1450 dnl checking for clock_time monotonic struct and call
1451 dnl --------------------------------------
1452 AC_CHECK_DECL(CLOCK_MONOTONIC,
1453 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1454 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1455 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1457 dnl --------------------------------------
1458 dnl checking for flex and bison
1459 dnl --------------------------------------
1462 AC_MSG_CHECKING(version of flex)
1463 quagga_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1464 quagga_ac_flex_version="${quagga_ac_flex_version##* }"
1465 AC_MSG_RESULT([$quagga_ac_flex_version])
1466 AX_COMPARE_VERSION([$quagga_ac_flex_version], [lt], [2.5.20], [
1467 LEX="$SHELL $missing_dir/missing flex"
1468 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1469 AC_MSG_WARN([using pregenerated flex output files])
1471 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1473 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1474 AC_SUBST([LEXLIB], [''])
1478 dnl thanks GNU bison for this b*llshit...
1479 AC_MSG_CHECKING(version of bison)
1480 quagga_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1481 quagga_ac_bison_version="${quagga_ac_bison_version##* }"
1482 quagga_ac_bison_missing="false"
1483 case "x${quagga_ac_bison_version}" in
1486 BISON_CLOSEBRACE='"'
1488 AC_MSG_RESULT([$quagga_ac_bison_version - 2.7 or older])
1491 AC_MSG_RESULT([$quagga_ac_bison_version])
1492 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1493 quagga_ac_bison_missing="true"
1496 AC_MSG_RESULT([none])
1497 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1498 quagga_ac_bison_missing="true"
1502 BISON_CLOSEBRACE='}'
1503 BISON_VERBOSE='-Dparse.error=verbose'
1504 AC_MSG_RESULT([$quagga_ac_bison_version - 3.0 or newer])
1507 AC_SUBST(BISON_OPENBRACE)
1508 AC_SUBST(BISON_CLOSEBRACE)
1509 AC_SUBST(BISON_VERBOSE)
1511 if $quagga_ac_bison_missing; then
1512 YACC="$SHELL $missing_dir/missing bison -y"
1513 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1514 AC_MSG_WARN([using pregenerated bison output files])
1516 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1520 dnl -------------------
1521 dnl capabilities checks
1522 dnl -------------------
1523 if test "${enable_capabilities}" != "no"; then
1524 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1525 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1527 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1528 frr_ac_keepcaps="yes"],
1531 if test x"${frr_ac_keepcaps}" = x"yes"; then
1532 AC_CHECK_HEADERS(sys/capability.h)
1534 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1535 AC_CHECK_LIB(cap, cap_init,
1536 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1541 AC_CHECK_HEADERS(priv.h,
1542 [AC_MSG_CHECKING(Solaris style privileges are available)
1543 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1545 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1546 frr_ac_scaps="yes"],
1552 if test x"${frr_ac_scaps}" = x"yes" \
1553 -o x"${frr_ac_lcaps}" = x"yes"; then
1554 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1559 dnl ---------------------------
1560 dnl check for glibc 'backtrace'
1561 dnl ---------------------------
1562 if test x"${enable_backtrace}" != x"no" ; then
1564 AC_CHECK_HEADER([execinfo.h], [
1565 AC_SEARCH_LIBS([backtrace], [execinfo], [
1566 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1567 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1572 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1573 dnl user explicitly requested backtrace but we failed to find support
1574 AC_MSG_FAILURE([failed to find backtrace support])
1578 dnl -----------------------------------------
1579 dnl check for malloc mallinfo struct and call
1580 dnl this must try and link using LIBS, in
1581 dnl order to check no alternative allocator
1582 dnl has been specified, which might not provide
1583 dnl mallinfo, e.g. such as Umem on Solaris.
1584 dnl -----------------------------------------
1585 AC_CHECK_HEADER([malloc.h],
1586 [AC_MSG_CHECKING(whether mallinfo is available)
1587 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1588 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1590 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1593 ], [], FRR_INCLUDES)
1598 CONFDATE=`date '+%Y%m%d'`
1601 dnl ------------------------------
1602 dnl set paths for state directory
1603 dnl ------------------------------
1604 AC_MSG_CHECKING(directory to use for state file)
1605 if test "${prefix}" = "NONE"; then
1606 frr_statedir_prefix="";
1608 frr_statedir_prefix=${prefix}
1610 if test "${localstatedir}" = '${prefix}/var'; then
1611 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1612 ${frr_statedir_prefix}/var/adm dnl
1613 ${frr_statedir_prefix}/etc dnl
1619 test -d $FRR_STATE_DIR && break
1621 frr_statedir=$FRR_STATE_DIR
1623 frr_statedir=${localstatedir}
1625 if test $frr_statedir = "/dev/null"; then
1626 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1628 AC_MSG_RESULT(${frr_statedir})
1629 AC_SUBST(frr_statedir)
1631 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1632 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1633 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1635 dnl autoconf does this, but it does it too late...
1636 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1637 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1639 dnl get the full path, recursing through variables...
1640 vtysh_bin="$bindir/vtysh"
1641 for I in 1 2 3 4 5 6 7 8 9 10; do
1642 eval vtysh_bin="\"$vtysh_bin\""
1644 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1646 CFG_SYSCONF="$sysconfdir"
1648 CFG_STATE="$frr_statedir"
1649 for I in 1 2 3 4 5 6 7 8 9 10; do
1650 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1651 eval CFG_SBIN="\"$CFG_SBIN\""
1652 eval CFG_STATE="\"$CFG_STATE\""
1654 AC_SUBST(CFG_SYSCONF)
1658 dnl ---------------------------
1659 dnl Check htonl works correctly
1660 dnl ---------------------------
1661 AC_MSG_CHECKING(for working htonl)
1662 AC_CACHE_VAL(ac_cv_htonl_works,
1663 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1664 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1667 AC_MSG_RESULT($ac_cv_htonl_works)
1669 AC_CONFIG_FILES([Makefile lib/Makefile qpb/Makefile zebra/Makefile ripd/Makefile
1670 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile
1671 ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile
1672 doc/Makefile ospfclient/Makefile tests/Makefile m4/Makefile
1682 snapcraft/snapcraft.yaml
1699 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1700 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh])
1702 if test "${enable_bgp_vnc}" != "no"; then
1703 if test "${with_rfp_path}" = "bgpd/rfp-example" ; then
1704 AC_CONFIG_FILES([bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile])
1706 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1710 AC_CONFIG_FILES([solaris/Makefile])
1712 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1714 ## Hack, but working solution to avoid rebuilding of quagga.info.
1715 ## It's already in CVS until texinfo 4.7 is more common.
1719 FreeRangeRouting configuration
1720 ------------------------------
1721 FRR version : ${PACKAGE_VERSION}
1722 host operating system : ${host_os}
1723 source code location : ${srcdir}
1725 compiler flags : ${CFLAGS}
1727 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1728 state file directory : ${frr_statedir}
1729 config file directory : `eval echo \`echo ${sysconfdir}\``
1730 example directory : `eval echo \`echo ${exampledir}\``
1731 user to run as : ${enable_user}
1732 group to run as : ${enable_group}
1733 group for vty sockets : ${enable_vty_group}
1734 config file mask : ${enable_configfile_mask}
1735 log file mask : ${enable_logfile_mask}
1736 zebra protobuf enabled : ${have_protobuf:-no}
1738 The above user and group must have read/write access to the state file
1739 directory and to the config files in the config file directory."