2 ## Configure template file for FRRouting.
3 ## autoconf will generate configure script.
5 ## Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
6 ## Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
10 AC_INIT(frr, 3.1-dev, [https://github.com/frrouting/frr/issues])
11 PACKAGE_URL="https://frrouting.org/"
13 PACKAGE_FULLNAME="FRRouting"
14 AC_SUBST(PACKAGE_FULLNAME)
16 CONFIG_ARGS="$ac_configure_args"
19 AC_CONFIG_SRCDIR(lib/zebra.h)
20 AC_CONFIG_MACRO_DIR([m4])
22 dnl -----------------------------------
23 dnl Get hostname and other information.
24 dnl -----------------------------------
28 AS_IF([test "$host" != "$build"], [
29 if test "$srcdir" = "."; then
30 AC_MSG_ERROR([cross-compilation is only possible with builddir separate from srcdir. create a separate directory and run as .../path-to-frr/configure.])
32 test -d hosttools || mkdir hosttools
33 abssrc="`cd \"${srcdir}\"; pwd`"
36 AC_MSG_NOTICE([... cross-compilation: creating hosttools directory and self-configuring for build platform tools])
37 AC_MSG_NOTICE([... use HOST_CPPFLAGS / HOST_CFLAGS / HOST_LDFLAGS if neccessary])
40 ( CPPFLAGS="$HOST_CPPFLAGS"; \
41 CFLAGS="$HOST_CFLAGS"; \
42 LDFLAGS="$HOST_LDFLAGS"; \
43 cd hosttools; "${abssrc}/configure" "--host=$build" "--build=$build"; )
46 AC_MSG_NOTICE([... cross-compilation: finished self-configuring for build platform tools])
50 HOSTTOOLS="hosttools/"
56 AM_CONDITIONAL([BUILD_CLIPPY], [$build_clippy])
58 # Disable portability warnings -- our automake code (in particular
59 # common.am) uses some constructs specific to gmake.
60 AM_INIT_AUTOMAKE([1.12 -Wno-portability])
61 m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
62 AM_SILENT_RULES([yes])
63 AC_CONFIG_HEADERS(config.h)
65 AC_PATH_PROG(PERL, perl)
68 dnl default is to match previous behavior
69 exampledir=${sysconfdir}
70 AC_ARG_ENABLE([exampledir],
71 AS_HELP_STRING([--enable-exampledir],
72 [specify alternate directory for examples]),
73 exampledir="$enableval",)
74 dnl XXX add --exampledir to autoconf standard directory list somehow
77 dnl default is to match previous behavior
79 AC_ARG_ENABLE([pkgsrcrcdir],
80 AS_HELP_STRING([--enable-pkgsrcrcdir],
81 [specify directory for rc.d scripts]),
82 pkgsrcrcdir="$enableval",)
83 dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
85 AM_CONDITIONAL([PKGSRC], [test "x$pkgsrcrcdir" != "x"])
87 AC_ARG_WITH([moduledir], [AS_HELP_STRING([--with-moduledir=DIR], [module directory (${libdir}/frr/modules)])], [
90 moduledir="\${libdir}/frr/modules"
92 AC_SUBST([moduledir], [$moduledir])
94 AC_ARG_ENABLE(tcmalloc,
95 AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
96 [case "${enableval}" in
97 yes) tcmalloc_enabled=true
98 LIBS="$LIBS -ltcmalloc_minimal"
100 no) tcmalloc_enabled=false ;;
101 *) AC_MSG_ERROR(bad value ${enableval} for --enable-tcmalloc) ;;
102 esac],[tcmalloc_enabled=false])
105 dnl Thanks autoconf, but we don't want a default -g -O2. We have our own
106 dnl flag determination logic.
109 dnl --------------------
110 dnl Check CC and friends
111 dnl --------------------
112 dnl note orig_cflags is also used further down
113 orig_cflags="$CFLAGS"
118 dnl remove autoconf default "-g -O2"
119 CFLAGS="$orig_cflags"
121 dnl NB: see C11 below
126 dnl autoconf 2.59 appears not to support AC_PROG_SED
128 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
130 dnl try and enable CFLAGS that are useful for FRR
131 dnl - specifically, options to control warnings
133 AC_USE_SYSTEM_EXTENSIONS
134 AC_DEFUN([AC_C_FLAG], [{
136 ac_c_flag_save="$CFLAGS"
138 AC_MSG_CHECKING([[whether $CC supports $1]])
140 [AC_LANG_PROGRAM([[]])],
143 m4_if([$3], [], [], [
144 CFLAGS="$ac_c_flag_save"
148 CFLAGS="$ac_c_flag_save"
155 AC_DEFUN([AC_LINK_IFELSE_FLAGS], [{
157 ac_cflags_save="$CFLAGS"
165 CFLAGS="$ac_cflags_save"
170 CFLAGS="$ac_cflags_save"
177 dnl ICC won't bail on unknown options without -diag-error 10006
178 dnl need to do this first so we get useful results for the other options
179 AC_C_FLAG([-diag-error 10006])
181 dnl AC_PROG_CC_C99 may change CC to include -std=gnu99 or something
183 CC="${CC% -std=gnu99}"
186 AC_C_FLAG([-std=gnu11], [CC="$ac_cc"], [CC="$CC -std=gnu11"])
188 dnl always want these CFLAGS
189 AC_C_FLAG([-fno-omit-frame-pointer])
190 AC_C_FLAG([-funwind-tables])
193 AC_C_FLAG([-Wmissing-prototypes])
194 AC_C_FLAG([-Wmissing-declarations])
195 AC_C_FLAG([-Wpointer-arith])
196 AC_C_FLAG([-Wbad-function-cast])
197 AC_C_FLAG([-Wwrite-strings])
198 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
199 AC_C_FLAG([-Wcast-qual])
200 AC_C_FLAG([-Wstrict-prototypes])
201 AC_C_FLAG([-Wmissing-noreturn])
202 AC_C_FLAG([-Wmissing-format-attribute])
203 AC_C_FLAG([-Wunreachable-code])
204 AC_C_FLAG([-Wpacked])
205 AC_C_FLAG([-Wpadded])
207 AC_C_FLAG([-Wno-unused-result])
209 AC_C_FLAG([-Wno-unused-parameter])
210 AC_C_FLAG([-Wno-missing-field-initializers])
212 dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
213 dnl for some reason the string consts get 'promoted' to char *,
214 dnl triggering a const to non-const conversion warning.
215 AC_C_FLAG([-diag-disable 3179])
217 if test x"${enable_werror}" = x"yes" ; then
222 dnl need link on this one, not compile
224 ac_ld_flag_save="$LDFLAGS"
225 LDFLAGS="$LDFLAGS -rdynamic"
226 AC_MSG_CHECKING([[whether linker supports -rdynamic]])
228 [AC_LANG_PROGRAM([[]])],
229 [AC_MSG_RESULT([yes])],
231 LDFLAGS="$ac_ld_flag_save"
242 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
243 LIBS="$PTHREAD_LIBS $LIBS"
245 AC_MSG_FAILURE([This FRR version needs pthreads])
254 AC_CHECK_TOOL(AR, ar)
256 dnl -----------------
257 dnl System extensions
258 dnl -----------------
266 dnl ----------------------
267 dnl Packages configuration
268 dnl ----------------------
269 AC_ARG_WITH(pkg-extra-version,
270 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]),
271 [EXTRAVERSION=$withval],)
272 AC_ARG_WITH(pkg-git-version,
273 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
274 [ test "x$withval" != "xno" && with_pkg_git_version="yes" ])
275 AC_ARG_WITH(vtysh_pager,
276 AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
277 VTYSH_PAGER=$withval, VTYSH_PAGER="more")
279 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for FRR]))
281 AS_HELP_STRING([--disable-doc], [do not build docs]))
283 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
285 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
287 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
288 AC_ARG_ENABLE(ripngd,
289 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
291 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
292 AC_ARG_ENABLE(ospf6d,
293 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
295 AS_HELP_STRING([--enable-ldpd], [build ldpd]))
297 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
298 AC_ARG_ENABLE(eigrpd,
299 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
300 AC_ARG_ENABLE(babeld,
301 AS_HELP_STRING([--disable-babeld], [do not build babeld]))
302 AC_ARG_ENABLE(watchfrr,
303 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
305 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
307 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
308 AC_ARG_ENABLE(bgp-announce,
309 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
310 AC_ARG_ENABLE(bgp-vnc,
311 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
312 AC_ARG_WITH(rfp-path,
313 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
315 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
316 AC_ARG_ENABLE(zeromq,
317 AS_HELP_STRING([--enable-zeromq], [enable ZeroMQ handler (libfrrzmq)]))
319 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
320 AC_ARG_ENABLE(ospfapi,
321 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
322 AC_ARG_ENABLE(ospfclient,
323 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
324 (this is the default if --disable-ospfapi is set)]))
325 AC_ARG_ENABLE(multipath,
326 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
328 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
330 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
331 AC_ARG_ENABLE(vty_group,
332 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
333 AC_ARG_ENABLE(configfile_mask,
334 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
335 AC_ARG_ENABLE(logfile_mask,
336 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
337 AC_ARG_ENABLE(shell_access,
338 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
340 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
342 AS_HELP_STRING([--disable-irdp], [enable IRDP server support in zebra (default if supported)]))
343 AC_ARG_ENABLE(capabilities,
344 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
345 AC_ARG_ENABLE(rusage,
346 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
347 AC_ARG_ENABLE(gcc_ultra_verbose,
348 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
349 AC_ARG_ENABLE(linux24_tcp_md5,
350 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
351 AC_ARG_ENABLE(backtrace,
352 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
353 AC_ARG_ENABLE(time-check,
354 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
355 AC_ARG_ENABLE(pcreposix,
356 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
358 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
359 AC_ARG_ENABLE(systemd,
360 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
361 AC_ARG_ENABLE(werror,
362 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
363 AC_ARG_ENABLE(cumulus,
364 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
365 AC_ARG_ENABLE(datacenter,
366 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
367 AC_ARG_ENABLE(rr-semantics,
368 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
369 AC_ARG_ENABLE([protobuf],
370 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
371 AC_ARG_ENABLE([oldvpn_commands],
372 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
374 AC_CHECK_HEADERS(json-c/json.h)
375 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c", [], [-lm])
376 if test $ac_cv_lib_json_c_json_object_get = no; then
377 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
378 if test $ac_cv_lib_json_json_object_get = no; then
379 AC_MSG_ERROR([lib json is needed to compile])
383 AC_ARG_ENABLE([dev_build],
384 AS_HELP_STRING([--enable-dev-build], [build for development]))
386 if test x"${enable_time_check}" != x"no" ; then
387 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
388 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
390 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
394 case "${enable_systemd}" in
397 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
398 if test $ac_cv_lib_systemd_sd_notify = no; then
399 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
401 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
407 if test "${enable_rr_semantics}" != "no" ; then
408 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
411 if test "${enable_datacenter}" = "yes" ; then
412 AC_DEFINE(HAVE_DATACENTER,,Compile extensions for a DataCenter)
413 DFLT_NAME="datacenter"
415 DFLT_NAME="traditional"
418 if test "${enable_cumulus}" = "yes" ; then
419 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
423 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
425 if test "${enable_shell_access}" = "yes"; then
426 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
429 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
431 if test "x${enable_dev_build}" = "xyes"; then
432 AC_DEFINE(DEV_BUILD,,Build for development)
436 dnl if the user specified any CFLAGS, we don't add "-g -Os/-O2" here
437 if test "z$orig_cflags" = "z"; then
444 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
449 AS_IF([test "$host" = "$build"], [
453 # 1. try python3, but respect the user's preference on which minor ver
454 # 2. try python, which might be py3 or py2 again on the user's preference
455 # 3. try python2 (can really only be 2.7 but eh)
456 # 4. try 3.5 > 3.4 > 3.3 > 3.2 > 2.7 through pkg-config (no user pref)
458 # (AX_PYTHON_DEVEL has no clue about py3 vs py2)
459 # (AX_PYTHON does not do what we need)
461 AC_CHECK_TOOLS([PYTHONCONFIG], [python3-config python-config python2-config])
462 if test -n "$PYTHONCONFIG"; then
463 PYTHON_CFLAGS="`\"${PYTHONCONFIG}\" --includes`"
464 PYTHON_LIBS="`\"${PYTHONCONFIG}\" --libs`"
466 AC_MSG_CHECKING([whether we found a working Python version])
467 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
469 #if PY_VERSION_HEX < 0x02070000
470 #error python too old
486 if test -z "$PYTHONCONFIG"; then
487 PKG_CHECK_MODULES([PYTHON], python-3.5, [], [
488 PKG_CHECK_MODULES([PYTHON], python-3.4, [], [
489 PKG_CHECK_MODULES([PYTHON], python-3.3, [], [
490 PKG_CHECK_MODULES([PYTHON], python-3.2, [], [
491 PKG_CHECK_MODULES([PYTHON], python-2.7, [], [
492 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
496 AC_MSG_CHECKING([whether we found a working Python version])
497 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
499 #if PY_VERSION_HEX < 0x02070000
500 #error python too old
510 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
514 AC_SUBST(PYTHON_CFLAGS)
515 AC_SUBST(PYTHON_LIBS)
518 # Logic for protobuf support.
520 if test "$enable_protobuf" = "yes"; then
524 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
525 if test "x$PROTOC_C" = "x/bin/false"; then
529 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
530 [found_protobuf_c=yes],
531 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
533 if test "x$found_protobuf_c" = "xyes"; then
534 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
535 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
537 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
538 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
544 # Logic for old vpn commans support.
546 if test "$enable_oldvpn_commands" = "yes"; then
547 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
550 # Fail if the user explicity enabled protobuf support and we couldn't
551 # find the compiler or libraries.
552 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
553 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
556 if test "x$have_protobuf" = "xyes"; then
557 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
560 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
563 # End of logic for protobuf support.
566 if test "${enable_linux24_tcp_md5}" = "yes"; then
567 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
570 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
571 if test "${enable_rtadv}" != "no"; then
573 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
578 if test x"${enable_user}" = x"no"; then
581 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
584 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
587 if test x"${enable_group}" = x"no"; then
590 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
593 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
596 if test x"${enable_vty_group}" = x"yes" ; then
597 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
598 elif test x"${enable_vty_group}" != x""; then
599 if test x"${enable_vty_group}" != x"no"; then
600 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
603 AC_SUBST([enable_user])
604 AC_SUBST([enable_group])
605 AC_SUBST([enable_vty_group])
607 enable_configfile_mask=${enable_configfile_mask:-0600}
608 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
610 enable_logfile_mask=${enable_logfile_mask:-0600}
611 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
615 case "${enable_multipath}" in
619 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
620 MPATH_NUM="${enable_multipath}"
625 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
629 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
631 AC_DEFINE_UNQUOTED(VTYSH_PAGER, "$VTYSH_PAGER", [What pager to use])
633 dnl -----------------------------------
634 dnl Add extra version string to package
635 dnl name, string and version fields.
636 dnl -----------------------------------
637 if test "x${EXTRAVERSION}" != "x" ; then
638 VERSION="${VERSION}${EXTRAVERSION}"
639 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
640 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
641 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
644 if test "x$with_pkg_git_version" = "xyes"; then
645 if test -d "${srcdir}/.git"; then
646 AC_DEFINE(GIT_VERSION, [1], [include git version info])
647 else with_pkg_git_version="no"
648 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
651 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
653 dnl ------------------------------------
654 dnl Check C keywords and standard types
655 dnl ------------------------------------
666 dnl -------------------------
667 dnl Check other header files.
668 dnl -------------------------
669 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
670 linux/version.h asm/types.h \
673 ac_stdatomic_ok=false
674 AC_DEFINE(FRR_AUTOCONF_ATOMIC, 1, [did autoconf checks for atomic funcs])
675 AC_CHECK_HEADER([stdatomic.h],[
677 AC_MSG_CHECKING([whether _Atomic qualifier works])
678 AC_LINK_IFELSE([AC_LANG_SOURCE([[
679 #include <stdatomic.h>
680 int main(int argc, char **argv) {
685 AC_DEFINE(HAVE_STDATOMIC_H, 1, [found stdatomic.h])
693 AS_IF([$ac_stdatomic_ok], [true], [
694 AC_MSG_CHECKING([for __atomic_* builtins])
695 AC_LINK_IFELSE([AC_LANG_SOURCE([[
696 int main(int argc, char **argv) {
698 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
699 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
702 AC_DEFINE(HAVE___ATOMIC, 1, [found __atomic builtins])
707 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
708 AC_MSG_CHECKING([for __sync_* builtins])
709 AC_LINK_IFELSE([AC_LANG_SOURCE([[
710 int main(int argc, char **argv) {
712 __sync_fetch_and_sub (&i, 1);
713 return __sync_val_compare_and_swap (&i, 0, 1);
716 AC_DEFINE(HAVE___SYNC, 1, [found __sync builtins])
719 AC_MSG_CHECKING([for __sync_swap builtin])
720 AC_LINK_IFELSE([AC_LANG_SOURCE([[
721 int main(int argc, char **argv) {
723 return __sync_swap (&i, 2);
726 AC_DEFINE(HAVE___SYNC_SWAP, 1, [found __sync_swap builtin])
734 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
739 dnl Utility macro to avoid retyping includes all the time
740 m4_define([FRR_INCLUDES],
743 #define __EXTENSIONS__
748 #include <sys/types.h>
749 /* sys/conf.h depends on param.h on FBSD at least */
750 #include <sys/param.h>
751 /* Required for MAXSIG */
753 #include <sys/socket.h>
755 # define __APPLE_USE_RFC_3542
757 #include <netinet/in.h>
758 #include <sys/time.h>
763 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
764 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
765 dnl an additional round for it.
767 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
769 m4_define([FRR_INCLUDES],
771 [#if HAVE_NET_IF_VAR_H
772 # include <net/if_var.h>
776 AC_CHECK_HEADERS([netinet/in_var.h \
777 net/if_dl.h net/netopt.h \
778 inet/nd.h netinet/ip_icmp.h \
779 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
780 [], [], FRR_INCLUDES)
782 AC_CHECK_HEADERS([ucontext.h], [], [],
785 #endif /* __USE_GNU */
789 m4_define([UCONTEXT_INCLUDES],
790 [#include <ucontext.h>])dnl
792 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
793 [], [], [UCONTEXT_INCLUDES])
794 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
795 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
796 [], [], [UCONTEXT_INCLUDES])],
797 [], [UCONTEXT_INCLUDES])
798 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
799 [], [], [UCONTEXT_INCLUDES])
801 m4_define([FRR_INCLUDES],
805 #include <netinet/in_systm.h>
806 #if HAVE_NETINET_IN_VAR_H
807 # include <netinet/in_var.h>
810 # include <net/if_dl.h>
812 #if HAVE_NET_NETOPT_H
813 # include <net/netopt.h>
815 #include <net/route.h>
817 # include <inet/nd.h>
819 #include <arpa/inet.h>
820 /* Required for IDRP */
821 #if HAVE_NETINET_IP_ICMP_H
822 # include <netinet/ip_icmp.h>
826 dnl V6 headers are checked below, after we check for v6
828 AC_MSG_CHECKING([which operating system interface to use])
831 AC_MSG_RESULT([Solaris])
833 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
834 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
836 AC_CHECK_LIB(socket, main)
837 AC_CHECK_LIB(nsl, main)
838 AC_CHECK_LIB(umem, main)
839 AC_CHECK_FUNCS([printstack], [
840 AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
841 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
847 AC_MSG_RESULT([Linux])
849 AC_DEFINE(GNU_LINUX,,GNU Linux)
850 AC_DEFINE(HAVE_NETLINK,,netlink)
851 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
853 dnl Linux has a compilation problem with mixing
854 dnl netinet/in.h and linux/in6.h they are not
855 dnl compatible. There has been discussion on
856 dnl how to fix it but no real progress on implementation
857 dnl when they fix it, remove this
858 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
860 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
863 AC_MSG_RESULT([OpenBSD])
865 AC_DEFINE(OPEN_BSD,,OpenBSD)
866 AC_DEFINE(KAME,1,KAME IPv6)
868 if test "x${enable_pimd}" != "xno"; then
873 AC_MSG_FAILURE([pimd cannot be enabled as PIM support has been removed from OpenBSD 6.1])
881 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
882 AC_DEFINE(KAME,1,KAME IPv6)
885 AM_CONDITIONAL(SOLARIS, test "${SOLARIS}" = "solaris")
889 dnl ---------------------
890 dnl Integrated VTY option
891 dnl ---------------------
892 case "${enable_vtysh}" in
895 AC_DEFINE(VTYSH,,VTY shell)
896 dnl Vtysh uses libreadline, which looks for termcap functions at
897 dnl configure time. We follow readlines search order.
898 dnl The required procedures are in libtermcap on NetBSD, in
899 dnl [TODO] on Linux, and in [TODO] on Solaris.
900 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
901 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
902 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
903 [AC_CHECK_LIB(ncurses, tputs,
904 LIBREADLINE="$LIBREADLINE -lncurses")]
908 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
910 if test $ac_cv_lib_readline_main = no; then
911 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
913 AC_CHECK_HEADER(readline/history.h)
914 if test $ac_cv_header_readline_history_h = no;then
915 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
917 AC_CHECK_LIB(readline, rl_completion_matches,
918 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
919 if test $ac_cv_lib_readline_rl_completion_matches = no; then
920 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
924 AC_SUBST(LIBREADLINE)
925 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
930 dnl FRR detects the PAM library it is built against by checking for a
931 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
932 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
933 dnl openpam.h doesn't do that, although depends on the header too. Hence a
934 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
937 if test "$with_libpam" = "yes"; then
938 AC_CHECK_HEADER([security/pam_misc.h],
939 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
940 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
941 pam_conv_func="misc_conv"
944 AC_CHECK_HEADER([security/openpam.h],
945 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
946 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
947 pam_conv_func="openpam_ttyconv"
949 [], FRR_INCLUDES[#include <security/pam_appl.h>])
950 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
951 AC_MSG_WARN([*** pam support will not be built ***])
956 if test "$with_libpam" = "yes"; then
957 dnl took this test from proftpds configure.in and suited to our needs
958 dnl -------------------------------------------------------------------------
960 dnl This next check looks funky due to a linker problem with some versions
961 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
962 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
963 dnl with RedHat 6.2 and Debian 2.2 or better.
964 AC_CHECK_LIB(pam, pam_start,
965 [AC_CHECK_LIB(pam, $pam_conv_func,
966 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
968 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
969 LIBPAM="-lpam -lpam_misc"]
973 [AC_CHECK_LIB(pam, pam_end,
974 [AC_CHECK_LIB(pam, $pam_conv_func,
975 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
976 LIBPAM="-lpam -ldl"],
977 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
978 LIBPAM="-lpam -ldl -lpam_misc"]
980 ],AC_MSG_WARN([*** pam support will not be built ***]),
987 dnl -------------------------------
988 dnl Endian-ness check
989 dnl -------------------------------
992 dnl -------------------------------
993 dnl check the size in byte of the C
994 dnl -------------------------------
995 dnl AC_CHECK_SIZEOF(char)
996 dnl AC_CHECK_SIZEOF(int)
997 dnl AC_CHECK_SIZEOF(short)
998 dnl AC_CHECK_SIZEOF(long)
1000 dnl ----------------------------
1001 dnl check existance of functions
1002 dnl ----------------------------
1008 dnl -------------------------------
1009 dnl bgpd needs pow() and hence libm
1010 dnl -------------------------------
1012 AC_CHECK_HEADER([math.h],
1013 [AC_CHECK_LIB([m], [pow],
1016 AC_CHECK_FUNCS(pow,[],[LIBM=""])
1019 if test x"$LIBM" = x ; then
1020 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1025 AC_CHECK_FUNCS([ppoll], [
1026 AC_DEFINE([HAVE_PPOLL], 1, [have Linux/BSD ppoll()])
1028 AC_CHECK_FUNCS([pollts], [
1029 AC_DEFINE([HAVE_POLLTS], 1, [have NetBSD pollts()])
1039 AC_CHECK_HEADER([asm-generic/unistd.h],
1040 [AC_CHECK_DECL(__NR_setns,
1041 AC_DEFINE(HAVE_NETNS,, Have netns),,
1042 FRR_INCLUDES [#include <asm-generic/unistd.h>
1044 AC_CHECK_FUNCS(setns)]
1047 dnl --------------------------
1048 dnl Determine IS-IS I/O method
1049 dnl --------------------------
1050 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
1051 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
1052 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
1053 AC_CHECK_HEADER(net/bpf.h)
1054 AC_CHECK_HEADER(sys/dlpi.h)
1055 AC_MSG_CHECKING(zebra IS-IS I/O method)
1059 AC_MSG_RESULT(pfpacket)
1060 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1064 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1067 if test $ac_cv_header_net_bpf_h = no; then
1068 if test $ac_cv_header_sys_dlpi_h = no; then
1070 if test "${enable_isisd}" = yes; then
1071 AC_MSG_FAILURE([IS-IS support requested but no packet backend found])
1073 AC_MSG_WARN([*** IS-IS support will not be built ***])
1078 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1081 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
1085 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
1087 dnl ------------------------------------
1088 dnl check for broken CMSG_FIRSTHDR macro
1089 dnl ------------------------------------
1090 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
1091 AC_RUN_IFELSE([AC_LANG_SOURCE([[
1094 #define __EXTENSIONS__
1097 #include <sys/types.h>
1098 #include <sys/socket.h>
1105 msg.msg_control = buf;
1106 msg.msg_controllen = 0;
1108 if (CMSG_FIRSTHDR(&msg) != NULL)
1111 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
1112 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
1114 dnl ---------------------------------------------------------------
1115 dnl figure out how to specify an interface in multicast sockets API
1116 dnl ---------------------------------------------------------------
1117 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1119 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1120 #include <sys/socket.h>
1121 #include <netinet/in.h>
1122 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1123 #include <linux/types.h>
1126 m4_define([FRR_INCLUDES],
1128 [#if HAVE_LINUX_MROUTE_H
1129 # include <linux/mroute.h>
1133 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1134 #include <sys/socket.h>
1135 #include <sys/types.h>
1136 #include <netinet/in.h>
1137 #include <net/route.h>
1140 m4_define([FRR_INCLUDES],
1142 [#if HAVE_NETINET_IP_MROUTE_H
1143 # include <netinet/ip_mroute.h>
1147 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1148 AC_TRY_COMPILE([#include <sys/param.h>],
1149 [#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)
1152 #error No support for BSD struct ip_mreq hack detected
1153 #endif],[AC_MSG_RESULT(yes)
1154 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1157 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1159 #include <sys/types.h>
1160 #include <netinet/in.h>
1161 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1162 ], [AC_MSG_RESULT(yes)
1163 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1166 dnl ---------------------------------------------------------------
1167 dnl figure out how to check link-state
1168 dnl ---------------------------------------------------------------
1169 AC_CHECK_HEADER( [net/if_media.h],
1170 [m4_define([LINK_DETECT_INCLUDES],
1172 [#include <net/if_media.h>
1174 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1175 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1176 [], LINK_DETECT_INCLUDES)],
1180 dnl ---------------------------------------------------------------
1181 dnl Additional, newer way to check link-state using ifi_link_state.
1182 dnl Not available in all BSD's when ifmediareq available
1183 dnl ---------------------------------------------------------------
1184 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1185 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1188 dnl ------------------------
1189 dnl TCP_MD5SIG socket option
1190 dnl ------------------------
1192 AC_CHECK_HEADER([netinet/tcp.h],
1193 [m4_define([MD5_INCLUDES],
1195 [#include <netinet/tcp.h>
1197 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1200 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1201 AC_CHECK_HEADER([linux/tcp.h],
1202 [m4_define([MD5_INCLUDES],
1204 [#include <linux/tcp.h>
1206 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1209 dnl ----------------------------------------------------------------------------
1210 dnl figure out if domainname is available in the utsname struct (GNU extension).
1211 dnl ----------------------------------------------------------------------------
1212 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1214 dnl ------------------
1215 dnl IPv6 header checks
1216 dnl ------------------
1217 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1218 netinet6/in6_var.h netinet6/nd6.h], [], [],
1221 m4_define([FRR_INCLUDES],dnl
1223 [#if HAVE_NETINET6_IN6_H
1224 #include <netinet6/in6.h>
1226 #if HAVE_NETINET_IN6_VAR_H
1227 #include <netinet/in6_var.h>
1229 #include <netinet/icmp6.h>
1230 #if HAVE_NETINET6_IN6_VAR_H
1231 # include <netinet6/in6_var.h>
1233 #if HAVE_NETINET6_ND6_H
1234 # include <netinet6/nd6.h>
1238 dnl disable doc check
1239 if test "${enable_doc}" = "no";then
1245 dnl --------------------
1246 dnl Daemon disable check
1247 dnl --------------------
1248 AM_CONDITIONAL(ZEBRA, test "${enable_zebra}" != "no")
1250 if test "${enable_bgpd}" = "no";then
1255 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1257 AM_CONDITIONAL(RIPD, test "${enable_ripd}" != "no")
1258 AM_CONDITIONAL(OSPFD, test "${enable_ospfd}" != "no")
1259 AM_CONDITIONAL(LDPD, test "${enable_ldpd}" != "no")
1261 AS_IF([test "${enable_ldpd}" != "no"], [
1262 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1268 if test "${enable_nhrpd}" != "no"; then
1273 if test "${enable_nhrpd}" = "yes"; then
1274 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1278 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1280 AM_CONDITIONAL(EIGRPD, test "${enable_eigrpd}" != "no")
1282 if test "${enable_watchfrr}" = "no";then
1287 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1290 if test "${enable_ospfapi}" != "no";then
1291 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1293 if test "${enable_ospfclient}" != "no";then
1294 OSPFCLIENT="ospfclient"
1298 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1299 AM_CONDITIONAL(RIPNGD, test "${enable_ripngd}" != "no")
1300 AM_CONDITIONAL(BABELD, test "${enable_babeld}" != "no")
1301 AM_CONDITIONAL(OSPF6D, test "${enable_ospf6d}" != "no")
1302 AM_CONDITIONAL(ISISD, test "${enable_isisd}" != "no")
1303 AM_CONDITIONAL(PIMD, test "${enable_pimd}" != "no")
1305 if test "${enable_bgp_announce}" = "no";then
1306 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1308 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1311 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1312 with_rfp_path="bgpd/rfp-example"
1314 if test "${with_rfp_path}" != "no"; then
1315 VNC_RFP_PATH="${with_rfp_path}"
1316 AC_SUBST(VNC_RFP_PATH)
1319 if test "${enable_bgp_vnc}" != "no";then
1320 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1321 RFPTEST="${with_rfp_path}/rfptest"
1322 LIBRFP="${with_rfp_path}/librfp"
1323 RFPINC="${with_rfp_path}/librfp"
1327 RFPINC="bgpd/rfp-example/librfp"
1330 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1340 AC_CHECK_LIB(crypt, crypt, [],
1341 [AC_CHECK_LIB(crypto, DES_crypt)])
1342 AC_CHECK_LIB(resolv, res_init)
1344 dnl ---------------------------
1345 dnl check system has PCRE regexp
1346 dnl ---------------------------
1347 if test "x$enable_pcreposix" = "xyes"; then
1348 AC_CHECK_LIB(pcreposix, regexec, [], [
1349 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1352 AC_SUBST(HAVE_LIBPCREPOSIX)
1354 dnl ------------------
1355 dnl check C-Ares library
1356 dnl ------------------
1357 if test "${NHRPD}" != ""; then
1358 PKG_CHECK_MODULES([CARES], [libcares], , [
1359 AC_MSG_ERROR([trying to build nhrpd, but libcares not found. install c-ares and its -dev headers.])
1364 dnl ------------------
1365 dnl check Net-SNMP library
1366 dnl ------------------
1367 if test "${enable_snmp}" != "" -a "${enable_snmp}" != "no"; then
1368 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1369 if test x"$NETSNMP_CONFIG" = x"no"; then
1370 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1372 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1373 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1374 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1375 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
1383 AC_MSG_ERROR([--enable-snmp given but not usable])])
1384 case "${enable_snmp}" in
1389 SNMP_METHOD="${enable_snmp}"
1392 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1395 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1396 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1397 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1399 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1401 AC_SUBST(SNMP_CFLAGS)
1406 AC_SEARCH_LIBS([sqrt], [m])
1411 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1412 AC_MSG_ERROR([unable to find the dlopen()])
1415 AC_CHECK_HEADERS([link.h])
1417 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1418 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1426 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1429 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1434 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1435 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1442 struct link_map *lm = NULL;
1443 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1446 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1452 AM_CONDITIONAL(SNMP, test "x$SNMP_METHOD" = "xagentx")
1454 dnl ---------------------------
1455 dnl sockaddr and netinet checks
1456 dnl ---------------------------
1459 struct vifctl, struct mfcctl, struct sioc_sg_req,
1460 vifi_t, struct sioc_vif_req, struct igmpmsg,
1461 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1462 struct nd_opt_adv_interval, struct rt_addrinfo,
1463 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1464 [], [], FRR_INCLUDES)
1466 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1467 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1468 struct sockaddr_dl.sdl_len,
1469 struct if6_aliasreq.ifra_lifetime,
1470 struct nd_opt_adv_interval.nd_opt_ai_type],
1471 [], [], FRR_INCLUDES)
1473 dnl ---------------------------
1474 dnl IRDP/pktinfo/icmphdr checks
1475 dnl ---------------------------
1477 AC_CHECK_TYPES([struct in_pktinfo], [
1478 AC_CHECK_TYPES([struct icmphdr], [
1487 case "${enable_irdp}" in
1489 $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1496 AM_CONDITIONAL(IRDP, $IRDP)
1498 dnl -----------------------
1499 dnl checking for IP_PKTINFO
1500 dnl -----------------------
1501 AC_MSG_CHECKING(for IP_PKTINFO)
1502 AC_TRY_COMPILE([#include <netdb.h>], [
1503 int opt = IP_PKTINFO;
1506 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1511 dnl ---------------------------
1512 dnl checking for IP_RECVDSTADDR
1513 dnl ---------------------------
1514 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1515 AC_TRY_COMPILE([#include <netinet/in.h>], [
1516 int opt = IP_RECVDSTADDR;
1519 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1524 dnl ----------------------
1525 dnl checking for IP_RECVIF
1526 dnl ----------------------
1527 AC_MSG_CHECKING(for IP_RECVIF)
1528 AC_TRY_COMPILE([#include <netinet/in.h>], [
1529 int opt = IP_RECVIF;
1532 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1537 dnl ----------------------
1538 dnl checking for SO_BINDANY
1539 dnl ----------------------
1540 AC_MSG_CHECKING(for SO_BINDANY)
1541 AC_TRY_COMPILE([#include <sys/socket.h>], [
1542 int opt = SO_BINDANY;
1545 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1550 dnl ----------------------
1551 dnl checking for IP_FREEBIND
1552 dnl ----------------------
1553 AC_MSG_CHECKING(for IP_FREEBIND)
1554 AC_TRY_COMPILE([#include <netinet/in.h>], [
1555 int opt = IP_FREEBIND;
1558 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1563 dnl --------------------------------------
1564 dnl checking for be32dec existence or not
1565 dnl --------------------------------------
1566 AC_CHECK_DECLS([be32enc, be32dec], [], [],
1567 [#include <sys/endian.h>])
1569 dnl --------------------------------------
1570 dnl checking for clock_time monotonic struct and call
1571 dnl --------------------------------------
1572 AC_CHECK_DECL(CLOCK_MONOTONIC,
1573 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1574 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1575 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1577 dnl --------------------------------------
1578 dnl checking for flex and bison
1579 dnl --------------------------------------
1582 AC_MSG_CHECKING(version of flex)
1583 frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1584 frr_ac_flex_version="${frr_ac_flex_version##* }"
1585 AC_MSG_RESULT([$frr_ac_flex_version])
1586 AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
1587 LEX="$SHELL $missing_dir/missing flex"
1588 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1589 AC_MSG_WARN([using pregenerated flex output files])
1591 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1593 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1594 AC_SUBST([LEXLIB], [''])
1598 dnl thanks GNU bison for this b*llshit...
1599 AC_MSG_CHECKING(version of bison)
1600 frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1601 frr_ac_bison_version="${frr_ac_bison_version##* }"
1602 frr_ac_bison_missing="false"
1603 case "x${frr_ac_bison_version}" in
1606 BISON_CLOSEBRACE='"'
1608 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
1611 AC_MSG_RESULT([$frr_ac_bison_version])
1612 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1613 frr_ac_bison_missing="true"
1616 AC_MSG_RESULT([none])
1617 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1618 frr_ac_bison_missing="true"
1622 BISON_CLOSEBRACE='}'
1623 BISON_VERBOSE='-Dparse.error=verbose'
1624 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 or newer])
1627 AC_SUBST(BISON_OPENBRACE)
1628 AC_SUBST(BISON_CLOSEBRACE)
1629 AC_SUBST(BISON_VERBOSE)
1631 if $frr_ac_bison_missing; then
1632 YACC="$SHELL $missing_dir/missing bison -y"
1633 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1634 AC_MSG_WARN([using pregenerated bison output files])
1636 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1640 dnl -------------------
1641 dnl capabilities checks
1642 dnl -------------------
1643 if test "${enable_capabilities}" != "no"; then
1644 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1645 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1647 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1648 frr_ac_keepcaps="yes"],
1651 if test x"${frr_ac_keepcaps}" = x"yes"; then
1652 AC_CHECK_HEADERS(sys/capability.h)
1654 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1655 AC_CHECK_LIB(cap, cap_init,
1656 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1661 AC_CHECK_HEADERS(priv.h,
1662 [AC_MSG_CHECKING(Solaris style privileges are available)
1663 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1665 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1666 frr_ac_scaps="yes"],
1672 if test x"${frr_ac_scaps}" = x"yes" \
1673 -o x"${frr_ac_lcaps}" = x"yes"; then
1674 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1679 dnl ---------------------------
1680 dnl check for glibc 'backtrace'
1681 dnl ---------------------------
1682 if test x"${enable_backtrace}" != x"no" ; then
1684 AC_CHECK_HEADER([execinfo.h], [
1685 AC_SEARCH_LIBS([backtrace], [execinfo], [
1686 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1687 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1692 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1693 dnl user explicitly requested backtrace but we failed to find support
1694 AC_MSG_FAILURE([failed to find backtrace support])
1698 dnl -----------------------------------------
1699 dnl check for malloc mallinfo struct and call
1700 dnl this must try and link using LIBS, in
1701 dnl order to check no alternative allocator
1702 dnl has been specified, which might not provide
1703 dnl mallinfo, e.g. such as Umem on Solaris.
1704 dnl -----------------------------------------
1705 AC_CHECK_HEADER([malloc.h],
1706 [AC_MSG_CHECKING(whether mallinfo is available)
1707 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1708 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1710 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1713 ], [], FRR_INCLUDES)
1718 if test "x$enable_zeromq" != "xno"; then
1719 PKG_CHECK_MODULES(ZEROMQ, [libzmq >= 4.0.0], [
1720 AC_DEFINE(HAVE_ZEROMQ, 1, [Enable ZeroMQ support])
1723 if test "x$enable_zeromq" = "xyes"; then
1724 AC_MSG_ERROR([configuration specifies --enable-zeromq but libzmq was not found])
1728 AM_CONDITIONAL([ZEROMQ], test "x$ZEROMQ" = "xtrue")
1733 CONFDATE=`date '+%Y%m%d'`
1736 dnl ------------------------------
1737 dnl set paths for state directory
1738 dnl ------------------------------
1739 AC_MSG_CHECKING(directory to use for state file)
1740 if test "${prefix}" = "NONE"; then
1741 frr_statedir_prefix="";
1743 frr_statedir_prefix=${prefix}
1745 if test "${localstatedir}" = '${prefix}/var'; then
1746 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1747 ${frr_statedir_prefix}/var/adm dnl
1748 ${frr_statedir_prefix}/etc dnl
1754 test -d $FRR_STATE_DIR && break
1756 frr_statedir=$FRR_STATE_DIR
1758 frr_statedir=${localstatedir}
1760 if test $frr_statedir = "/dev/null"; then
1761 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1763 AC_MSG_RESULT(${frr_statedir})
1764 AC_SUBST(frr_statedir)
1766 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1767 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1768 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1770 dnl autoconf does this, but it does it too late...
1771 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1772 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1774 dnl get the full path, recursing through variables...
1775 vtysh_bin="$bindir/vtysh"
1776 for I in 1 2 3 4 5 6 7 8 9 10; do
1777 eval vtysh_bin="\"$vtysh_bin\""
1779 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1781 CFG_SYSCONF="$sysconfdir"
1783 CFG_STATE="$frr_statedir"
1784 CFG_MODULE="$moduledir"
1785 for I in 1 2 3 4 5 6 7 8 9 10; do
1786 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1787 eval CFG_SBIN="\"$CFG_SBIN\""
1788 eval CFG_STATE="\"$CFG_STATE\""
1789 eval CFG_MODULE="\"$CFG_MODULE\""
1791 AC_SUBST(CFG_SYSCONF)
1794 AC_SUBST(CFG_MODULE)
1795 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1797 dnl ---------------------------
1798 dnl Check htonl works correctly
1799 dnl ---------------------------
1800 AC_MSG_CHECKING(for working htonl)
1801 AC_CACHE_VAL(ac_cv_htonl_works,
1802 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1803 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1806 AC_MSG_RESULT($ac_cv_htonl_works)
1808 AC_CONFIG_FILES([Makefile
1811 doc/Makefile tests/Makefile
1812 bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile
1814 snapcraft/snapcraft.yaml
1816 tests/lib/cli/test_cli.refout
1834 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1835 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1838 if test "${enable_bgp_vnc}" != "no"; then
1839 if test "${with_rfp_path}" != "bgpd/rfp-example" ; then
1840 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1844 AC_CONFIG_FILES([solaris/Makefile])
1846 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1848 AC_CONFIG_COMMANDS([lib/route_types.h], [
1849 dst="${ac_abs_top_builddir}/lib/route_types.h"
1850 ${PERL} "${ac_abs_top_srcdir}/lib/route_types.pl" \
1851 < "${ac_abs_top_srcdir}/lib/route_types.txt" \
1854 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
1855 && rm "${dst}.tmp" \
1856 || mv "${dst}.tmp" "${dst}"
1861 AS_IF([test "x$with_pkg_git_version" = "xyes"], [
1862 AC_CONFIG_COMMANDS([lib/gitversion.h], [
1863 dst="${ac_abs_top_builddir}/lib/gitversion.h"
1864 ${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
1865 "${ac_abs_top_srcdir}" \
1868 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
1869 && rm "${dst}.tmp" \
1870 || mv "${dst}.tmp" "${dst}"
1876 ## Hack, but working solution to avoid rebuilding of frr.info.
1877 ## It's already in CVS until texinfo 4.7 is more common.
1881 FRRouting configuration
1882 ------------------------------
1883 FRR version : ${PACKAGE_VERSION}
1884 host operating system : ${host_os}
1885 source code location : ${srcdir}
1887 compiler flags : ${CFLAGS}
1889 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1890 state file directory : ${frr_statedir}
1891 config file directory : `eval echo \`echo ${sysconfdir}\``
1892 example directory : `eval echo \`echo ${exampledir}\``
1893 module directory : ${CFG_MODULE}
1894 user to run as : ${enable_user}
1895 group to run as : ${enable_group}
1896 group for vty sockets : ${enable_vty_group}
1897 config file mask : ${enable_configfile_mask}
1898 log file mask : ${enable_logfile_mask}
1899 zebra protobuf enabled : ${have_protobuf:-no}
1901 The above user and group must have read/write access to the state file
1902 directory and to the config files in the config file directory."