2 ## Configure template file for FRRouting.
3 ## autoconf will generate a 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], [7.1-dev], [https://github.com/frrouting/frr/issues])
11 PACKAGE_URL="https://frrouting.org/"
12 AC_SUBST([PACKAGE_URL])
13 PACKAGE_FULLNAME="FRRouting"
14 AC_SUBST([PACKAGE_FULLNAME])
16 CONFIG_ARGS="`echo $ac_configure_args | sed -e \"s% '[[A-Z]]*FLAGS=[[^']]\+'%%g\"`"
17 AC_SUBST([CONFIG_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" "--enable-clippy-only" "--disable-nhrpd" "--disable-vtysh"; )
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 foreign])
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
75 AC_SUBST([exampledir])
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
84 AC_SUBST([pkgsrcrcdir])
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])
95 AC_ARG_WITH([yangmodelsdir], [AS_HELP_STRING([--with-yangmodelsdir=DIR], [yang models directory (${datarootdir}/yang)])], [
96 yangmodelsdir="$withval"
98 yangmodelsdir="\${datarootdir}/yang"
100 AC_SUBST([yangmodelsdir])
102 AC_ARG_WITH([libyang_pluginsdir], [AS_HELP_STRING([--with-libyang-pluginsdir=DIR], [yangmodule plugins directory (${libdir}/frr/libyang_plugins)])], [
103 libyang_pluginsdir="$withval"
105 libyang_pluginsdir="\${libdir}/frr/libyang_plugins"
107 AC_SUBST([libyang_pluginsdir])
109 AC_ARG_ENABLE(tcmalloc,
110 AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
111 [case "${enableval}" in
112 yes) tcmalloc_enabled=true
113 LIBS="$LIBS -ltcmalloc_minimal"
115 no) tcmalloc_enabled=false ;;
116 *) AC_MSG_ERROR([bad value ${enableval} for --enable-tcmalloc]) ;;
117 esac],[tcmalloc_enabled=false])
120 dnl Thanks autoconf, but we don't want a default -g -O2. We have our own
121 dnl flag determination logic.
124 dnl --------------------
125 dnl Check CC and friends
126 dnl --------------------
127 dnl note orig_cflags is also used further down
128 orig_cflags="$CFLAGS"
133 dnl remove autoconf default "-g -O2"
134 CFLAGS="$orig_cflags"
136 dnl NB: see C11 below
141 dnl autoconf 2.59 appears not to support AC_PROG_SED
143 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
145 dnl try and enable CFLAGS that are useful for FRR
146 dnl - specifically, options to control warnings
148 AC_USE_SYSTEM_EXTENSIONS
149 AC_DEFUN([AC_C_FLAG], [{
150 m4_pushdef([cachename],[m4_translit([frr_cv_$1],[ =-+],[____])])
151 AC_CACHE_CHECK([[whether $CC supports $1]], cachename, [
153 ac_c_flag_save="$CFLAGS"
156 [AC_LANG_PROGRAM([[]])],
162 CFLAGS="$ac_c_flag_save"
165 if test "${cachename}" = yes; then
166 m4_if([$3], [], [CFLAGS="$CFLAGS $1"], [$3])
171 m4_popdef([cachename])
174 AC_DEFUN([AC_LINK_IFELSE_FLAGS], [{
176 ac_cflags_save="$CFLAGS"
184 CFLAGS="$ac_cflags_save"
189 CFLAGS="$ac_cflags_save"
196 dnl ICC won't bail on unknown options without -diag-error 10006
197 dnl need to do this first so we get useful results for the other options
198 AC_C_FLAG([-diag-error 10006])
200 dnl AC_PROG_CC_C99 may change CC to include -std=gnu99 or something
202 CC="${CC% -std=gnu99}"
205 AC_C_FLAG([-std=gnu11], [CC="$ac_cc"], [CC="$CC -std=gnu11"])
207 dnl if the user has specified any CFLAGS, override our settings
208 if test "x${enable_gcov}" = "xyes"; then
209 if test "z$orig_cflags" = "z"; then
210 AC_C_FLAG([-coverage])
214 LDFLAGS="${LDFLAGS} -lgcov"
215 elif test "x${enable_dev_build}" = "xyes"; then
216 AC_DEFINE([DEV_BUILD], [1], [Build for development])
217 if test "z$orig_cflags" = "z"; then
221 if test "x${enable_lua}" = "xyes"; then
222 AC_CHECK_LIB([lua], [lua_newstate],
223 [LIBS="$LIBS -llua"])
224 AC_DEFINE([HAVE_LUA], [1], [Lua enabled for development])
227 if test "x${enable_lua}" = "xyes"; then
228 AC_MSG_ERROR([Lua is not meant to be built/used outside of development at this time])
230 if test "z$orig_cflags" = "z"; then
237 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
239 dnl always want these CFLAGS
240 AC_C_FLAG([-fno-omit-frame-pointer])
241 AC_C_FLAG([-funwind-tables])
244 AC_C_FLAG([-Wmissing-prototypes])
245 AC_C_FLAG([-Wmissing-declarations])
246 AC_C_FLAG([-Wpointer-arith])
247 AC_C_FLAG([-Wbad-function-cast])
248 AC_C_FLAG([-Wwrite-strings])
249 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
250 AC_C_FLAG([-Wcast-qual])
251 AC_C_FLAG([-Wstrict-prototypes])
252 AC_C_FLAG([-Wmissing-noreturn])
253 AC_C_FLAG([-Wmissing-format-attribute])
254 AC_C_FLAG([-Wunreachable-code])
255 AC_C_FLAG([-Wpacked])
256 AC_C_FLAG([-Wpadded])
257 AC_C_FLAG([-Wshadow])
259 AC_C_FLAG([-Wno-unused-result])
261 AC_C_FLAG([-Wno-unused-parameter])
262 AC_C_FLAG([-Wno-missing-field-initializers])
264 AC_C_FLAG([-Wc++-compat], [], [CXX_COMPAT_CFLAGS="-Wc++-compat"])
265 AC_SUBST([CXX_COMPAT_CFLAGS])
267 dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
268 dnl for some reason the string consts get 'promoted' to char *,
269 dnl triggering a const to non-const conversion warning.
270 AC_C_FLAG([-diag-disable 3179])
272 if test x"${enable_werror}" = x"yes" ; then
278 if test "$enable_address_sanitizer" = "yes"; then
279 AC_C_FLAG([-fsanitize=address], [
280 AC_MSG_ERROR([$CC does not support Address Sanitizer.])
282 SAN_FLAGS="$SAN_FLAGS -fsanitize=address"
285 if test "$enable_thread_sanitizer" = "yes"; then
286 AC_C_FLAG([-fsanitize=thread], [
287 AC_MSG_ERROR([$CC does not support Thread Sanitizer.])
289 SAN_FLAGS="$SAN_FLAGS -fsanitize=thread"
292 if test "$enable_memory_sanitizer" = "yes"; then
293 AC_C_FLAG([-fsanitize=thread -fPIE -pie], [
294 AC_MSG_ERROR([$CC does not support Thread Sanitizer.])
296 SAN_FLAGS="-fsanitize=memory -fPIE -pie"
299 AC_SUBST([SAN_FLAGS])
307 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
308 LIBS="$PTHREAD_LIBS $LIBS"
310 AC_MSG_FAILURE([This FRR version needs pthreads])
313 AC_SEARCH_LIBS([pthread_condattr_setclock], [],
314 [frr_cv_pthread_condattr_setclock=yes],
315 [frr_cv_pthread_condattr_setclock=no])
316 if test "$frr_cv_pthread_condattr_setclock" = yes; then
317 AC_DEFINE([HAVE_PTHREAD_CONDATTR_SETCLOCK], [1], [Have pthread.h pthread_condattr_setclock])
326 AC_CHECK_TOOL([AR], [ar])
331 AC_ARG_ENABLE([static-bin],
332 AS_HELP_STRING([--enable-static-bin], [link binaries statically]))
335 patch -N -i "${srcdir}/m4/libtool-whole-archive.patch" libtool >&AS_MESSAGE_LOG_FD || \
336 AC_MSG_WARN([Could not patch libtool for static linking support. Loading modules into a statically linked daemon will fail.])
338 if test "$enable_static_bin" = "yes"; then
340 if test "$enable_static" != "yes"; then
341 AC_MSG_ERROR([The --enable-static-bin option must be combined with --enable-static.])
344 if test "$enable_shared" != "yes"; then
345 AC_MSG_ERROR([FRR cannot be built with --disable-shared. If you want statically linked daemons, use --enable-shared --enable-static --enable-static-bin])
347 AC_SUBST([AC_LDFLAGS])
348 AM_CONDITIONAL([STATIC_BIN], [test "x$enable_static_bin" = "xyes"])
350 dnl $AR and $RANLIB are set by LT_INIT above
351 AC_MSG_CHECKING([whether $AR supports D option])
352 if $AR crD conftest.a >/dev/null 2>/dev/null; then
354 dnl ARFLAGS is for automake, AR_FLAGS for libtool m-(
365 AC_MSG_CHECKING([whether $RANLIB supports D option])
366 if $RANLIB -D conftest.a >/dev/null 2>/dev/null; then
374 test -f conftest.a && rm conftest.a
376 dnl ----------------------
377 dnl Packages configuration
378 dnl ----------------------
379 if test -f config.version; then
381 elif test -f "${srcdir}/config.version"; then
382 . "${srcdir}/config.version"
384 AC_ARG_WITH([pkg-extra-version],
385 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]), [
386 if test "$withval" = "no"; then
389 EXTRAVERSION=$withval
392 AC_ARG_WITH([pkg-git-version],
393 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
394 [ test "x$withval" != "xno" && with_pkg_git_version="yes" ])
395 AC_ARG_WITH([vtysh_pager],
396 AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
397 VTYSH_PAGER=$withval, VTYSH_PAGER="more")
398 AC_ARG_ENABLE([vtysh],
399 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for FRR]))
401 AS_HELP_STRING([--disable-doc], [do not build docs]))
402 AC_ARG_ENABLE([doc-html],
403 AS_HELP_STRING([--enable-doc-html], [build HTML docs]))
404 AC_ARG_ENABLE([zebra],
405 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
406 AC_ARG_ENABLE([bgpd],
407 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
408 AC_ARG_ENABLE([ripd],
409 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
410 AC_ARG_ENABLE([ripngd],
411 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
412 AC_ARG_ENABLE([ospfd],
413 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
414 AC_ARG_ENABLE([ospf6d],
415 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
416 AC_ARG_ENABLE([ldpd],
417 AS_HELP_STRING([--disable-ldpd], [do not build ldpd]))
418 AC_ARG_ENABLE([nhrpd],
419 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
420 AC_ARG_ENABLE([eigrpd],
421 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
422 AC_ARG_ENABLE([babeld],
423 AS_HELP_STRING([--disable-babeld], [do not build babeld]))
424 AC_ARG_ENABLE([watchfrr],
425 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
426 AC_ARG_ENABLE([isisd],
427 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
428 AC_ARG_ENABLE([pimd],
429 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
430 AC_ARG_ENABLE([pbrd],
431 AS_HELP_STRING([--disable-pbrd], [do not build pbrd]))
432 AC_ARG_ENABLE([sharpd],
433 AS_HELP_STRING([--enable-sharpd], [build sharpd]))
434 AC_ARG_ENABLE([staticd],
435 AS_HELP_STRING([--disable-staticd], [do not build staticd]))
436 AC_ARG_ENABLE([fabricd],
437 AS_HELP_STRING([--disable-fabricd], [do not build fabricd]))
438 AC_ARG_ENABLE([bgp-announce],
439 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
440 AC_ARG_ENABLE([bgp-vnc],
441 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
442 AC_ARG_ENABLE([snmp],
443 AS_HELP_STRING([--enable-snmp], [enable SNMP support for agentx]))
444 AC_ARG_ENABLE([config_rollbacks],
445 AS_HELP_STRING([--enable-config-rollbacks], [enable configuration rollbacks (requires sqlite3)]))
446 AC_ARG_ENABLE([confd],
447 AS_HELP_STRING([--enable-confd=ARG], [enable confd integration]))
448 AC_ARG_ENABLE([sysrepo],
449 AS_HELP_STRING([--enable-sysrepo], [enable sysrepo integration]))
450 AC_ARG_ENABLE([zeromq],
451 AS_HELP_STRING([--enable-zeromq], [enable ZeroMQ handler (libfrrzmq)]))
452 AC_ARG_WITH([libpam],
453 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
454 AC_ARG_ENABLE([ospfapi],
455 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
456 AC_ARG_ENABLE([ospfclient],
457 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
458 (this is the default if --disable-ospfapi is set)]))
459 AC_ARG_ENABLE([multipath],
460 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
461 AC_ARG_ENABLE([user],
462 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
463 AC_ARG_ENABLE([group],
464 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
465 AC_ARG_ENABLE([vty_group],
466 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
467 AC_ARG_ENABLE([configfile_mask],
468 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
469 AC_ARG_ENABLE([logfile_mask],
470 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
471 AC_ARG_ENABLE([shell_access],
472 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
473 AC_ARG_ENABLE([realms],
474 AS_HELP_STRING([--enable-realms], [enable REALMS support under Linux]))
475 AC_ARG_ENABLE([rtadv],
476 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
477 AC_ARG_ENABLE([irdp],
478 AS_HELP_STRING([--disable-irdp], [enable IRDP server support in zebra (default if supported)]))
479 AC_ARG_ENABLE([capabilities],
480 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
481 AC_ARG_ENABLE([rusage],
482 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
483 AC_ARG_ENABLE([gcc_ultra_verbose],
484 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
485 AC_ARG_ENABLE([backtrace],
486 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
487 AC_ARG_ENABLE([time-check],
488 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
489 AC_ARG_ENABLE([pcreposix],
490 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
492 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
493 AC_ARG_ENABLE([systemd],
494 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
495 AC_ARG_ENABLE([werror],
496 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
497 AC_ARG_ENABLE([cumulus],
498 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
499 AC_ARG_ENABLE([datacenter],
500 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
501 AC_ARG_ENABLE([fuzzing],
502 AS_HELP_STRING([--enable-fuzzing], [enable ability to fuzz various parts of FRR]))
503 AC_ARG_ENABLE([netlink_fuzzing],
504 AS_HELP_STRING([--enable-netlink-fuzzing], [enable ability to fuzz netlink listening socket in zebra]))
505 AC_ARG_ENABLE([rr-semantics],
506 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
507 AC_ARG_ENABLE([protobuf],
508 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
509 AC_ARG_ENABLE([oldvpn_commands],
510 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
511 AC_ARG_ENABLE([rpki],
512 AS_HELP_STRING([--enable-rpki], [enable RPKI prefix validation support]))
513 AC_ARG_ENABLE([clippy-only],
514 AS_HELP_STRING([--enable-clippy-only], [Only build clippy]))
515 AC_ARG_ENABLE([numeric_version],
516 AS_HELP_STRING([--enable-numeric-version], [Only numeric digits allowed in version (for Alpine)]))
517 AC_ARG_ENABLE([gcov],
518 AS_HELP_STRING([--enable-gcov], [Add code coverage information]))
519 AC_ARG_ENABLE([bfdd],
520 AS_HELP_STRING([--disable-bfdd], [do not build bfdd]))
521 AC_ARG_ENABLE([address-sanitizer],
522 AS_HELP_STRING([--enable-address-sanitizer], [enable AddressSanitizer support for detecting a wide variety of memory allocation and deallocation errors]))
523 AC_ARG_ENABLE([thread-sanitizer],
524 AS_HELP_STRING([--enable-thread-sanitizer], [enable ThreadSanitizer support for detecting data races]))
525 AC_ARG_ENABLE([memory-sanitizer],
526 AS_HELP_STRING([--enable-memory-sanitizer], [enable MemorySanitizer support for detecting uninitialized memory reads]))
528 AS_IF([test "${enable_clippy_only}" != "yes"], [
529 AC_CHECK_HEADERS([json-c/json.h])
530 AC_CHECK_LIB([json-c], [json_object_get], [LIBS="$LIBS -ljson-c"], [], [-lm])
531 if test "$ac_cv_lib_json_c_json_object_get" = no; then
532 AC_CHECK_LIB([json], [json_object_get], [LIBS="$LIBS -ljson"])
533 if test "$ac_cv_lib_json_json_object_get" = no; then
534 AC_MSG_ERROR([libjson is needed to compile])
539 AC_ARG_ENABLE([dev_build],
540 AS_HELP_STRING([--enable-dev-build], [build for development]))
543 AS_HELP_STRING([--enable-lua], [Build Lua scripting]))
545 if test x"${enable_time_check}" != x"no" ; then
546 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
547 AC_DEFINE([CONSUMED_TIME_CHECK], [5000000], [Consumed Time Check])
549 AC_DEFINE_UNQUOTED([CONSUMED_TIME_CHECK], [$enable_time_check], [Consumed Time Check])
553 case "${enable_systemd}" in
556 AC_CHECK_LIB([systemd], [sd_notify], [LIBS="$LIBS -lsystemd"])
557 if test $ac_cv_lib_systemd_sd_notify = no; then
558 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
560 AC_DEFINE([HAVE_SYSTEMD], [1], [Compile systemd support in])
566 if test "${enable_rr_semantics}" != "no" ; then
567 AC_DEFINE([HAVE_V6_RR_SEMANTICS], [1], [Compile in v6 Route Replacement Semantics])
570 if test "${enable_datacenter}" = "yes" ; then
571 AC_DEFINE([HAVE_DATACENTER], [1], [Compile extensions for a DataCenter])
572 DFLT_NAME="datacenter"
574 DFLT_NAME="traditional"
577 if test "${enable_fuzzing}" = "yes" ; then
578 AC_DEFINE([HANDLE_ZAPI_FUZZING], [1], [Compile extensions to use with a fuzzer])
581 if test "${enable_netlink_fuzzing}" = "yes" ; then
582 AC_DEFINE([HANDLE_NETLINK_FUZZING], [1], [Compile extensions to use with a fuzzer for netlink])
585 if test "${enable_cumulus}" = "yes" ; then
586 AC_DEFINE([HAVE_CUMULUS], [1], [Compile Special Cumulus Code in])
589 AC_SUBST([DFLT_NAME])
590 AC_DEFINE_UNQUOTED([DFLT_NAME], ["$DFLT_NAME"], [Name of the configuration default set])
592 if test "${enable_shell_access}" = "yes"; then
593 AC_DEFINE([HAVE_SHELL_ACCESS], [1], [Allow user to use ssh/telnet/bash, be aware this is considered insecure])
596 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
602 AC_DEFUN([FRR_PYTHON_CHECK_WORKING], [
603 AC_MSG_CHECKING([whether we found a working Python version])
604 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
606 #if PY_VERSION_HEX < 0x02070000
607 #error python too old
617 # some python installs are missing the zlib dependency...
618 PYTHON_LIBS="${PYTHON_LIBS} -lz"
619 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
621 #if PY_VERSION_HEX < 0x02070000
622 #error python too old
641 AS_IF([test "$host" = "$build"], [
645 # 1. try python3, but respect the user's preference on which minor ver
646 # 2. try python, which might be py3 or py2 again on the user's preference
647 # 3. try python2 (can really only be 2.7 but eh)
648 # 4. try 3.6 > 3.5 > 3.4 > 3.3 > 3.2 > 2.7 through pkg-config (no user pref)
650 # (AX_PYTHON_DEVEL has no clue about py3 vs py2)
651 # (AX_PYTHON does not do what we need)
653 AC_CHECK_TOOLS([PYTHONCONFIG], [ \
663 if test -n "$PYTHONCONFIG"; then
664 PYTHON_CFLAGS="`\"${PYTHONCONFIG}\" --includes`"
665 PYTHON_LIBS="`\"${PYTHONCONFIG}\" --ldflags`"
667 FRR_PYTHON_CHECK_WORKING([])
670 if test -z "$PYTHONCONFIG"; then
671 PKG_CHECK_MODULES([PYTHON], [python-3.6], [], [
672 PKG_CHECK_MODULES([PYTHON], [python-3.5], [], [
673 PKG_CHECK_MODULES([PYTHON], [python-3.4], [], [
674 PKG_CHECK_MODULES([PYTHON], [python-3.3], [], [
675 PKG_CHECK_MODULES([PYTHON], [python-3.2], [], [
676 PKG_CHECK_MODULES([PYTHON], [python-2.7], [], [
677 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
681 FRR_PYTHON_CHECK_WORKING([
682 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
686 AC_SUBST([PYTHON_CFLAGS])
687 AC_SUBST([PYTHON_LIBS])
690 # Logic for protobuf support.
692 if test "$enable_protobuf" = "yes"; then
693 # Check for protoc & protoc-c
695 # protoc is not required, it's only for a "be nice" helper target
696 AC_CHECK_PROGS([PROTOC], [protoc], [/bin/false])
698 AC_CHECK_PROGS([PROTOC_C], [protoc-c], [/bin/false])
699 if test "$PROTOC_C" = "/bin/false"; then
700 AC_MSG_FAILURE([protobuf requested but protoc-c not found. Install protobuf-c.])
703 PKG_CHECK_MODULES([PROTOBUF_C], [libprotobuf-c >= 0.14],, [
704 AC_MSG_FAILURE([protobuf requested but libprotobuf-c not found. Install protobuf-c.])
706 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [], [
707 AC_MSG_FAILURE([protobuf requested but protobuf-c.h not found. Install protobuf-c.])
710 AC_DEFINE([HAVE_PROTOBUF], [1], [protobuf])
712 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$enable_protobuf" = "xyes"])
715 # Logic for old vpn commands support.
717 if test "$enable_oldvpn_commands" = "yes"; then
718 AC_DEFINE([KEEP_OLD_VPN_COMMANDS], [1], [Define for compiling with old vpn commands])
722 # End of logic for protobuf support.
725 AC_MSG_CHECKING([if zebra should be configurable to send Route Advertisements])
726 if test "${enable_rtadv}" != "no"; then
728 AC_DEFINE([HAVE_RTADV], [1], [Enable IPv6 Routing Advertisement support])
733 if test x"${enable_user}" = x"no"; then
736 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
739 AC_DEFINE_UNQUOTED([FRR_USER], ["${enable_user}"], [frr User])
742 if test x"${enable_group}" = x"no"; then
745 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
748 AC_DEFINE_UNQUOTED([FRR_GROUP], ["${enable_group}"], [frr Group])
751 if test x"${enable_vty_group}" = x"yes" ; then
752 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
753 elif test x"${enable_vty_group}" != x""; then
754 if test x"${enable_vty_group}" != x"no"; then
755 AC_DEFINE_UNQUOTED([VTY_GROUP], ["${enable_vty_group}"], [VTY Sockets Group])
758 AC_SUBST([enable_user])
759 AC_SUBST([enable_group])
760 AC_SUBST([enable_vty_group])
762 enable_configfile_mask=${enable_configfile_mask:-0600}
763 AC_DEFINE_UNQUOTED([CONFIGFILE_MASK], [${enable_configfile_mask}], [Mask for config files])
765 enable_logfile_mask=${enable_logfile_mask:-0600}
766 AC_DEFINE_UNQUOTED([LOGFILE_MASK], [${enable_logfile_mask}], [Mask for log files])
770 case "${enable_multipath}" in
774 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
775 MPATH_NUM="${enable_multipath}"
780 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
784 AC_DEFINE_UNQUOTED([MULTIPATH_NUM], [$MPATH_NUM], [Maximum number of paths for a route])
786 AC_DEFINE_UNQUOTED([VTYSH_PAGER], ["$VTYSH_PAGER"], [What pager to use])
788 dnl --------------------
789 dnl Enable code coverage
790 dnl --------------------
791 AM_CONDITIONAL([HAVE_GCOV], [test '!' "$enable_gcov" = no])
793 dnl ------------------------------------
794 dnl Alpine only accepts numeric versions
795 dnl ------------------------------------
796 if test "x${enable_numeric_version}" != "x" ; then
797 VERSION="`echo ${VERSION} | tr -c -d '[[.0-9]]'`"
798 PACKAGE_VERSION="`echo ${PACKAGE_VERSION} | tr -c -d '[[.0-9]]'`"
801 dnl -----------------------------------
802 dnl Add extra version string to package
803 dnl name, string and version fields.
804 dnl -----------------------------------
805 if test "x${EXTRAVERSION}" != "x" ; then
806 VERSION="${VERSION}${EXTRAVERSION}"
807 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
808 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
809 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
811 AC_SUBST([EXTRAVERSION])
813 if test "x$with_pkg_git_version" = "xyes"; then
814 if test -d "${srcdir}/.git"; then
815 AC_DEFINE([GIT_VERSION], [1], [include git version info])
816 else with_pkg_git_version="no"
817 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
820 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
822 AC_CHECK_TOOL([OBJCOPY], [objcopy], [:])
823 if test "x${OBJCOPY}" != "x:"; then
824 AC_CACHE_CHECK([for .interp value to use], [frr_cv_interp], [
826 AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])], [
827 if $OBJCOPY -j.interp -Obinary conftest conftest.interp; then
828 frr_cv_interp="`xargs -0 echo < conftest.interp`"
830 test -f conftest.interp && rm conftest.interp
834 if test -n "$frr_cv_interp"; then
835 AC_DEFINE_UNQUOTED([INTERP], ["$frr_cv_interp"], [.interp value])
838 dnl ------------------------------------
839 dnl Check C keywords and standard types
840 dnl ------------------------------------
851 dnl -------------------------
852 dnl Check other header files.
853 dnl -------------------------
854 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
855 linux/version.h asm/types.h \
858 ac_stdatomic_ok=false
859 AC_DEFINE([FRR_AUTOCONF_ATOMIC], [1], [did autoconf checks for atomic funcs])
860 AC_CHECK_HEADER([stdatomic.h],[
862 AC_MSG_CHECKING([whether _Atomic qualifier works])
863 AC_LINK_IFELSE([AC_LANG_SOURCE([[
864 #include <stdatomic.h>
865 int main(int argc, char **argv) {
870 AC_DEFINE([HAVE_STDATOMIC_H], [1], [found stdatomic.h])
878 AS_IF([$ac_stdatomic_ok], [true], [
879 AC_MSG_CHECKING([for __atomic_* builtins])
880 AC_LINK_IFELSE([AC_LANG_SOURCE([[
881 int main(int argc, char **argv) {
883 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
884 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
887 AC_DEFINE([HAVE___ATOMIC], [1], [found __atomic builtins])
892 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
893 AC_MSG_CHECKING([for __sync_* builtins])
894 AC_LINK_IFELSE([AC_LANG_SOURCE([[
895 int main(int argc, char **argv) {
897 __sync_fetch_and_sub (&i, 1);
898 return __sync_val_compare_and_swap (&i, 0, 1);
901 AC_DEFINE([HAVE___SYNC], [1], [found __sync builtins])
904 AC_MSG_CHECKING([for __sync_swap builtin])
905 AC_LINK_IFELSE([AC_LANG_SOURCE([[
906 int main(int argc, char **argv) {
908 return __sync_swap (&i, 2);
911 AC_DEFINE([HAVE___SYNC_SWAP], 1, [found __sync_swap builtin])
919 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
924 AC_CHECK_HEADERS([pthread_np.h],,, [
927 AC_CHECK_FUNCS([pthread_setname_np pthread_set_name_np])
933 AC_MSG_CHECKING([for Linux futex() support])
934 AC_LINK_IFELSE([AC_LANG_PROGRAM([
940 #include <sys/time.h>
941 #include <sys/syscall.h>
942 #include <linux/futex.h>
948 return syscall(SYS_futex, NULL, FUTEX_WAIT, 0, NULL, NULL, 0);
952 AC_DEFINE(HAVE_SYNC_LINUX_FUTEX,,Have Linux futex support)
961 AC_MSG_CHECKING([for FreeBSD _umtx_op() support])
962 AC_LINK_IFELSE([AC_LANG_PROGRAM([
965 #include <sys/types.h>
966 #include <sys/umtx.h>
971 return _umtx_op(NULL, UMTX_OP_WAIT_UINT, 0, NULL, NULL);
975 AC_DEFINE(HAVE_SYNC_UMTX_OP,,Have FreeBSD _umtx_op() support)
983 dnl OpenBSD patch (not upstream at the time of writing this)
984 dnl https://marc.info/?l=openbsd-tech&m=147299508409549&w=2
985 AC_MSG_CHECKING([for OpenBSD futex() support])
986 AC_LINK_IFELSE([AC_LANG_PROGRAM([
987 #include <sys/futex.h>
992 return futex(NULL, FUTEX_WAIT, 0, NULL, NULL, 0);
996 AC_DEFINE(HAVE_SYNC_OPENBSD_FUTEX,,Have OpenBSD futex support)
1003 dnl Utility macro to avoid retyping includes all the time
1004 m4_define([FRR_INCLUDES],
1006 #define _POSIX_C_SOURCE 200809L
1007 #define __EXTENSIONS__
1012 #include <sys/types.h>
1013 /* sys/conf.h depends on param.h on FBSD at least */
1014 #include <sys/param.h>
1015 /* Required for MAXSIG */
1017 #include <sys/socket.h>
1019 # define __APPLE_USE_RFC_3542
1021 #include <netinet/in.h>
1022 #include <sys/time.h>
1027 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
1028 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
1029 dnl an additional round for it.
1031 AC_CHECK_HEADERS([net/if_var.h], [], [], [FRR_INCLUDES])
1033 m4_define([FRR_INCLUDES],
1035 [#if HAVE_NET_IF_VAR_H
1036 # include <net/if_var.h>
1040 AC_CHECK_HEADERS([netinet/in_var.h \
1041 net/if_dl.h net/netopt.h \
1042 inet/nd.h netinet/ip_icmp.h \
1043 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
1044 [], [], [FRR_INCLUDES])
1046 AC_CHECK_HEADERS([ucontext.h], [], [],
1049 #endif /* __USE_GNU */
1053 m4_define([UCONTEXT_INCLUDES],
1054 [#include <ucontext.h>])dnl
1056 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
1057 [], [], [UCONTEXT_INCLUDES])
1058 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
1059 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
1060 [], [], [UCONTEXT_INCLUDES])],
1061 [], [UCONTEXT_INCLUDES])
1062 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
1063 [], [], [UCONTEXT_INCLUDES])
1065 m4_define([FRR_INCLUDES],
1069 #include <netinet/in_systm.h>
1070 #if HAVE_NETINET_IN_VAR_H
1071 # include <netinet/in_var.h>
1073 #if HAVE_NET_IF_DL_H
1074 # include <net/if_dl.h>
1076 #if HAVE_NET_NETOPT_H
1077 # include <net/netopt.h>
1079 #include <net/route.h>
1081 # include <inet/nd.h>
1083 #include <arpa/inet.h>
1084 /* Required for IDRP */
1085 #if HAVE_NETINET_IP_ICMP_H
1086 # include <netinet/ip_icmp.h>
1090 dnl V6 headers are checked below, after we check for v6
1092 AC_MSG_CHECKING([which operating system interface to use])
1095 AC_MSG_RESULT([Solaris])
1097 AC_DEFINE([SUNOS_5], [1], [SunOS 5])
1098 AC_DEFINE([SOLARIS_IPV6], [1], Solaris IPv6)
1099 AC_DEFINE([_POSIX_C_SOURCE], [200809L], [enable POSIX.1-2008 and XPG7/SUSv4])
1101 AC_CHECK_LIB([socket], [main])
1102 AC_CHECK_LIB([nsl], [main])
1103 AC_CHECK_LIB([umem], [main])
1107 AC_MSG_RESULT([Linux])
1109 AC_DEFINE([GNU_LINUX], [1], [GNU Linux])
1110 AC_DEFINE([HAVE_NETLINK], [1], [netlink])
1111 AC_DEFINE([LINUX_IPV6], [1], [Linux IPv6 stack])
1113 dnl Linux has a compilation problem with mixing
1114 dnl netinet/in.h and linux/in6.h they are not
1115 dnl compatible. There has been discussion on
1116 dnl how to fix it but no real progress on implementation
1117 dnl when they fix it, remove this
1118 AC_DEFINE([IPV6_MINHOPCOUNT], [73], [Linux ipv6 Min Hop Count])
1121 AC_MSG_RESULT([OpenBSD])
1123 AC_DEFINE([OPEN_BSD], [1], [OpenBSD])
1124 AC_DEFINE([KAME], [1], [KAME IPv6])
1125 AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
1127 if test "x${enable_pimd}" != "xno"; then
1132 AC_MSG_FAILURE([pimd cannot be enabled as PIM support has been removed from OpenBSD 6.1])
1138 AC_MSG_RESULT([BSD])
1140 AC_DEFINE([HAVE_NET_RT_IFLIST], [1], [NET_RT_IFLIST])
1141 AC_DEFINE([KAME], [1], [KAME IPv6])
1142 AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
1145 AM_CONDITIONAL([SOLARIS], [test "${SOLARIS}" = "solaris"])
1149 dnl ------------------------
1150 dnl Integrated REALMS option
1151 dnl ------------------------
1152 if test "${enable_realms}" = "yes"; then
1155 AC_DEFINE([SUPPORT_REALMS], [1], [Realms support])
1158 echo "Sorry, only Linux has REALMS support"
1163 AM_CONDITIONAL([SUPPORT_REALMS], [test "${enable_realms}" = "yes"])
1165 dnl ---------------------
1166 dnl Integrated VTY option
1167 dnl ---------------------
1168 case "${enable_vtysh}" in
1173 AC_DEFINE([VTYSH], [1], [VTY shell])
1176 AC_CHECK_LIB([readline], [main], [
1177 LIBREADLINE="-lreadline"
1179 dnl readline failed - it might be incorrectly linked and missing its
1180 dnl termcap/tinfo/curses dependency. see if we can fix that...
1181 AC_SEARCH_LIBS([tputs], [termcap tinfo curses ncurses], [
1182 LIBREADLINE="$ac_cv_search_tputs"
1184 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1187 dnl re-try with the lib we found above
1188 unset ac_cv_lib_readline_main
1189 AC_CHECK_LIB([readline], [main], [
1190 LIBREADLINE="-lreadline $LIBREADLINE"
1192 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1197 AC_CHECK_HEADER([readline/history.h])
1198 if test $ac_cv_header_readline_history_h = no;then
1199 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
1201 AC_CHECK_LIB([readline], [rl_completion_matches], [true], [], [$LIBREADLINE])
1202 if test $ac_cv_lib_readline_rl_completion_matches = no; then
1203 AC_DEFINE([rl_completion_matches], [completion_matches], [Old readline])
1205 AC_CHECK_LIB([readline], [append_history], [frr_cv_append_history=yes], [frr_cv_append_history=no], [$LIBREADLINE])
1206 if test "$frr_cv_append_history" = yes; then
1207 AC_DEFINE([HAVE_APPEND_HISTORY], [1], [Have history.h append_history])
1211 AC_SUBST([LIBREADLINE])
1212 AM_CONDITIONAL([VTYSH], test "x$VTYSH" = "xvtysh")
1217 dnl FRR detects the PAM library it is built against by checking for a
1218 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
1219 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
1220 dnl openpam.h doesn't do that, although depends on the header too. Hence a
1221 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
1224 if test "$with_libpam" = "yes"; then
1225 AC_CHECK_HEADER([security/pam_misc.h],
1226 [AC_DEFINE([HAVE_PAM_MISC_H], [1], [Have pam_misc.h])
1227 AC_DEFINE([PAM_CONV_FUNC], [misc_conv], [Have misc_conv])
1228 pam_conv_func="misc_conv"
1231 AC_CHECK_HEADER([security/openpam.h],
1232 [AC_DEFINE([HAVE_OPENPAM_H], [1], [Have openpam.h])
1233 AC_DEFINE([PAM_CONV_FUNC], [openpam_ttyconv], [Have openpam_ttyconv])
1234 pam_conv_func="openpam_ttyconv"
1236 [], FRR_INCLUDES[#include <security/pam_appl.h>])
1237 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
1238 AC_MSG_WARN([*** pam support will not be built ***])
1243 if test "$with_libpam" = "yes"; then
1244 dnl took this test from proftpds configure.in and suited to our needs
1245 dnl -------------------------------------------------------------------------
1247 dnl This next check looks funky due to a linker problem with some versions
1248 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
1249 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
1250 dnl with RedHat 6.2 and Debian 2.2 or better.
1251 AC_CHECK_LIB([pam], [pam_start],
1252 [AC_CHECK_LIB([pam], [$pam_conv_func],
1253 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1255 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1256 LIBPAM="-lpam -lpam_misc"]
1260 [AC_CHECK_LIB([pam], [pam_end],
1261 [AC_CHECK_LIB([pam], [$pam_conv_func],
1262 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1263 LIBPAM="-lpam -ldl"],
1264 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1265 LIBPAM="-lpam -ldl -lpam_misc"]
1267 ],AC_MSG_WARN([*** pam support will not be built ***]),
1274 dnl -------------------------------
1275 dnl Endian-ness check
1276 dnl -------------------------------
1279 dnl -------------------------------
1280 dnl check the size in byte of the C
1281 dnl -------------------------------
1282 dnl AC_CHECK_SIZEOF(char)
1283 dnl AC_CHECK_SIZEOF(int)
1284 dnl AC_CHECK_SIZEOF(short)
1285 dnl AC_CHECK_SIZEOF(long)
1287 dnl ----------------------------
1288 dnl check existance of functions
1289 dnl ----------------------------
1295 dnl -------------------------------
1296 dnl bgpd needs pow() and hence libm
1297 dnl -------------------------------
1299 AC_CHECK_HEADER([math.h],
1300 [AC_CHECK_LIB([m], [pow],
1303 AC_CHECK_FUNCS(pow,[],[LIBM=""])
1306 if test x"$LIBM" = x ; then
1307 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1313 AC_CHECK_FUNCS([ppoll], [
1314 AC_DEFINE([HAVE_PPOLL], [1], [have Linux/BSD ppoll()])
1316 AC_CHECK_FUNCS([pollts], [
1317 AC_DEFINE([HAVE_POLLTS], [1], [have NetBSD pollts()])
1327 AC_CHECK_HEADER([asm-generic/unistd.h],
1328 [AC_CHECK_DECL(__NR_setns,
1329 AC_DEFINE([HAVE_NETNS], [1], [Have netns]),,
1330 FRR_INCLUDES [#include <asm-generic/unistd.h>
1332 AC_CHECK_FUNCS([setns])]
1335 dnl --------------------------
1336 dnl Determine IS-IS I/O method
1337 dnl --------------------------
1338 AC_DEFINE([ISIS_METHOD_PFPACKET], [1], [constant value for isis method pfpacket])
1339 AC_DEFINE([ISIS_METHOD_DLPI], [2], [constant value for isis method dlpi])
1340 AC_DEFINE([ISIS_METHOD_BPF], [3], [constant value for isis method bpf])
1341 AC_CHECK_HEADER([net/bpf.h])
1342 AC_CHECK_HEADER([sys/dlpi.h])
1343 AC_MSG_CHECKING([zebra IS-IS I/O method])
1347 AC_MSG_RESULT([pfpacket])
1348 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1351 AC_MSG_RESULT([DLPI])
1352 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1355 if test $ac_cv_header_net_bpf_h = no; then
1356 if test $ac_cv_header_sys_dlpi_h = no; then
1357 AC_MSG_RESULT([none])
1358 if test "${enable_isisd}" = yes -o "${enable_fabricd}" = yes; then
1359 AC_MSG_FAILURE([IS-IS support requested but no packet backend found])
1361 AC_MSG_WARN([*** IS-IS support will not be built ***])
1365 AC_MSG_RESULT([DLPI])
1367 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1369 AC_MSG_RESULT([BPF])
1370 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
1374 AC_DEFINE_UNQUOTED([ISIS_METHOD], [$ISIS_METHOD_MACRO], [selected method for isis, == one of the constants])
1376 dnl ---------------------------------------------------------------
1377 dnl figure out how to specify an interface in multicast sockets API
1378 dnl ---------------------------------------------------------------
1379 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1381 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1382 #include <sys/socket.h>
1383 #include <netinet/in.h>
1384 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1385 #include <linux/types.h>
1388 m4_define([FRR_INCLUDES],
1390 [#if HAVE_LINUX_MROUTE_H
1391 # include <linux/mroute.h>
1395 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1396 #include <sys/socket.h>
1397 #include <sys/types.h>
1398 #include <netinet/in.h>
1399 #include <net/route.h>
1402 m4_define([FRR_INCLUDES],
1404 [#if HAVE_NETINET_IP_MROUTE_H
1405 # include <netinet/ip_mroute.h>
1409 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1410 AC_TRY_COMPILE([#include <sys/param.h>],
1411 [#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)
1414 #error No support for BSD struct ip_mreq hack detected
1415 #endif],[AC_MSG_RESULT([yes])
1416 AC_DEFINE([HAVE_BSD_STRUCT_IP_MREQ_HACK], [1], [Can pass ifindex in struct ip_mreq])],
1417 AC_MSG_RESULT([no]))
1419 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1421 #include <sys/types.h>
1422 #include <netinet/in.h>
1423 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1424 ], [AC_MSG_RESULT([yes])
1425 AC_DEFINE([HAVE_RFC3678], [1], [Have RFC3678 protocol-independed API])],
1426 AC_MSG_RESULT([no]))
1428 dnl ---------------------------------------------------------------
1429 dnl figure out how to check link-state
1430 dnl ---------------------------------------------------------------
1431 AC_CHECK_HEADER([net/if_media.h],
1432 [m4_define([LINK_DETECT_INCLUDES],
1434 [#include <net/if_media.h>
1436 AC_CHECK_MEMBERS([struct ifmediareq.ifm_status],
1437 AC_DEFINE([HAVE_BSD_LINK_DETECT], [1], [BSD link-detect]),
1438 [], LINK_DETECT_INCLUDES)],
1442 dnl ---------------------------------------------------------------
1443 dnl Additional, newer way to check link-state using ifi_link_state.
1444 dnl Not available in all BSD's when ifmediareq available
1445 dnl ---------------------------------------------------------------
1446 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1447 AC_DEFINE([HAVE_BSD_IFI_LINK_STATE], [1], [BSD ifi_link_state available]),
1450 dnl ------------------------
1451 dnl TCP_MD5SIG socket option
1452 dnl ------------------------
1454 AC_CHECK_HEADER([netinet/tcp.h],
1455 [m4_define([MD5_INCLUDES],
1457 [#include <netinet/tcp.h>
1459 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1462 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1463 AC_CHECK_HEADER([linux/tcp.h],
1464 [m4_define([MD5_INCLUDES],
1466 [#include <linux/tcp.h>
1468 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1471 dnl ----------------------------------------------------------------------------
1472 dnl figure out if domainname is available in the utsname struct (GNU extension).
1473 dnl ----------------------------------------------------------------------------
1474 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1476 dnl ------------------
1477 dnl IPv6 header checks
1478 dnl ------------------
1479 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1480 netinet6/in6_var.h netinet6/nd6.h], [], [],
1483 m4_define([FRR_INCLUDES],dnl
1485 [#if HAVE_NETINET6_IN6_H
1486 #include <netinet6/in6.h>
1488 #if HAVE_NETINET_IN6_VAR_H
1489 #include <netinet/in6_var.h>
1491 #include <netinet/icmp6.h>
1492 #if HAVE_NETINET6_IN6_VAR_H
1493 # include <netinet6/in6_var.h>
1495 #if HAVE_NETINET6_ND6_H
1496 # include <netinet6/nd6.h>
1500 dnl disable doc check
1501 AC_CHECK_PROGS([SPHINXBUILD], [sphinx-build sphinx-build3 sphinx-build2], [/bin/false])
1502 if test "$SPHINXBUILD" = "/bin/false"; then
1503 if test "${enable_doc}" = "yes"; then
1504 AC_MSG_ERROR([Documentation was explicitly requested with --enable-doc but sphinx-build is not available. Please disable docs or install sphinx.])
1507 AM_CONDITIONAL([DOC], [test "${enable_doc}" != "no" -a "$SPHINXBUILD" != "/bin/false"])
1508 AM_CONDITIONAL([DOC_HTML], [test "${enable_doc_html}" = "yes"])
1510 dnl --------------------
1511 dnl Daemon disable check
1512 dnl --------------------
1513 AM_CONDITIONAL([ZEBRA], [test "${enable_zebra}" != "no"])
1515 if test "${enable_bgpd}" = "no";then
1520 AM_CONDITIONAL([BGPD], [test "x$BGPD" = "xbgpd"])
1522 AM_CONDITIONAL([RIPD], [test "${enable_ripd}" != "no"])
1523 AM_CONDITIONAL([OSPFD], [test "${enable_ospfd}" != "no"])
1524 AM_CONDITIONAL([LDPD], [test "${enable_ldpd}" != "no"])
1526 AS_IF([test "${enable_ldpd}" != "no"], [
1527 AC_DEFINE([HAVE_LDPD], [1], [ldpd])
1530 if test "$enable_bfdd" = "no"; then
1531 AC_DEFINE([HAVE_BFDD], [0], [bfdd])
1534 AC_DEFINE([HAVE_BFDD], [1], [bfdd])
1539 AC_DEFINE([BFD_LINUX], [1], [bfdd])
1543 AC_DEFINE([BFD_BSD], [1], [bfdd])
1548 AM_CONDITIONAL([BFDD], [test "x$BFDD" = "xbfdd"])
1550 if test "$ac_cv_lib_json_c_json_object_get" = no -a "x$BFDD" = "xbfdd"; then
1551 AC_MSG_ERROR(["you must use json-c library to use bfdd"])
1557 if test "${enable_nhrpd}" != "no"; then
1562 if test "${enable_nhrpd}" = "yes"; then
1563 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1567 AM_CONDITIONAL([NHRPD], [test "x$NHRPD" = "xnhrpd"])
1569 AM_CONDITIONAL([EIGRPD], [test "${enable_eigrpd}" != "no"])
1571 if test "${enable_watchfrr}" = "no";then
1576 AM_CONDITIONAL([WATCHFRR], [test "x$WATCHFRR" = "xwatchfrr"])
1579 if test "${enable_ospfapi}" != "no";then
1580 AC_DEFINE([SUPPORT_OSPF_API], [1], [OSPFAPI])
1582 if test "${enable_ospfclient}" != "no";then
1583 OSPFCLIENT="ospfclient"
1587 AM_CONDITIONAL([OSPFCLIENT], [test "x$OSPFCLIENT" = "xospfclient"])
1588 AM_CONDITIONAL([RIPNGD], [test "${enable_ripngd}" != "no"])
1589 AM_CONDITIONAL([BABELD], [test "${enable_babeld}" != "no"])
1590 AM_CONDITIONAL([OSPF6D], [test "${enable_ospf6d}" != "no"])
1591 AM_CONDITIONAL([ISISD], [test "${enable_isisd}" != "no"])
1592 AM_CONDITIONAL([PIMD], [test "${enable_pimd}" != "no"])
1593 AM_CONDITIONAL([PBRD], [test "${enable_pbrd}" != "no"])
1594 AM_CONDITIONAL([SHARPD], [test "${enable_sharpd}" = "yes"])
1595 AM_CONDITIONAL([STATICD], [test "${enable_staticd}" != "no"])
1596 AM_CONDITIONAL([FABRICD], [test "${enable_fabricd}" != "no"])
1598 if test "${enable_bgp_announce}" = "no";then
1599 AC_DEFINE([DISABLE_BGP_ANNOUNCE], [1], [Disable BGP installation to zebra])
1601 AC_DEFINE([DISABLE_BGP_ANNOUNCE], [0], [Disable BGP installation to zebra])
1604 if test "${enable_bgp_vnc}" != "no";then
1605 AC_DEFINE([ENABLE_BGP_VNC], [1], [Enable BGP VNC support])
1607 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1610 AC_CHECK_LIB([crypt], [crypt], [],
1611 [AC_CHECK_LIB([crypto], [DES_crypt])])
1612 AC_CHECK_LIB([resolv], [res_init])
1614 dnl ---------------------------
1615 dnl check system has PCRE regexp
1616 dnl ---------------------------
1617 if test "x$enable_pcreposix" = "xyes"; then
1618 AC_CHECK_LIB([pcreposix], [regexec], [], [
1619 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1622 AC_SUBST([HAVE_LIBPCREPOSIX])
1624 dnl ------------------
1625 dnl check C-Ares library
1626 dnl ------------------
1627 if test "${NHRPD}" != ""; then
1628 PKG_CHECK_MODULES([CARES], [libcares], ,[
1629 AC_MSG_ERROR([trying to build nhrpd, but libcares not found. install c-ares and its -dev headers.])
1634 dnl ------------------
1635 dnl check Net-SNMP library
1636 dnl ------------------
1637 if test "${enable_snmp}" != "" -a "${enable_snmp}" != "no"; then
1638 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1639 if test x"$NETSNMP_CONFIG" = x"no"; then
1640 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1642 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1643 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1644 # net-snmp lists all of its own dependencies. we absolutely do not want that
1645 # among other things we avoid a GPL vs. OpenSSL license conflict here
1646 for removelib in crypto ssl sensors pci wrap; do
1647 SNMP_LIBS="`echo $SNMP_LIBS | sed -e 's/\(^\|\s\)-l'$removelib'\b/ /g' -e 's/\(^\|\s\)\([^\s]*\/\)\?lib'$removelib'\.[^\s]\+\b/ /g'`"
1649 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1650 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
1658 AC_MSG_ERROR([--enable-snmp given but not usable])])
1659 case "${enable_snmp}" in
1664 SNMP_METHOD="${enable_snmp}"
1667 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use yes or agentx])
1670 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1671 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,[SNMP method to interface with snmpd])
1673 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1674 AC_SUBST([SNMP_LIBS])
1675 AC_SUBST([SNMP_CFLAGS])
1680 PKG_CHECK_MODULES([LIBYANG], [libyang >= 0.16.7], , [
1681 AC_MSG_ERROR([libyang (>= 0.16.7) was not found on your system.])
1683 ac_cflags_save="$CFLAGS"
1684 CFLAGS="$CFLAGS $LIBYANG_CFLAGS"
1685 AC_CHECK_MEMBER([struct lyd_node.priv], [], [
1686 AC_MSG_ERROR([m4_normalize([
1687 libyang needs to be compiled with ENABLE_LYD_PRIV=ON.
1688 Instructions for this are included in the build documentation for your platform at http://docs.frrouting.org/projects/dev-guide/en/latest/building.html])
1690 ], [[#include <libyang/libyang.h>]])
1691 CFLAGS="$ac_cflags_save"
1693 ac_libs_save="$LIBS"
1694 LIBS="$LIBS $LIBYANG_LIBS"
1695 AC_CHECK_FUNC([ly_register_types], [
1696 libyang_ext_builtin=true
1697 AC_DEFINE([LIBYANG_EXT_BUILTIN], [1], [have ly_register_types()])
1699 libyang_ext_builtin=false
1700 AC_MSG_WARN([===== old libyang (before 0.16.74) detected =====])
1701 AC_MSG_WARN([The available version of libyang does not seem to support])
1702 AC_MSG_WARN([built-in YANG extension modules. This will cause "make check"])
1703 AC_MSG_WARN([to fail and may create installation and version mismatch issues.])
1704 AC_MSG_WARN([Support for the old mechanism will be removed at some point.])
1705 AC_MSG_WARN([Please update libyang to version 0.16.74 or newer.])
1706 AC_MSG_WARN([===== old libyang (before 0.16.74) detected =====])
1708 AM_CONDITIONAL([LIBYANG_EXT_BUILTIN], [$libyang_ext_builtin])
1709 LIBS="$ac_libs_save"
1712 dnl configuration rollbacks
1715 if test "$enable_config_rollbacks" = "yes"; then
1716 PKG_CHECK_MODULES([SQLITE3], [sqlite3], [
1717 AC_DEFINE([HAVE_CONFIG_ROLLBACKS], [1], [Enable configuration rollbacks])
1718 AC_DEFINE([HAVE_SQLITE3], [1], [Enable sqlite3 database])
1721 AC_MSG_ERROR([--enable-config-rollbacks given but sqlite3 was not found on your system.])
1724 AM_CONDITIONAL([SQLITE3], [$SQLITE3])
1729 if test "$enable_confd" != "" -a "$enable_confd" != "no"; then
1730 AC_CHECK_PROG([CONFD], [confd], [confd], [/bin/false], "${enable_confd}/bin")
1731 if test "x$CONFD" = "x/bin/false"; then
1732 AC_MSG_ERROR([confd was not found on your system.])]
1734 CONFD_CFLAGS="-I${enable_confd}/include -L${enable_confd}/lib"
1735 AC_SUBST([CONFD_CFLAGS])
1736 CONFD_LIBS="-lconfd"
1737 AC_SUBST([CONFD_LIBS])
1738 AC_DEFINE([HAVE_CONFD], [1], [Enable confd integration])
1740 AM_CONDITIONAL([CONFD], [test "x$enable_confd" != "x"])
1745 if test "$enable_sysrepo" = "yes"; then
1746 PKG_CHECK_MODULES([SYSREPO], [libsysrepo],
1747 [AC_DEFINE([HAVE_SYSREPO], [1], [Enable sysrepo integration])
1750 AC_MSG_ERROR([sysrepo was not found on your system.])]
1753 AM_CONDITIONAL([SYSREPO], [test "x$enable_sysrepo" = "xyes"])
1758 AC_SEARCH_LIBS([sqrt], [m])
1763 AC_SEARCH_LIBS([dlopen], [dl dld], [], [
1764 AC_MSG_ERROR([unable to find the dlopen()])
1767 AC_CHECK_HEADERS([link.h])
1769 AC_CACHE_CHECK([for dlinfo(RTLD_DI_ORIGIN)], [frr_cv_rtld_di_origin], [
1770 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1778 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1780 frr_cv_rtld_di_origin=yes
1782 frr_cv_rtld_di_origin=no
1785 if test "$frr_cv_rtld_di_origin" = yes; then
1786 AC_DEFINE([HAVE_DLINFO_ORIGIN], [1], [Have dlinfo RTLD_DI_ORIGIN])
1789 AC_CACHE_CHECK([for dlinfo(RTLD_DI_LINKMAP)], [frr_cv_rtld_di_linkmap], [
1790 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1797 struct link_map *lm = NULL;
1798 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1800 frr_cv_rtld_di_linkmap=yes
1802 frr_cv_rtld_di_linkmap=no
1805 if test "$frr_cv_rtld_di_linkmap" = yes; then
1806 AC_DEFINE([HAVE_DLINFO_LINKMAP], [1], [Have dlinfo RTLD_DI_LINKMAP])
1809 AM_CONDITIONAL([SNMP], [test "x$SNMP_METHOD" = "xagentx"])
1811 dnl ---------------------------
1812 dnl sockaddr and netinet checks
1813 dnl ---------------------------
1816 struct vifctl, struct mfcctl, struct sioc_sg_req,
1817 vifi_t, struct sioc_vif_req, struct igmpmsg,
1818 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1819 struct nd_opt_adv_interval, struct rt_addrinfo,
1820 struct nd_opt_homeagent_info, struct nd_opt_adv_interval,
1821 struct nd_opt_rdnss, struct nd_opt_dnssl],
1822 [], [], FRR_INCLUDES)
1824 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1825 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1826 struct sockaddr_dl.sdl_len,
1827 struct if6_aliasreq.ifra_lifetime,
1828 struct nd_opt_adv_interval.nd_opt_ai_type],
1829 [], [], FRR_INCLUDES)
1831 dnl ---------------------------
1832 dnl IRDP/pktinfo/icmphdr checks
1833 dnl ---------------------------
1835 AC_CHECK_TYPES([struct in_pktinfo], [
1836 AC_CHECK_TYPES([struct icmphdr], [
1845 case "${enable_irdp}" in
1847 $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1854 AM_CONDITIONAL([IRDP], [$IRDP])
1856 dnl -----------------------
1857 dnl checking for IP_PKTINFO
1858 dnl -----------------------
1859 AC_MSG_CHECKING([for IP_PKTINFO])
1860 AC_TRY_COMPILE([#include <netdb.h>], [
1861 int opt = IP_PKTINFO;
1863 AC_MSG_RESULT([yes])
1864 AC_DEFINE([HAVE_IP_PKTINFO], [1], [Have IP_PKTINFO])
1869 dnl ---------------------------
1870 dnl checking for IP_RECVDSTADDR
1871 dnl ---------------------------
1872 AC_MSG_CHECKING([for IP_RECVDSTADDR])
1873 AC_TRY_COMPILE([#include <netinet/in.h>], [
1874 int opt = IP_RECVDSTADDR;
1876 AC_MSG_RESULT([yes])
1877 AC_DEFINE([HAVE_IP_RECVDSTADDR], [1], [Have IP_RECVDSTADDR])
1882 dnl ----------------------
1883 dnl checking for IP_RECVIF
1884 dnl ----------------------
1885 AC_MSG_CHECKING([for IP_RECVIF])
1886 AC_TRY_COMPILE([#include <netinet/in.h>], [
1887 int opt = IP_RECVIF;
1889 AC_MSG_RESULT([yes])
1890 AC_DEFINE([HAVE_IP_RECVIF], [1], [Have IP_RECVIF])
1895 dnl ----------------------
1896 dnl checking for SO_BINDANY
1897 dnl ----------------------
1898 AC_MSG_CHECKING([for SO_BINDANY])
1899 AC_TRY_COMPILE([#include <sys/socket.h>], [
1900 int opt = SO_BINDANY;
1902 AC_MSG_RESULT([yes])
1903 AC_DEFINE([HAVE_SO_BINDANY], [1], [Have SO_BINDANY])
1908 dnl ----------------------
1909 dnl checking for IP_FREEBIND
1910 dnl ----------------------
1911 AC_MSG_CHECKING([for IP_FREEBIND])
1912 AC_TRY_COMPILE([#include <netinet/in.h>], [
1913 int opt = IP_FREEBIND;
1915 AC_MSG_RESULT([yes])
1916 AC_DEFINE([HAVE_IP_FREEBIND], [1], [Have IP_FREEBIND])
1921 dnl --------------------------------------
1922 dnl checking for be32dec existence or not
1923 dnl --------------------------------------
1924 AC_CHECK_DECLS([be32enc, be32dec], [], [],
1925 [#include <sys/endian.h>])
1927 dnl --------------------------------------
1928 dnl checking for clock_time monotonic struct and call
1929 dnl --------------------------------------
1930 AC_CHECK_DECL([CLOCK_MONOTONIC],
1931 [AC_CHECK_LIB([rt], [clock_gettime], [LIBS="$LIBS -lrt"])
1932 AC_DEFINE([HAVE_CLOCK_MONOTONIC], [1], [Have monotonic clock])
1933 ], [AC_MSG_RESULT([no])], [FRR_INCLUDES])
1935 dnl --------------------------------------
1936 dnl checking for flex and bison
1937 dnl --------------------------------------
1940 AC_MSG_CHECKING([version of flex])
1941 frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1942 frr_ac_flex_version="${frr_ac_flex_version##* }"
1943 AC_MSG_RESULT([$frr_ac_flex_version])
1944 AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
1945 LEX="$SHELL $missing_dir/missing flex"
1946 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1947 AC_MSG_WARN([using pregenerated flex output files])
1949 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1951 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1952 AC_SUBST([LEXLIB], [''])
1956 dnl thanks GNU bison for this b*llshit...
1957 AC_MSG_CHECKING([version of bison])
1958 frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1959 frr_ac_bison_version="${frr_ac_bison_version##* }"
1960 frr_ac_bison_missing="false"
1961 case "x${frr_ac_bison_version}" in
1964 BISON_CLOSEBRACE='"'
1966 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
1969 AC_MSG_RESULT([$frr_ac_bison_version])
1970 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1971 frr_ac_bison_missing="true"
1974 AC_MSG_RESULT([none])
1975 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1976 frr_ac_bison_missing="true"
1980 BISON_CLOSEBRACE='}'
1981 BISON_VERBOSE='-Dparse.error=verbose'
1982 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 or newer])
1985 AC_SUBST([BISON_OPENBRACE])
1986 AC_SUBST([BISON_CLOSEBRACE])
1987 AC_SUBST([BISON_VERBOSE])
1989 if $frr_ac_bison_missing; then
1990 YACC="$SHELL $missing_dir/missing bison -y"
1991 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1992 AC_MSG_WARN([using pregenerated bison output files])
1994 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1998 dnl -------------------
1999 dnl capabilities checks
2000 dnl -------------------
2001 if test "${enable_capabilities}" != "no"; then
2002 AC_MSG_CHECKING([whether prctl PR_SET_KEEPCAPS is available])
2003 AC_TRY_COMPILE([#include <sys/prctl.h>], [prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
2004 [AC_MSG_RESULT([yes])
2005 AC_DEFINE([HAVE_PR_SET_KEEPCAPS], [1], [prctl])
2006 frr_ac_keepcaps="yes"],
2009 if test x"${frr_ac_keepcaps}" = x"yes"; then
2010 AC_CHECK_HEADERS([sys/capability.h])
2012 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
2013 AC_CHECK_LIB([cap], [cap_init],
2014 [AC_DEFINE([HAVE_LCAPS], [1], [Capabilities])
2019 AC_CHECK_HEADERS([priv.h],
2020 [AC_MSG_CHECKING([Solaris style privileges are available])
2021 AC_TRY_COMPILE([#include <priv.h>], [getpflags(PRIV_AWARE);],
2022 [AC_MSG_RESULT([yes])
2023 AC_DEFINE([HAVE_SOLARIS_CAPABILITIES], [1], [getpflags])
2024 frr_ac_scaps="yes"],
2030 if test x"${frr_ac_scaps}" = x"yes" \
2031 -o x"${frr_ac_lcaps}" = x"yes"; then
2032 AC_DEFINE([HAVE_CAPABILITIES], [1], [capabilities])
2037 dnl ---------------------------
2038 dnl check for glibc 'backtrace'
2039 dnl ---------------------------
2040 if test x"${enable_backtrace}" != x"no" ; then
2042 PKG_CHECK_MODULES([UNWIND], [libunwind], [
2043 AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
2048 AC_CHECK_FUNCS([printstack], [
2049 AC_DEFINE([HAVE_PRINTSTACK], [1], [Solaris printstack])
2054 if test "$backtrace_ok" = no; then
2055 AC_CHECK_HEADER([execinfo.h], [
2056 AC_SEARCH_LIBS([backtrace], [execinfo], [
2057 AC_DEFINE([HAVE_GLIBC_BACKTRACE], [1], [Glibc backtrace])
2064 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
2065 dnl user explicitly requested backtrace but we failed to find support
2066 AC_MSG_FAILURE([failed to find backtrace or libunwind support])
2070 dnl -----------------------------------------
2071 dnl check for malloc mallinfo struct and call
2072 dnl this must try and link using LIBS, in
2073 dnl order to check no alternative allocator
2074 dnl has been specified, which might not provide
2075 dnl mallinfo, e.g. such as Umem on Solaris.
2076 dnl -----------------------------------------
2077 AC_CHECK_HEADERS([malloc.h malloc_np.h malloc/malloc.h],,, [FRR_INCLUDES])
2079 AC_CACHE_CHECK([whether mallinfo is available], [frr_cv_mallinfo], [
2080 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2081 #ifdef HAVE_MALLOC_H
2084 #ifdef HAVE_MALLOC_NP_H
2085 #include <malloc_np.h>
2087 #ifdef HAVE_MALLOC_MALLOC_H
2088 #include <malloc/malloc.h>
2091 struct mallinfo ac_x; ac_x = mallinfo ();
2098 if test "$frr_cv_mallinfo" = yes; then
2099 AC_DEFINE([HAVE_MALLINFO], [1], [mallinfo])
2102 AC_MSG_CHECKING([whether malloc_usable_size is available])
2103 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2104 #ifdef HAVE_MALLOC_H
2107 #ifdef HAVE_MALLOC_MALLOC_H
2108 #include <malloc/malloc.h>
2111 size_t ac_x; ac_x = malloc_usable_size(NULL);
2113 AC_MSG_RESULT([yes])
2114 AC_DEFINE([HAVE_MALLOC_USABLE_SIZE], [1], [malloc_usable_size])
2118 AC_MSG_CHECKING([whether malloc_size is available])
2119 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
2120 #ifdef HAVE_MALLOC_H
2123 #ifdef HAVE_MALLOC_MALLOC_H
2124 #include <malloc/malloc.h>
2127 size_t ac_x; ac_x = malloc_size(NULL);
2129 AC_MSG_RESULT([yes])
2130 AC_DEFINE([HAVE_MALLOC_SIZE], [1], [malloc_size])
2139 if test "x$enable_zeromq" != "xno"; then
2140 PKG_CHECK_MODULES([ZEROMQ], [libzmq >= 4.0.0], [
2141 AC_DEFINE([HAVE_ZEROMQ], [1], [Enable ZeroMQ support])
2144 if test "x$enable_zeromq" = "xyes"; then
2145 AC_MSG_ERROR([configuration specifies --enable-zeromq but libzmq was not found])
2149 AM_CONDITIONAL([ZEROMQ], [test "x$ZEROMQ" = "xtrue"])
2154 dev_version=`echo $VERSION | grep dev`
2155 #don't expire deprecated code in non 'dev' branch
2156 if test "${dev_version}" = ""; then
2159 CONFDATE=`date '+%Y%m%d'`
2161 AC_SUBST([CONFDATE])
2163 dnl ------------------------------
2164 dnl set paths for state directory
2165 dnl ------------------------------
2166 AC_MSG_CHECKING([directory to use for state file])
2167 if test "${prefix}" = "NONE"; then
2168 frr_statedir_prefix="";
2170 frr_statedir_prefix=${prefix}
2172 if test "${localstatedir}" = '${prefix}/var'; then
2173 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
2174 ${frr_statedir_prefix}/var/adm dnl
2175 ${frr_statedir_prefix}/etc dnl
2181 test -d $FRR_STATE_DIR && break
2183 frr_statedir=$FRR_STATE_DIR
2185 frr_statedir=${localstatedir}
2187 if test $frr_statedir = "/dev/null"; then
2188 AC_MSG_ERROR([STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!])
2190 AC_MSG_RESULT([${frr_statedir}])
2191 AC_SUBST([frr_statedir])
2193 AC_DEFINE_UNQUOTED([LDPD_SOCKET], ["$frr_statedir/ldpd.sock"], [ldpd control socket])
2194 AC_DEFINE_UNQUOTED([ZEBRA_SERV_PATH], ["$frr_statedir/zserv.api"], [zebra api socket])
2195 AC_DEFINE_UNQUOTED([BFDD_CONTROL_SOCKET], ["$frr_statedir/bfdd.sock"], [bfdd control socket])
2196 AC_DEFINE_UNQUOTED([DAEMON_VTY_DIR], ["$frr_statedir"], [daemon vty directory])
2197 AC_DEFINE_UNQUOTED([DAEMON_DB_DIR], ["$frr_statedir"], [daemon database directory])
2199 dnl autoconf does this, but it does it too late...
2200 test "x$prefix" = xNONE && prefix=$ac_default_prefix
2201 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
2203 dnl get the full path, recursing through variables...
2204 vtysh_bin="$bindir/vtysh"
2205 for I in 1 2 3 4 5 6 7 8 9 10; do
2206 eval vtysh_bin="\"$vtysh_bin\""
2208 AC_DEFINE_UNQUOTED([VTYSH_BIN_PATH], ["$vtysh_bin"], [path to vtysh binary])
2209 AC_SUBST([vtysh_bin])
2211 CFG_SYSCONF="$sysconfdir"
2213 CFG_STATE="$frr_statedir"
2214 CFG_MODULE="$moduledir"
2215 CFG_YANGMODELS="$yangmodelsdir"
2216 CFG_LIBYANG_PLUGINS="$libyang_pluginsdir"
2217 for I in 1 2 3 4 5 6 7 8 9 10; do
2218 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
2219 eval CFG_SBIN="\"$CFG_SBIN\""
2220 eval CFG_STATE="\"$CFG_STATE\""
2221 eval CFG_MODULE="\"$CFG_MODULE\""
2222 eval CFG_YANGMODELS="\"$CFG_YANGMODELS\""
2223 eval CFG_LIBYANG_PLUGINS="\"$CFG_LIBYANG_PLUGINS\""
2225 AC_SUBST([CFG_SYSCONF])
2226 AC_SUBST([CFG_SBIN])
2227 AC_SUBST([CFG_STATE])
2228 AC_SUBST([CFG_MODULE])
2229 AC_SUBST([CFG_YANGMODELS])
2230 AC_SUBST([CFG_LIBYANG_PLUGINS])
2231 AC_DEFINE_UNQUOTED([MODULE_PATH], ["$CFG_MODULE"], [path to modules])
2232 AC_DEFINE_UNQUOTED([YANG_MODELS_PATH], ["$CFG_YANGMODELS"], [path to YANG data models])
2233 AC_DEFINE_UNQUOTED([LIBYANG_PLUGINS_PATH], ["$CFG_LIBYANG_PLUGINS"], [path to libyang plugins])
2234 AC_DEFINE_UNQUOTED([WATCHFRR_SH_PATH], ["${CFG_SBIN%/}/watchfrr.sh"], [path to watchfrr.sh])
2236 dnl ------------------------------------
2237 dnl Enable RPKI and add librtr to libs
2238 dnl ------------------------------------
2239 if test "${enable_rpki}" = "yes"; then
2240 PKG_CHECK_MODULES([RTRLIB], [rtrlib >= 0.5.0],
2243 AC_MSG_ERROR([rtrlib was not found on your system or is too old.])]
2246 AM_CONDITIONAL([RPKI], [test "x$RPKI" = "xtrue"])
2248 dnl ------------------------------------------
2249 dnl Check whether rtrlib was build with ssh support
2250 dnl ------------------------------------------
2251 AC_MSG_CHECKING([whether the RTR Library is compiled with SSH])
2252 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "rtrlib/rtrlib.h"]],
2253 [[struct tr_ssh_config config;]])],
2254 [AC_MSG_RESULT([yes])
2255 AC_DEFINE([FOUND_SSH], [1], [found_ssh])],
2259 dnl ---------------------------
2260 dnl Check htonl works correctly
2261 dnl ---------------------------
2262 AC_MSG_CHECKING([for working htonl])
2263 AC_CACHE_VAL(ac_cv_htonl_works,
2264 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
2265 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
2268 AC_MSG_RESULT([$ac_cv_htonl_works])
2270 AC_CONFIG_FILES([Makefile],[sed -e 's/^#AUTODERP# //' -i Makefile])
2278 snapcraft/snapcraft.yaml
2280 tests/lib/cli/test_cli.refout
2281 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
2282 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
2285 AC_CONFIG_FILES([vtysh/extract.pl], [chmod +x vtysh/extract.pl])
2286 AC_CONFIG_FILES([tools/frr], [chmod +x tools/frr])
2287 AC_CONFIG_FILES([tools/watchfrr.sh], [chmod +x tools/watchfrr.sh])
2288 AC_CONFIG_FILES([tools/frrinit.sh], [chmod +x tools/frrinit.sh])
2289 AC_CONFIG_FILES([tools/frrcommon.sh])
2291 AC_CONFIG_COMMANDS([lib/route_types.h], [
2292 dst="${ac_abs_top_builddir}/lib/route_types.h"
2293 ${PERL} "${ac_abs_top_srcdir}/lib/route_types.pl" \
2294 < "${ac_abs_top_srcdir}/lib/route_types.txt" \
2297 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2298 && rm "${dst}.tmp" \
2299 || mv "${dst}.tmp" "${dst}"
2304 AS_IF([test "x$with_pkg_git_version" = "xyes"], [
2305 AC_CONFIG_COMMANDS([lib/gitversion.h], [
2306 dst="${ac_abs_top_builddir}/lib/gitversion.h"
2307 ${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
2308 "${ac_abs_top_srcdir}" \
2311 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2312 && rm "${dst}.tmp" \
2313 || mv "${dst}.tmp" "${dst}"
2319 ## Hack, but working solution to avoid rebuilding of frr.info.
2320 ## It's already in CVS until texinfo 4.7 is more common.
2324 FRRouting configuration
2325 ------------------------------
2326 FRR version : ${PACKAGE_VERSION}
2327 host operating system : ${host_os}
2328 source code location : ${srcdir}
2330 compiler flags : ${CFLAGS} ${SAN_FLAGS}
2332 linker flags : ${LDFLAGS} ${SAN_FLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
2333 state file directory : ${frr_statedir}
2334 config file directory : `eval echo \`echo ${sysconfdir}\``
2335 example directory : `eval echo \`echo ${exampledir}\``
2336 module directory : ${CFG_MODULE}
2337 user to run as : ${enable_user}
2338 group to run as : ${enable_group}
2339 group for vty sockets : ${enable_vty_group}
2340 config file mask : ${enable_configfile_mask}
2341 log file mask : ${enable_logfile_mask}
2342 zebra protobuf enabled : ${enable_protobuf:-no}
2344 The above user and group must have read/write access to the state file
2345 directory and to the config files in the config file directory."
2347 if test "${enable_doc}" != "no";then
2348 AS_IF([test "$SPHINXBUILD" = /bin/false],
2349 AC_MSG_WARN([sphinx-build is missing but required to build documentation]))