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], [9.0-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])
21 AC_CONFIG_AUX_DIR([m4/ac])
23 dnl -----------------------------------
24 dnl Get hostname and other information.
25 dnl -----------------------------------
29 AC_ARG_VAR([AR],[archiver command])
30 AC_ARG_VAR([LD],[linker command])
31 AC_ARG_VAR([OBJCOPY],[objcopy command])
32 AC_ARG_VAR([OBJDUMP],[objdump command])
33 AC_ARG_VAR([RANLIB],[ranlib command])
34 AC_ARG_VAR([STRIP],[strip command])
36 hosttools_clippy="false"
39 dnl case 1: external clippy
40 if test -n "$with_clippy" -a "$with_clippy" != "no" -a "$with_clippy" != "yes"; then
41 if test "$enable_clippy_only" = "yes"; then
42 AC_MSG_ERROR([--enable-clippy-only does not make sense with --with-clippy])
47 if test ! -x "$with_clippy"; then
48 AC_MSG_ERROR([clippy tool ($with_clippy) is not executable])
51 dnl case 2: cross-compiling internal clippy
52 elif test "$host" != "$build"; then
53 if test "$srcdir" = "."; then
54 AC_MSG_ERROR([cross-compilation is only possible with builddir separate from srcdir or by building clippy separately and using the --with-clippy option. create a separate directory and run as .../path-to-frr/configure.])
56 test -d hosttools || mkdir hosttools
57 abssrc="`cd \"${srcdir}\"; pwd`"
60 AC_MSG_NOTICE([... cross-compilation: creating hosttools directory and self-configuring for build platform tools])
61 AC_MSG_NOTICE([... use HOST_CPPFLAGS / HOST_CFLAGS / HOST_LDFLAGS if necessary])
65 for var in $ac_precious_vars; do
68 YACC|YFLAGS) continue;;
69 PYTHON*) retain=true;;
73 eval "hostvar=\"\${HOST_$var}\""
74 eval "targetvar=\"\${$var}\""
75 if test -n "$hostvar"; then
76 eval "$var='$hostvar'"
77 _AS_ECHO_LOG([host $var='$hostvar'])
79 _AS_ECHO_LOG([host retain $var='$targetvar'])
82 _AS_ECHO_LOG([host unset $var])
86 "${abssrc}/configure" "--host=$build" "--build=$build" "--enable-clippy-only" "--disable-nhrpd" "--disable-vtysh"
90 AC_MSG_NOTICE([... cross-compilation: finished self-configuring for build platform tools])
94 hosttools_clippy="true"
95 CLIPPY="hosttools/lib/clippy"
97 dnl case 3: normal build internal clippy
99 CLIPPY="lib/clippy\$(EXEEXT)"
102 AM_CONDITIONAL([BUILD_CLIPPY], [$build_clippy])
103 AM_CONDITIONAL([HOSTTOOLS_CLIPPY], [$hosttools_clippy])
104 AM_CONDITIONAL([ONLY_CLIPPY], [test "$enable_clippy_only" = "yes"])
106 # Disable portability warnings -- our automake code (in particular
107 # common.am) uses some constructs specific to gmake.
108 AM_INIT_AUTOMAKE([1.12 -Wno-portability foreign])
109 m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
110 AM_SILENT_RULES([yes])
111 AC_CONFIG_HEADERS([config.h])
113 AC_PATH_PROG([PERL], [perl])
116 dnl default is to match previous behavior
118 AC_ARG_ENABLE([pkgsrcrcdir],
119 AS_HELP_STRING([--enable-pkgsrcrcdir],
120 [specify directory for rc.d scripts]),
121 pkgsrcrcdir="$enableval",)
122 dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
123 AC_SUBST([pkgsrcrcdir])
124 AM_CONDITIONAL([PKGSRC], [test "$pkgsrcrcdir" != ""])
126 AC_ARG_WITH([moduledir], [AS_HELP_STRING([--with-moduledir=DIR], [module directory (${libdir}/frr/modules)])], [
129 moduledir="\${libdir}/frr/modules"
131 AC_SUBST([moduledir], [$moduledir])
133 AC_ARG_WITH([scriptdir], [AS_HELP_STRING([--with-scriptdir=DIR], [script directory (${sysconfdir}/scripts)])], [
136 scriptdir="\${sysconfdir}/scripts"
138 AC_SUBST([scriptdir], [$scriptdir])
140 AC_ARG_WITH([yangmodelsdir], [AS_HELP_STRING([--with-yangmodelsdir=DIR], [yang models directory (${datarootdir}/yang)])], [
141 yangmodelsdir="$withval"
143 yangmodelsdir="\${datarootdir}/yang"
145 AC_SUBST([yangmodelsdir])
147 AC_ARG_WITH([vici-socket], [AS_HELP_STRING([--with-vici-socket=PATH], [vici-socket (/var/run/charon.vici)])], [
148 vici_socket="$withval"
150 vici_socket="/var/run/charon.vici"
152 AC_DEFINE_UNQUOTED([VICI_SOCKET], ["$vici_socket"], [StrongSWAN vici socket path])
154 AC_ARG_ENABLE(tcmalloc,
155 AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
156 [case "${enableval}" in
157 yes) tcmalloc_enabled=true
158 LIBS="$LIBS -ltcmalloc_minimal"
160 no) tcmalloc_enabled=false ;;
161 *) AC_MSG_ERROR([bad value ${enableval} for --enable-tcmalloc]) ;;
162 esac],[tcmalloc_enabled=false])
165 dnl Thanks autoconf, but we don't want a default -g -O2. We have our own
166 dnl flag determination logic.
169 dnl --------------------
170 dnl Check CC and friends
171 dnl --------------------
172 dnl note orig_cflags is also used further down
173 orig_cflags="$CFLAGS"
174 orig_cxxflags="$CXXFLAGS"
180 dnl remove autoconf default "-g -O2"
181 CFLAGS="$orig_cflags"
182 CXXFLAGS="$orig_cxxflags"
184 dnl Some special handling for ICC later on
185 if test "$CC" = "icc"; then
191 dnl it's 2019, sed is sed.
195 dnl try and enable CFLAGS that are useful for FRR
196 dnl - specifically, options to control warnings
198 AC_SUBST([AC_CFLAGS])
199 AC_USE_SYSTEM_EXTENSIONS
200 AC_DEFUN([AC_C_FLAG], [{
201 m4_pushdef([cachename],[m4_translit([frr_cv_$1],[ =-+/{}$],[________])])
202 AC_CACHE_CHECK([[whether $CC supports $1]], cachename, [
204 ac_c_flag_save="$CFLAGS"
207 [AC_LANG_PROGRAM([[$4]])],
213 CFLAGS="$ac_c_flag_save"
216 if test "$cachename" = "yes"; then
217 m4_if([$3], [], [AC_CFLAGS="$AC_CFLAGS $1"], [$3])
222 m4_popdef([cachename])
225 AC_DEFUN([AC_LINK_IFELSE_FLAGS], [{
227 ac_cflags_save="$CFLAGS"
234 CFLAGS="$ac_cflags_save"
240 CFLAGS="$ac_cflags_save"
249 dnl ICC won't bail on unknown options without -diag-error 10006
250 dnl need to do this first so we get useful results for the other options
251 if test "$cc_is_icc" = "yes"; then
252 AC_C_FLAG([-diag-error 10006])
255 dnl autoconf 2.69 AC_PROG_CC_C99 is "state of the art"
256 dnl autoconf 2.70 AC_PROG_CC_C99 is deprecated and AC_PROC_CC tries to do C11
257 m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.70]), [-1], [dnl
261 dnl AC_PROG_CC_C99 may change CC to include -std=gnu99 or something
263 CC="${CC% -std=gnu99}"
266 AC_C_FLAG([-std=gnu11], [CC="$ac_cc"], [CC="$CC -std=gnu11"])
269 if test "$ac_cv_prog_cc_c11" = "no"; then
270 AC_MSG_ERROR([ISO C11 compiler support (with GNU extensions) is required.])
274 dnl if the user has specified any CFLAGS, override our settings
275 if test "$enable_gcov" = "yes"; then
276 if test "$orig_cflags" = ""; then
277 AC_C_FLAG([--coverage])
281 AC_LDFLAGS="${AC_LDFLAGS} --coverage"
284 if test "$enable_clang_coverage" = "yes"; then
285 AC_C_FLAG([-fprofile-instr-generate], [
286 AC_MSG_ERROR([$CC does not support -fprofile-instr-generate.])
288 AC_C_FLAG([-fcoverage-mapping], [
289 AC_MSG_ERROR([$CC does not support -fcoverage-mapping.])
293 AM_CONDITIONAL([SCRIPTING], [test "$enable_scripting" = "yes"])
295 if test "$enable_scripting" = "yes"; then
296 AX_PROG_LUA([5.3], [5.4], [], [
297 AC_MSG_ERROR([Lua 5.3 is required to build with Lua support. No other version is supported.])
300 AC_MSG_ERROR([Lua 5.3 headers are required to build with Lua support. No other version is supported.])
303 AC_DEFINE([HAVE_SCRIPTING], [1], [Have support for scripting])
304 LIBS="$LIBS $LUA_LIB"
308 AC_MSG_ERROR([Lua 5.3 libraries are required to build with Lua support. No other version is supported.])
312 dnl the following flags go in CFLAGS rather than AC_CFLAGS since they make
313 dnl sense to be overridden by the user
314 if test "$enable_dev_build" = "yes"; then
315 AC_DEFINE([DEV_BUILD], [1], [Build for development])
316 if test "$orig_cflags" = ""; then
317 AC_C_FLAG([-O0],,[CFLAGS="$CFLAGS -O0"])
318 AC_C_FLAG([-g3],,[CFLAGS="$CFLAGS -g3"])
319 AC_C_FLAG([-ggdb3],,[CFLAGS="$CFLAGS -ggdb3"])
322 if test "$orig_cflags" = ""; then
323 AC_C_FLAG([-g],,[CFLAGS="$CFLAGS -g"])
324 AC_C_FLAG([-O2],,[CFLAGS="$CFLAGS -O2"])
328 dnl just stick -g into LDFLAGS, if we don't have it in CFLAGS it won't do much
329 LDFLAGS="$LDFLAGS -g"
331 AM_CONDITIONAL([DEV_BUILD], [test "$enable_dev_build" = "yes"])
333 dnl -fms-extensions causes clang to have a built-in __wchar_t on OpenBSD,
334 dnl which just straight up breaks compiling any code.
335 dnl (2022-04-04 / OpenBSD 7 / clang 11.1.0)
336 AH_VERBATIM([OpenBSD], [
338 #define __wchar_t __wchar_t_ignore
344 dnl always want these CFLAGS
345 AC_C_FLAG([-fms-extensions], [
346 AC_MSG_ERROR([$CC does not support unnamed struct fields (-fms-extensions)])
348 AC_C_FLAG([-fno-omit-frame-pointer])
349 AC_C_FLAG([-funwind-tables])
352 AC_C_FLAG([-Wformat-nonliteral])
353 AC_C_FLAG([-Wformat-security])
354 AC_C_FLAG([-Wswitch-enum])
355 AC_C_FLAG([-Wstrict-prototypes])
356 AC_C_FLAG([-Wmissing-prototypes])
357 AC_C_FLAG([-Wmissing-declarations])
358 AC_C_FLAG([-Wpointer-arith])
359 AC_C_FLAG([-Wbad-function-cast])
360 AC_C_FLAG([-Wwrite-strings])
362 if test "$enable_gcc_ultra_verbose" = "yes" ; then
363 AC_C_FLAG([-Wcast-qual])
364 AC_C_FLAG([-Wmissing-noreturn])
365 AC_C_FLAG([-Wmissing-format-attribute])
366 AC_C_FLAG([-Wunreachable-code])
367 AC_C_FLAG([-Wpacked])
368 AC_C_FLAG([-Wpadded])
369 AC_C_FLAG([-Wshadow])
371 AC_C_FLAG([-Wno-unused-result])
373 AC_C_FLAG([-Wno-unused-parameter])
374 AC_C_FLAG([-Wno-missing-field-initializers])
376 AC_C_FLAG([-Wc++-compat], [], [CXX_COMPAT_CFLAGS="-Wc++-compat"])
377 AC_SUBST([CXX_COMPAT_CFLAGS])
379 dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
380 dnl for some reason the string consts get 'promoted' to char *,
381 dnl triggering a const to non-const conversion warning.
382 if test "$cc_is_icc" = "yes"; then
383 AC_C_FLAG([-diag-disable 3179])
386 if test "$enable_werror" = "yes" ; then
392 if test "$enable_address_sanitizer" = "yes"; then
393 AC_C_FLAG([-fsanitize=address], [
394 AC_MSG_ERROR([$CC does not support Address Sanitizer.])
396 SAN_FLAGS="$SAN_FLAGS -fsanitize=address"
399 if test "$enable_thread_sanitizer" = "yes"; then
400 AC_C_FLAG([-fsanitize=thread], [
401 AC_MSG_ERROR([$CC does not support Thread Sanitizer.])
403 SAN_FLAGS="$SAN_FLAGS -fsanitize=thread"
406 if test "$enable_memory_sanitizer" = "yes"; then
407 AC_C_FLAG([-fsanitize=memory -fPIE -pie], [
408 AC_MSG_ERROR([$CC does not support Memory Sanitizer.])
410 SAN_FLAGS="$SAN_FLAGS -fsanitize=memory -fPIE -pie"
413 if test "$enable_undefined_sanitizer" = "yes"; then
414 AC_C_FLAG([-fsanitize=undefined], [
415 AC_MSG_ERROR([$CC does not support UndefinedBehaviorSanitizer.])
417 SAN_FLAGS="$SAN_FLAGS -fsanitize=undefined"
420 AC_SUBST([SAN_FLAGS])
423 if test "$with_frr_format" != "no" -a "$with_frr_format" != "yes" -a -n "$with_frr_format"; then
424 AC_C_FLAG([-fplugin=${with_frr_format}], [
425 AC_MSG_ERROR([specified frr-format plugin ($with_frr_format) does not work])
427 #ifndef _FRR_ATTRIBUTE_PRINTFRR
428 #error plugin not loaded
430 #if _FRR_ATTRIBUTE_PRINTFRR < 0x10000
431 #error plugin too old
434 elif test "$with_frr_format" = "no"; then
437 AC_C_FLAG([-fplugin=tools/gcc-plugins/frr-format.so],[
438 AC_C_FLAG([-fplugin=frr-format],[
439 if test "$with_frr_format" = "yes"; then
440 AC_MSG_ERROR([frr-format plugin requested but not found])
443 #ifndef _FRR_ATTRIBUTE_PRINTFRR
444 #error plugin not loaded
446 #if _FRR_ATTRIBUTE_PRINTFRR < 0x10000
447 #error plugin too old
451 #ifndef _FRR_ATTRIBUTE_PRINTFRR
452 #error plugin not loaded
454 #if _FRR_ATTRIBUTE_PRINTFRR < 0x10000
455 #error plugin too old
460 AC_MSG_CHECKING([whether linker supports __start/stop_section symbols])
461 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
463 int __attribute__((section("secttest"))) var = 1;
464 extern int __start_secttest, __stop_secttest;
466 void *a = &var, *b = &__start_secttest, *c = &__stop_secttest;
467 printf("%p %p %p\n", a, b, c);
470 AC_DEFINE(HAVE_SECTION_SYMS, 1, [have __start/stop_section symbols])
481 AC_CFLAGS="$AC_CFLAGS $PTHREAD_CFLAGS"
482 LIBS="$PTHREAD_LIBS $LIBS"
484 AC_MSG_FAILURE([This FRR version needs pthreads])
487 orig_cflags="$CFLAGS"
488 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
490 AC_SEARCH_LIBS([pthread_condattr_setclock], [],
491 [frr_cv_pthread_condattr_setclock=yes],
492 [frr_cv_pthread_condattr_setclock=no])
493 if test "$frr_cv_pthread_condattr_setclock" = "yes"; then
494 AC_DEFINE([HAVE_PTHREAD_CONDATTR_SETCLOCK], [1], [Have pthread.h pthread_condattr_setclock])
497 AC_CHECK_HEADERS([pthread_np.h],,, [
500 AC_CHECK_FUNCS([pthread_setname_np pthread_set_name_np pthread_getthreadid_np])
502 CFLAGS="$orig_cflags"
509 AC_CHECK_TOOL([AR], [ar])
514 AC_ARG_ENABLE([static-bin],
515 AS_HELP_STRING([--enable-static-bin], [link binaries statically]))
518 patch -N -i "${srcdir}/m4/libtool-whole-archive.patch" libtool >&AS_MESSAGE_LOG_FD || \
519 AC_MSG_WARN([Could not patch libtool for static linking support. Loading modules into a statically linked daemon will fail.])
520 dnl the -i option is not POSIX sed and the BSDs implement it differently
521 dnl cat'ing the output back instead of mv/cp keeps permissions on libtool intact
522 sed -e 's%func_warning "relinking%true #\0%' libtool > libtool.sed && cat libtool.sed > libtool
523 sed -e 's%func_warning "remember to run%true #\0%' libtool > libtool.sed && cat libtool.sed > libtool
524 sed -e 's%func_warning ".*has not been installed in%true #\0%' libtool > libtool.sed && cat libtool.sed > libtool
525 test -f libtool.sed && rm libtool.sed
527 if test "$enable_static_bin" = "yes"; then
528 AC_LDFLAGS_EXEC="-static"
529 if test "$enable_static" != "yes"; then
530 AC_MSG_ERROR([The --enable-static-bin option must be combined with --enable-static.])
533 if test "$enable_shared" != "yes"; then
534 AC_MSG_ERROR([FRR cannot be built with --disable-shared. If you want statically linked daemons, use --enable-shared --enable-static --enable-static-bin])
536 AC_SUBST([AC_LDFLAGS])
537 AC_SUBST([AC_LDFLAGS_EXEC])
538 AM_CONDITIONAL([STATIC_BIN], [test "$enable_static_bin" = "yes"])
540 dnl libtool, the repository of all knowledge related linkers, is too stupid to
541 dnl correctly tell the linker how to build modules.
542 if test -z "$module_cmds"; then
543 module_cmds="`echo \"$archive_cmds\" | sed -e 's%$wl-soname $wl$soname%%'`"
545 if test -z "$module_expsym_cmds"; then
546 module_expsym_cmds="`echo \"$archive_expsym_cmds\" | sed -e 's%$wl-soname $wl$soname%%'`"
549 AC_ARG_ENABLE([rpath],
550 [AS_HELP_STRING([--enable-rpath], [set hardcoded rpaths in the executable @<:@default=yes@:>@])],
554 dnl $AR and $RANLIB are set by LT_INIT above
555 AC_MSG_CHECKING([whether $AR supports D option])
556 if $AR crD conftest.a >/dev/null 2>/dev/null; then
558 dnl ARFLAGS is for automake, AR_FLAGS for libtool m-(
569 AC_MSG_CHECKING([whether $RANLIB supports D option])
570 if $RANLIB -D conftest.a >conftest.err 2>&1; then
571 if grep -q -- '-D' conftest.err; then
582 test -f conftest.err && rm conftest.err
583 test -f conftest.a && rm conftest.a
585 dnl ----------------------
586 dnl Packages configuration
587 dnl ----------------------
588 if test -f config.version; then
590 elif test -f "${srcdir}/config.version"; then
591 . "${srcdir}/config.version"
593 AC_ARG_WITH([pkg-extra-version],
594 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]), [
595 if test "$withval" = "no"; then
598 EXTRAVERSION=$withval
601 AC_ARG_WITH([pkg-git-version],
602 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
603 [ test "$withval" != "no" && with_pkg_git_version="yes" ])
604 AC_ARG_WITH([clippy],
605 AS_HELP_STRING([--with-clippy=PATH], [use external clippy helper program]))
606 AC_ARG_WITH([vtysh_pager],
607 AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
608 VTYSH_PAGER=$withval, VTYSH_PAGER="more")
609 AC_ARG_ENABLE([vtysh],
610 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for FRR]))
612 AS_HELP_STRING([--disable-doc], [do not build docs]))
613 AC_ARG_ENABLE([doc-html],
614 AS_HELP_STRING([--enable-doc-html], [build HTML docs]))
615 AC_ARG_ENABLE([zebra],
616 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
617 AC_ARG_ENABLE([bgpd],
618 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
619 AC_ARG_ENABLE([ripd],
620 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
621 AC_ARG_ENABLE([ripngd],
622 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
623 AC_ARG_ENABLE([ospfd],
624 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
625 AC_ARG_ENABLE([ospf6d],
626 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
627 AC_ARG_ENABLE([ldpd],
628 AS_HELP_STRING([--disable-ldpd], [do not build ldpd]))
629 AC_ARG_ENABLE([nhrpd],
630 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
631 AC_ARG_ENABLE([eigrpd],
632 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
633 AC_ARG_ENABLE([babeld],
634 AS_HELP_STRING([--disable-babeld], [do not build babeld]))
635 AC_ARG_ENABLE([watchfrr],
636 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
637 AC_ARG_ENABLE([isisd],
638 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
639 AC_ARG_ENABLE([pimd],
640 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
641 AC_ARG_ENABLE([pim6d],
642 AS_HELP_STRING([--disable-pim6d], [do not build pim6d]))
643 AC_ARG_ENABLE([pbrd],
644 AS_HELP_STRING([--disable-pbrd], [do not build pbrd]))
645 AC_ARG_ENABLE([sharpd],
646 AS_HELP_STRING([--enable-sharpd], [build sharpd]))
647 AC_ARG_ENABLE([staticd],
648 AS_HELP_STRING([--disable-staticd], [do not build staticd]))
649 AC_ARG_ENABLE([fabricd],
650 AS_HELP_STRING([--disable-fabricd], [do not build fabricd]))
651 AC_ARG_ENABLE([vrrpd],
652 AS_HELP_STRING([--disable-vrrpd], [do not build vrrpd]))
653 AC_ARG_ENABLE([pathd],
654 AS_HELP_STRING([--disable-pathd], [do not build pathd]))
655 AC_ARG_ENABLE([bgp-announce],
656 AS_HELP_STRING([--disable-bgp-announce], [turn off BGP route announcement]))
657 AC_ARG_ENABLE([bgp-vnc],
658 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
659 AC_ARG_ENABLE([bgp-bmp],
660 AS_HELP_STRING([--disable-bgp-bmp],[turn off BGP BMP support]))
661 AC_ARG_ENABLE([snmp],
662 AS_HELP_STRING([--enable-snmp], [enable SNMP support for agentx]))
663 AC_ARG_ENABLE([config_rollbacks],
664 AS_HELP_STRING([--enable-config-rollbacks], [enable configuration rollbacks (requires sqlite3)]))
665 AC_ARG_ENABLE([confd],
666 AS_HELP_STRING([--enable-confd=ARG], [enable confd integration]))
667 AC_ARG_ENABLE([sysrepo],
668 AS_HELP_STRING([--enable-sysrepo], [enable sysrepo integration]))
669 AC_ARG_ENABLE([grpc],
670 AS_HELP_STRING([--enable-grpc], [enable the gRPC northbound plugin]))
671 AC_ARG_ENABLE([zeromq],
672 AS_HELP_STRING([--enable-zeromq], [enable ZeroMQ handler (libfrrzmq)]))
673 AC_ARG_ENABLE([lttng],
674 AS_HELP_STRING([--enable-lttng], [enable LTTng tracing]))
675 AC_ARG_ENABLE([usdt],
676 AS_HELP_STRING([--enable-usdt], [enable USDT probes]))
677 AC_ARG_WITH([libpam],
678 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
679 AC_ARG_ENABLE([ospfapi],
680 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
681 AC_ARG_ENABLE([ospfclient],
682 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
683 (this is the default if --disable-ospfapi is set)]))
684 AC_ARG_ENABLE([multipath],
685 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
686 AC_ARG_WITH([service_timeout],
687 AS_HELP_STRING([--with-service-timeout=ARG], [set service timeout value (2 minutes by default), ARG must be digit]))
688 AC_ARG_ENABLE([user],
689 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
690 AC_ARG_ENABLE([group],
691 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
692 AC_ARG_ENABLE([vty_group],
693 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
694 AC_ARG_ENABLE([configfile_mask],
695 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
696 AC_ARG_ENABLE([logfile_mask],
697 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
698 AC_ARG_ENABLE([shell_access],
699 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
700 AC_ARG_ENABLE([realms],
701 AS_HELP_STRING([--enable-realms], [enable REALMS support under Linux]))
702 AC_ARG_ENABLE([rtadv],
703 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
704 AC_ARG_ENABLE([irdp],
705 AS_HELP_STRING([--disable-irdp], [disable IRDP server support in zebra (enabled by default if supported)]))
706 AC_ARG_ENABLE([capabilities],
707 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
708 AC_ARG_ENABLE([gcc_ultra_verbose],
709 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
710 AC_ARG_ENABLE([backtrace],
711 AS_HELP_STRING([--disable-backtrace], [disable crash backtraces (default autodetect)]))
712 AC_ARG_ENABLE([time-check],
713 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
714 AC_ARG_ENABLE([cpu-time],
715 AS_HELP_STRING([--disable-cpu-time], [disable cpu usage data gathering]))
716 AC_ARG_ENABLE([pcreposix],
717 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
718 AC_ARG_ENABLE([pcre2posix],
719 AS_HELP_STRING([--enable-pcre2posix], [enable using PCRE2 Posix libs for regex functions]))
721 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
722 AC_ARG_ENABLE([werror],
723 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
724 AC_ARG_ENABLE([cumulus],
725 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
726 AC_ARG_ENABLE([datacenter],
727 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
728 AC_ARG_ENABLE([rr-semantics],
729 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
730 AC_ARG_ENABLE([protobuf],
731 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
732 AC_ARG_ENABLE([oldvpn_commands],
733 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
734 AC_ARG_ENABLE([rpki],
735 AS_HELP_STRING([--enable-rpki], [enable RPKI prefix validation support]))
736 AC_ARG_ENABLE([clippy-only],
737 AS_HELP_STRING([--enable-clippy-only], [Only build clippy]))
738 AC_ARG_ENABLE([numeric_version],
739 AS_HELP_STRING([--enable-numeric-version], [Only numeric digits allowed in version (for Alpine)]))
740 AC_ARG_ENABLE([gcov],
741 AS_HELP_STRING([--enable-gcov], [Collect coverage information with gcov]))
742 AC_ARG_ENABLE([clang_coverage],
743 AS_HELP_STRING([--enable-clang-coverage], [Collect coverage information with Clang Coverage]))
744 AC_ARG_ENABLE([bfdd],
745 AS_HELP_STRING([--disable-bfdd], [do not build bfdd]))
746 AC_ARG_ENABLE([address-sanitizer],
747 AS_HELP_STRING([--enable-address-sanitizer], [enable AddressSanitizer support for detecting a wide variety of memory allocation and deallocation errors]))
748 AC_ARG_ENABLE([thread-sanitizer],
749 AS_HELP_STRING([--enable-thread-sanitizer], [enable ThreadSanitizer support for detecting data races]))
750 AC_ARG_ENABLE([memory-sanitizer],
751 AS_HELP_STRING([--enable-memory-sanitizer], [enable MemorySanitizer support for detecting uninitialized memory reads]))
752 AC_ARG_ENABLE([undefined-sanitizer],
753 AS_HELP_STRING([--enable-undefined-sanitizer], [enable UndefinedBehaviorSanitizer support for detecting undefined behavior]))
754 AC_ARG_WITH([crypto],
755 AS_HELP_STRING([--with-crypto=<internal|openssl>], [choose between different implementations of cryptographic functions(default value is --with-crypto=internal)]))
756 AC_ARG_WITH([frr-format],
757 AS_HELP_STRING([--with-frr-format[=<.../frr-format.so>]], [use frr-format GCC plugin]))
759 AC_ARG_ENABLE([version-build-config],
760 AS_HELP_STRING([--disable-version-build-config], [do not include build configs in show version command]))
762 #if openssl, else use the internal
763 AS_IF([test "$with_crypto" = "openssl"], [
764 AC_CHECK_LIB([crypto], [EVP_DigestInit], [LIBS="$LIBS -lcrypto"], [], [])
765 if test "$ac_cv_lib_crypto_EVP_DigestInit" = "no"; then
766 AC_MSG_ERROR([build with openssl has been specified but openssl library was not found on your system])
768 AC_DEFINE([CRYPTO_OPENSSL], [1], [Compile with openssl support])
770 ], [test "$with_crypto" = "internal" || test "$with_crypto" = "" ], [AC_DEFINE([CRYPTO_INTERNAL], [1], [Compile with internal cryptographic implementation])
771 ], [AC_MSG_ERROR([Unknown value for --with-crypto])]
774 AS_IF([test "$enable_clippy_only" != "yes"], [
775 AC_CHECK_HEADERS([json-c/json.h])
776 AC_CHECK_LIB([json-c], [json_object_get], [LIBS="$LIBS -ljson-c"], [], [-lm])
777 if test "$ac_cv_lib_json_c_json_object_get" = "no"; then
778 AC_CHECK_LIB([json], [json_object_get], [LIBS="$LIBS -ljson"])
779 if test "$ac_cv_lib_json_json_object_get" = "no"; then
780 AC_MSG_ERROR([libjson is needed to compile])
785 AC_ARG_ENABLE([dev_build],
786 AS_HELP_STRING([--enable-dev-build], [build for development]))
788 AC_ARG_ENABLE([scripting],
789 AS_HELP_STRING([--enable-scripting], [Build with scripting support]))
791 AC_ARG_ENABLE([netlink-debug],
792 AS_HELP_STRING([--disable-netlink-debug], [don't pretty print netlink debug messages]))
794 if test "$enable_netlink_debug" != "no" ; then
795 AC_DEFINE([NETLINK_DEBUG], [1], [Netlink extra debugging code])
798 AM_CONDITIONAL([NETLINK_DEBUG], [test "$enable_netlink_debug" != "no"])
800 if test "$enable_time_check" != "no" ; then
801 if test "$enable_time_check" = "yes" -o "$enable_time_check" = "" ; then
802 AC_DEFINE([CONSUMED_TIME_CHECK], [5000000], [Consumed Time Check])
804 AC_DEFINE_UNQUOTED([CONSUMED_TIME_CHECK], [$enable_time_check], [Consumed Time Check])
808 case "${enable_cpu_time}" in
810 AC_DEFINE([EXCLUDE_CPU_TIME], [1], [Exclude getrusage data gathering])
816 if test "$enable_rr_semantics" != "no" ; then
817 AC_DEFINE([HAVE_V6_RR_SEMANTICS], [1], [Compile in v6 Route Replacement Semantics])
820 if test "$enable_datacenter" = "yes" ; then
821 AC_DEFINE([HAVE_DATACENTER], [1], [Compile extensions for a DataCenter])
822 DFLT_NAME="datacenter"
824 DFLT_NAME="traditional"
827 if test "$enable_cumulus" = "yes" ; then
828 AC_DEFINE([HAVE_CUMULUS], [1], [Compile Special Cumulus Code in])
831 AC_SUBST([DFLT_NAME])
832 AC_DEFINE_UNQUOTED([DFLT_NAME], ["$DFLT_NAME"], [Name of the configuration default set])
834 if test "$enable_shell_access" = "yes"; then
835 AC_DEFINE([HAVE_SHELL_ACCESS], [1], [Allow user to use ssh/telnet/bash, be aware this is considered insecure])
842 AS_IF([test "$host" = "$build"], [
844 AC_CHECK_HEADER([gelf.h], [], [
845 AC_MSG_ERROR([libelf headers are required for building clippy. (Host only when cross-compiling.)])
849 AC_CHECK_LIB([elf], [elf_memory], [], [
850 AC_MSG_ERROR([libelf is required for building clippy. (Host only when cross-compiling.)])
853 AC_CHECK_LIB([elf], [elf_getdata_rawchunk], [
854 AC_DEFINE([HAVE_ELF_GETDATA_RAWCHUNK], [1], [Have elf_getdata_rawchunk()])
856 AC_CHECK_LIB([elf], [gelf_getnote], [
857 AC_DEFINE([HAVE_GELF_GETNOTE], [1], [Have gelf_getnote()])
867 FRR_PYTHON_MODULES([pytest])
869 if test "$enable_doc" != "no"; then
870 FRR_PYTHON_MODULES([sphinx], , [
871 if test "$enable_doc" = "yes"; then
872 AC_MSG_ERROR([Documentation was explicitly requested with --enable-doc but sphinx is not available for $PYTHON. Please disable docs or install sphinx.])
876 AM_CONDITIONAL([DOC], [test "$enable_doc" != "no" -a "$frr_py_mod_sphinx" != "false"])
877 AM_CONDITIONAL([DOC_HTML], [test "$enable_doc_html" = "yes"])
879 FRR_PYTHON_MOD_EXEC([sphinx], [--version], [
882 PYSPHINX="-c 'import sys; from sphinx import main; sys.exit(main(sys.argv))'"
887 # Logic for old vpn commands support.
889 if test "$enable_oldvpn_commands" = "yes"; then
890 AC_DEFINE([KEEP_OLD_VPN_COMMANDS], [1], [Define for compiling with old vpn commands])
894 # End of logic for protobuf support.
897 AC_MSG_CHECKING([if zebra should be configurable to send Route Advertisements])
898 if test "$enable_rtadv" != "no"; then
900 AC_DEFINE([HAVE_RTADV], [1], [Enable IPv6 Routing Advertisement support])
905 if test "$enable_user" = "no"; then
908 if test "$enable_user" = "yes" || test "$enable_user" = ""; then
911 AC_DEFINE_UNQUOTED([FRR_USER], ["${enable_user}"], [frr User])
914 if test "$enable_group" = "no"; then
917 if test "$enable_group" = "yes" || test "$enable_group" = ""; then
920 AC_DEFINE_UNQUOTED([FRR_GROUP], ["${enable_group}"], [frr Group])
923 if test "$enable_vty_group" = "yes" ; then
924 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
925 elif test "$enable_vty_group" != ""; then
926 if test "$enable_vty_group" != "no"; then
927 AC_DEFINE_UNQUOTED([VTY_GROUP], ["${enable_vty_group}"], [VTY Sockets Group])
930 AC_SUBST([enable_user])
931 AC_SUBST([enable_group])
932 AC_SUBST([enable_vty_group])
934 enable_configfile_mask=${enable_configfile_mask:-0600}
935 AC_DEFINE_UNQUOTED([CONFIGFILE_MASK], [${enable_configfile_mask}], [Mask for config files])
936 AC_SUBST([enable_configfile_mask])
938 enable_logfile_mask=${enable_logfile_mask:-0600}
939 AC_DEFINE_UNQUOTED([LOGFILE_MASK], [${enable_logfile_mask}], [Mask for log files])
943 case "${enable_multipath}" in
947 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
948 MPATH_NUM="${enable_multipath}"
953 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
957 AC_DEFINE_UNQUOTED([MULTIPATH_NUM], [$MPATH_NUM], [Maximum number of paths for a route])
959 AC_DEFINE_UNQUOTED([VTYSH_PAGER], ["$VTYSH_PAGER"], [What pager to use])
963 case "${with_service_timeout}" in
964 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
965 TIMEOUT_MIN="${with_service_timeout}"
970 AC_MSG_FAILURE([Please specify digit for timeout ARG])
973 AC_SUBST([TIMEOUT_MIN])
975 dnl --------------------
976 dnl Enable code coverage
977 dnl --------------------
978 AM_CONDITIONAL([HAVE_GCOV], [test "$enable_gcov" != "no"])
980 dnl ------------------------------------
981 dnl Alpine only accepts numeric versions
982 dnl ------------------------------------
983 if test "$enable_numeric_version" != "" ; then
984 VERSION="`echo ${VERSION} | tr -c -d '[[.0-9]]'`"
985 PACKAGE_VERSION="`echo ${PACKAGE_VERSION} | tr -c -d '[[.0-9]]'`"
988 dnl -----------------------------------
989 dnl Add extra version string to package
990 dnl name, string and version fields.
991 dnl -----------------------------------
992 if test "$EXTRAVERSION" != "" ; then
993 VERSION="${VERSION}${EXTRAVERSION}"
994 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
995 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
996 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
998 AC_SUBST([EXTRAVERSION])
1000 if test "$with_pkg_git_version" = "yes"; then
1001 if test -e "${srcdir}/.git"; then
1002 AC_DEFINE([GIT_VERSION], [1], [include git version info])
1003 else with_pkg_git_version="no"
1004 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
1007 AM_CONDITIONAL([GIT_VERSION], [test "$with_pkg_git_version" = "yes"])
1009 AC_CHECK_TOOL([OBJCOPY], [objcopy], [:])
1010 if test "$OBJCOPY" != ":"; then
1011 AC_CACHE_CHECK([for .interp value to use], [frr_cv_interp], [
1013 AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])], [
1014 if $OBJCOPY -j.interp -Obinary conftest conftest.interp; then
1015 frr_cv_interp="`xargs -0 echo < conftest.interp`"
1017 test -f conftest.interp && rm conftest.interp
1021 if test -n "$frr_cv_interp"; then
1022 AC_DEFINE_UNQUOTED([INTERP], ["$frr_cv_interp"], [.interp value])
1025 dnl -------------------------
1026 dnl Check other header files.
1027 dnl -------------------------
1028 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
1029 linux/version.h asm/types.h endian.h sys/endian.h])
1031 ac_stdatomic_ok=false
1032 AC_DEFINE([FRR_AUTOCONF_ATOMIC], [1], [did autoconf checks for atomic funcs])
1033 AC_CHECK_HEADER([stdatomic.h],[
1035 AC_MSG_CHECKING([whether _Atomic qualifier works])
1036 AC_LINK_IFELSE([AC_LANG_SOURCE([[
1037 #include <stdatomic.h>
1038 int main(int argc, char **argv) {
1043 AC_DEFINE([HAVE_STDATOMIC_H], [1], [found stdatomic.h])
1044 AC_MSG_RESULT([yes])
1045 ac_stdatomic_ok=true
1051 AS_IF([$ac_stdatomic_ok], [true], [
1052 AC_MSG_CHECKING([for __atomic_* builtins])
1053 AC_LINK_IFELSE([AC_LANG_SOURCE([[
1054 int main(int argc, char **argv) {
1056 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
1057 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
1060 AC_DEFINE([HAVE___ATOMIC], [1], [found __atomic builtins])
1061 AC_MSG_RESULT([yes])
1065 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
1066 AC_MSG_CHECKING([for __sync_* builtins])
1067 AC_LINK_IFELSE([AC_LANG_SOURCE([[
1068 int main(int argc, char **argv) {
1070 __sync_fetch_and_sub (&i, 1);
1071 return __sync_val_compare_and_swap (&i, 0, 1);
1074 AC_DEFINE([HAVE___SYNC], [1], [found __sync builtins])
1075 AC_MSG_RESULT([yes])
1077 AC_MSG_CHECKING([for __sync_swap builtin])
1078 AC_LINK_IFELSE([AC_LANG_SOURCE([[
1079 int main(int argc, char **argv) {
1081 return __sync_swap (&i, 2);
1084 AC_DEFINE([HAVE___SYNC_SWAP], 1, [found __sync_swap builtin])
1085 AC_MSG_RESULT([yes])
1092 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
1099 AS_IF([$needsync], [
1101 AC_MSG_CHECKING([for Linux futex() support])
1102 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1108 #include <sys/time.h>
1109 #include <sys/syscall.h>
1110 #include <linux/futex.h>
1116 return syscall(SYS_futex, NULL, FUTEX_WAIT, 0, NULL, NULL, 0);
1119 AC_MSG_RESULT([yes])
1120 AC_DEFINE(HAVE_SYNC_LINUX_FUTEX,,Have Linux futex support)
1127 AS_IF([$needsync], [
1129 AC_MSG_CHECKING([for FreeBSD _umtx_op() support])
1130 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1133 #include <sys/types.h>
1134 #include <sys/umtx.h>
1139 return _umtx_op(NULL, UMTX_OP_WAIT_UINT, 0, NULL, NULL);
1142 AC_MSG_RESULT([yes])
1143 AC_DEFINE(HAVE_SYNC_UMTX_OP,,Have FreeBSD _umtx_op() support)
1150 AS_IF([$needsync], [
1151 dnl OpenBSD patch (not upstream at the time of writing this)
1152 dnl https://marc.info/?l=openbsd-tech&m=147299508409549&w=2
1153 AC_MSG_CHECKING([for OpenBSD futex() support])
1154 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1155 #include <sys/futex.h>
1160 return futex(NULL, FUTEX_WAIT, 0, NULL, NULL, 0);
1163 AC_MSG_RESULT([yes])
1164 AC_DEFINE(HAVE_SYNC_OPENBSD_FUTEX,,Have OpenBSD futex support)
1171 dnl Utility macro to avoid retyping includes all the time
1172 m4_define([FRR_INCLUDES],
1174 #define _POSIX_C_SOURCE 200809L
1175 #define __EXTENSIONS__
1180 #include <sys/types.h>
1181 /* sys/conf.h depends on param.h on FBSD at least */
1182 #include <sys/param.h>
1183 /* Required for MAXSIG */
1185 #include <sys/socket.h>
1187 # define __APPLE_USE_RFC_3542
1189 #include <netinet/in.h>
1190 #include <sys/time.h>
1195 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
1196 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
1197 dnl an additional round for it.
1199 AC_CHECK_HEADERS([net/if_var.h], [], [], [FRR_INCLUDES])
1201 m4_define([FRR_INCLUDES],
1203 [#ifdef HAVE_NET_IF_VAR_H
1204 # include <net/if_var.h>
1208 AC_CHECK_HEADERS([netinet/in_var.h \
1209 net/if_dl.h net/netopt.h \
1210 inet/nd.h netinet/ip_icmp.h \
1211 sys/sysctl.h sys/sockio.h sys/conf.h],
1212 [], [], [FRR_INCLUDES])
1214 AC_CHECK_HEADERS([ucontext.h], [], [],
1217 #endif /* __USE_GNU */
1221 m4_define([UCONTEXT_INCLUDES],
1222 [#include <ucontext.h>])dnl
1224 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
1225 [], [], [UCONTEXT_INCLUDES])
1226 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
1227 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
1228 [], [], [UCONTEXT_INCLUDES])],
1229 [], [UCONTEXT_INCLUDES])
1230 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
1231 [], [], [UCONTEXT_INCLUDES])
1233 m4_define([FRR_INCLUDES],
1237 #include <netinet/in_systm.h>
1238 #ifdef HAVE_NETINET_IN_VAR_H
1239 # include <netinet/in_var.h>
1241 #ifdef HAVE_NET_IF_DL_H
1242 # include <net/if_dl.h>
1244 #ifdef HAVE_NET_NETOPT_H
1245 # include <net/netopt.h>
1247 #include <net/route.h>
1248 #ifdef HAVE_INET_ND_H
1249 # include <inet/nd.h>
1251 #include <arpa/inet.h>
1252 /* Required for IDRP */
1253 #ifdef HAVE_NETINET_IP_ICMP_H
1254 # include <netinet/ip_icmp.h>
1258 dnl V6 headers are checked below, after we check for v6
1262 AC_MSG_CHECKING([which operating system interface to use])
1265 AC_MSG_FAILURE([Solaris support has been removed please see versions prior or equal to 7.5])
1268 AC_MSG_RESULT([Linux])
1270 AC_DEFINE([GNU_LINUX], [1], [GNU Linux])
1271 AC_DEFINE([HAVE_NETLINK], [1], [netlink])
1272 AC_DEFINE([LINUX_IPV6], [1], [Linux IPv6 stack])
1274 dnl Linux has a compilation problem with mixing
1275 dnl netinet/in.h and linux/in6.h they are not
1276 dnl compatible. There has been discussion on
1277 dnl how to fix it but no real progress on implementation
1278 dnl when they fix it, remove this
1279 AC_DEFINE([IPV6_MINHOPCOUNT], [73], [Linux ipv6 Min Hop Count])
1284 AC_MSG_RESULT([OpenBSD])
1286 AC_DEFINE([OPEN_BSD], [1], [OpenBSD])
1287 AC_DEFINE([KAME], [1], [KAME IPv6])
1288 AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
1291 AC_MSG_RESULT([BSD])
1293 AC_DEFINE([HAVE_NET_RT_IFLIST], [1], [NET_RT_IFLIST])
1294 AC_DEFINE([KAME], [1], [KAME IPv6])
1295 AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
1298 AM_CONDITIONAL([LINUX], [${is_linux}])
1302 dnl ------------------------
1303 dnl Integrated REALMS option
1304 dnl ------------------------
1305 if test "$enable_realms" = "yes"; then
1308 AC_DEFINE([SUPPORT_REALMS], [1], [Realms support])
1311 echo "Sorry, only Linux has REALMS support"
1330 AC_CHECK_MEMBERS([struct mmsghdr.msg_hdr], [], [], FRR_INCLUDES)
1332 dnl ##########################################################################
1333 dnl LARGE if block spans a lot of "configure"!
1334 if test "$enable_clippy_only" != "yes"; then
1335 dnl ##########################################################################
1338 # Logic for protobuf support.
1341 if test "$enable_protobuf" = "yes"; then
1342 # Check for protoc & protoc-c
1344 # protoc is not required, it's only for a "be nice" helper target
1345 AC_CHECK_PROGS([PROTOC], [protoc], [/bin/false])
1347 AC_CHECK_PROGS([PROTOC_C], [protoc-c], [/bin/false])
1348 if test "$PROTOC_C" = "/bin/false"; then
1349 AC_MSG_FAILURE([protobuf requested but protoc-c not found. Install protobuf-c.])
1352 PKG_CHECK_MODULES([PROTOBUF_C], [libprotobuf-c >= 0.14],, [
1353 AC_MSG_FAILURE([protobuf requested but libprotobuf-c not found. Install protobuf-c.])
1357 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h],
1358 [AC_CHECK_DECLS(PROTOBUF_C_LABEL_NONE,
1359 AC_DEFINE([HAVE_PROTOBUF_VERSION_3],
1360 [1], [Have Protobuf version 3]),
1362 [#include <google/protobuf-c/protobuf-c.h>])],
1363 [PROTO3=false && AC_MSG_FAILURE([protobuf requested but protobuf-c.h not found. Install protobuf-c.])])
1365 AC_DEFINE([HAVE_PROTOBUF], [1], [protobuf])
1369 dnl ---------------------
1370 dnl Integrated VTY option
1371 dnl ---------------------
1372 case "${enable_vtysh}" in
1377 AC_DEFINE([VTYSH], [1], [VTY shell])
1380 AC_CHECK_LIB([readline], [readline], [
1381 LIBREADLINE="-lreadline"
1383 dnl readline failed - it might be incorrectly linked and missing its
1384 dnl termcap/tinfo/curses dependency. see if we can fix that...
1385 AC_SEARCH_LIBS([tputs], [termcap tinfo curses ncurses], [
1386 LIBREADLINE="$ac_cv_search_tputs"
1388 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1391 dnl re-try with the lib we found above
1392 unset ac_cv_lib_readline_main
1393 AC_CHECK_LIB([readline], [main], [
1394 LIBREADLINE="-lreadline $LIBREADLINE"
1396 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1399 LIBS="$LIBS -lreadline"
1400 AC_CHECK_FUNCS([rl_clear_visible_line])
1403 AC_CHECK_HEADER([readline/history.h])
1404 if test "$ac_cv_header_readline_history_h" = "no"; then
1405 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
1407 AC_CHECK_LIB([readline], [rl_completion_matches], [true], [], [$LIBREADLINE])
1408 if test "$ac_cv_lib_readline_rl_completion_matches" = "no"; then
1409 AC_DEFINE([rl_completion_matches], [completion_matches], [Old readline])
1411 AC_CHECK_LIB([readline], [append_history], [frr_cv_append_history=yes], [frr_cv_append_history=no], [$LIBREADLINE])
1412 if test "$frr_cv_append_history" = "yes"; then
1413 AC_DEFINE([HAVE_APPEND_HISTORY], [1], [Have history.h append_history])
1417 AC_SUBST([LIBREADLINE])
1422 dnl FRR detects the PAM library it is built against by checking for a
1423 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
1424 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
1425 dnl openpam.h doesn't do that, although depends on the header too. Hence a
1426 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
1429 if test "$with_libpam" = "yes"; then
1430 AC_CHECK_HEADER([security/pam_misc.h],
1431 [AC_DEFINE([HAVE_PAM_MISC_H], [1], [Have pam_misc.h])
1432 AC_DEFINE([PAM_CONV_FUNC], [misc_conv], [Have misc_conv])
1433 pam_conv_func="misc_conv"
1436 AC_CHECK_HEADER([security/openpam.h],
1437 [AC_DEFINE([HAVE_OPENPAM_H], [1], [Have openpam.h])
1438 AC_DEFINE([PAM_CONV_FUNC], [openpam_ttyconv], [Have openpam_ttyconv])
1439 pam_conv_func="openpam_ttyconv"
1441 [], FRR_INCLUDES[#include <security/pam_appl.h>])
1442 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
1443 AC_MSG_WARN([*** pam support will not be built ***])
1448 if test "$with_libpam" = "yes"; then
1449 dnl took this test from proftpds configure.in and suited to our needs
1450 dnl -------------------------------------------------------------------------
1452 dnl This next check looks funky due to a linker problem with some versions
1453 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
1454 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
1455 dnl with RedHat 6.2 and Debian 2.2 or better.
1456 AC_CHECK_LIB([pam], [pam_start],
1457 [AC_CHECK_LIB([pam], [$pam_conv_func],
1458 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1460 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1461 LIBPAM="-lpam -lpam_misc"]
1465 [AC_CHECK_LIB([pam], [pam_end],
1466 [AC_CHECK_LIB([pam], [$pam_conv_func],
1467 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1468 LIBPAM="-lpam -ldl"],
1469 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1470 LIBPAM="-lpam -ldl -lpam_misc"]
1472 ],AC_MSG_WARN([*** pam support will not be built ***]),
1479 dnl -------------------------------
1480 dnl bgpd needs pow() and hence libm
1481 dnl -------------------------------
1484 AC_SEARCH_LIBS([pow], [m], [
1487 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1492 AC_CHECK_FUNCS([ppoll], [
1493 AC_DEFINE([HAVE_PPOLL], [1], [have Linux/BSD ppoll()])
1495 AC_CHECK_FUNCS([pollts], [
1496 AC_DEFINE([HAVE_POLLTS], [1], [have NetBSD pollts()])
1499 AC_CHECK_HEADER([asm-generic/unistd.h],
1500 [AC_CHECK_DECL(__NR_setns,
1501 AC_DEFINE([HAVE_NETNS], [1], [Have netns]),,
1502 FRR_INCLUDES [#include <asm-generic/unistd.h>
1504 AC_CHECK_FUNCS([setns])]
1507 dnl --------------------------
1508 dnl Determine IS-IS I/O method
1509 dnl --------------------------
1510 AC_DEFINE([ISIS_METHOD_PFPACKET], [1], [constant value for isis method pfpacket])
1511 AC_DEFINE([ISIS_METHOD_DLPI], [2], [constant value for isis method dlpi])
1512 AC_DEFINE([ISIS_METHOD_BPF], [3], [constant value for isis method bpf])
1513 AC_CHECK_HEADER([net/bpf.h])
1514 AC_CHECK_HEADER([sys/dlpi.h])
1515 AC_MSG_CHECKING([zebra IS-IS I/O method])
1519 AC_MSG_RESULT([pfpacket])
1520 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1523 if test "$ac_cv_header_net_bpf_h" = "no"; then
1524 if test "$ac_cv_header_sys_dlpi_h" = "no"; then
1525 AC_MSG_RESULT([none])
1526 if test "$enable_isisd" = "yes" -o "$enable_fabricd" = "yes"; then
1527 AC_MSG_FAILURE([IS-IS support requested but no packet backend found])
1529 AC_MSG_WARN([*** IS-IS support will not be built ***])
1533 AC_MSG_RESULT([DLPI])
1535 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1537 AC_MSG_RESULT([BPF])
1538 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
1542 AC_DEFINE_UNQUOTED([ISIS_METHOD], [$ISIS_METHOD_MACRO], [selected method for isis, == one of the constants])
1544 dnl ---------------------------------------------------------------
1545 dnl figure out how to specify an interface in multicast sockets API
1546 dnl ---------------------------------------------------------------
1547 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1549 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1550 #include <sys/socket.h>
1551 #include <netinet/in.h>
1552 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1553 #include <linux/types.h>
1556 AC_CHECK_HEADERS([linux/mroute6.h], [], [],[
1557 #include <sys/socket.h>
1558 #include <netinet/in.h>
1559 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1560 #include <linux/types.h>
1563 m4_define([FRR_INCLUDES],
1565 [#ifdef HAVE_LINUX_MROUTE_H
1566 # include <linux/mroute.h>
1570 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1571 #include <sys/socket.h>
1572 #include <sys/types.h>
1573 #include <netinet/in.h>
1574 #include <net/route.h>
1577 m4_define([FRR_INCLUDES],
1579 [#ifdef HAVE_NETINET_IP_MROUTE_H
1580 # include <netinet/ip_mroute.h>
1584 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1586 [ AC_LANG_PROGRAM([[
1587 #include <sys/types.h>
1588 #include <netinet/in.h>
1590 struct group_req gr;
1592 setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1595 AC_MSG_RESULT([yes])
1596 AC_DEFINE([HAVE_RFC3678], [1], [Have RFC3678 protocol-independed API])
1601 dnl ---------------------------------------------------------------
1602 dnl figure out how to check link-state
1603 dnl ---------------------------------------------------------------
1604 AC_CHECK_HEADER([net/if_media.h],
1605 [m4_define([LINK_DETECT_INCLUDES],
1607 [#include <net/if_media.h>
1609 AC_CHECK_MEMBERS([struct ifmediareq.ifm_status],
1610 AC_DEFINE([HAVE_BSD_LINK_DETECT], [1], [BSD link-detect]),
1611 [], LINK_DETECT_INCLUDES)],
1615 dnl ---------------------------------------------------------------
1616 dnl Additional, newer way to check link-state using ifi_link_state.
1617 dnl Not available in all BSD's when ifmediareq available
1618 dnl ---------------------------------------------------------------
1619 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1620 AC_DEFINE([HAVE_BSD_IFI_LINK_STATE], [1], [BSD ifi_link_state available]),
1623 dnl ------------------------
1624 dnl TCP_MD5SIG socket option
1625 dnl ------------------------
1627 AC_CHECK_HEADER([netinet/tcp.h],
1628 [m4_define([MD5_INCLUDES],
1630 [#include <netinet/tcp.h>
1632 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1635 if test "$ac_cv_have_decl_TCP_MD5SIG" = "no"; then
1636 AC_CHECK_HEADER([linux/tcp.h],
1637 [m4_define([MD5_INCLUDES],
1639 [#include <linux/tcp.h>
1641 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1645 AC_CHECK_LIB([crypt], [crypt], [], [
1646 AC_CHECK_LIB([crypto], [DES_crypt])
1649 LIBCRYPT="${LIBCRYPT%$LIBS_save}"
1650 LIBCRYPT="${LIBCRYPT#$LIBS_save}"
1651 AC_SUBST([LIBCRYPT])
1655 AC_CHECK_LIB([resolv], [res_init])
1657 dnl ---------------------------
1658 dnl check system has PCRE regexp
1659 dnl ---------------------------
1660 if test "$enable_pcreposix" = "yes"; then
1661 AC_CHECK_LIB([pcreposix], [regexec], [], [
1662 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1665 AC_SUBST([HAVE_LIBPCREPOSIX])
1667 dnl ---------------------------
1668 dnl check system has PCRE2 regexp
1669 dnl ---------------------------
1670 if test "$enable_pcre2posix" = "yes"; then
1671 AC_CHECK_LIB([pcre2-posix], [regexec], [], [
1672 AC_MSG_ERROR([--enable-pcre2posix given but unable to find libpcre2-posix])
1675 AC_SUBST([HAVE_LIBPCRE2_POSIX])
1677 dnl ##########################################################################
1678 dnl test "$enable_clippy_only" != "yes"
1680 dnl END OF LARGE if block
1681 dnl ##########################################################################
1683 dnl ------------------
1684 dnl check C-Ares library
1685 dnl ------------------
1686 PKG_CHECK_MODULES([CARES], [libcares], [
1691 AM_CONDITIONAL([CARES], [$c_ares_found])
1694 dnl ----------------------------------------------------------------------------
1695 dnl figure out if domainname is available in the utsname struct (GNU extension).
1696 dnl ----------------------------------------------------------------------------
1697 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1699 dnl ------------------
1700 dnl IPv6 header checks
1701 dnl ------------------
1702 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1703 netinet6/in6_var.h netinet6/nd6.h], [], [],
1706 m4_define([FRR_INCLUDES],dnl
1708 [#ifdef HAVE_NETINET6_IN6_H
1709 #include <netinet6/in6.h>
1711 #ifdef HAVE_NETINET_IN6_VAR_H
1712 #include <netinet/in6_var.h>
1714 #include <netinet/icmp6.h>
1715 #ifdef HAVE_NETINET6_IN6_VAR_H
1716 # include <netinet6/in6_var.h>
1718 #ifdef HAVE_NETINET6_ND6_H
1719 # include <netinet6/nd6.h>
1723 dnl --------------------
1724 dnl Daemon disable check
1725 dnl --------------------
1727 AS_IF([test "$enable_bgpd" != "no"], [
1728 AC_DEFINE([HAVE_BGPD], [1], [bgpd])
1731 AS_IF([test "$enable_ripd" != "no"], [
1732 AC_DEFINE([HAVE_RIPD], [1], [ripd])
1735 AS_IF([test "$enable_ripngd" != "no"], [
1736 AC_DEFINE([HAVE_RIPNGD], [1], [ripngd])
1739 AS_IF([test "$enable_ospfd" != "no"], [
1740 AC_DEFINE([HAVE_OSPFD], [1], [ospfd])
1743 AS_IF([test "$enable_ospf6d" != "no"], [
1744 AC_DEFINE([HAVE_OSPF6D], [1], [ospf6d])
1747 AS_IF([test "$enable_ldpd" != "no"], [
1748 AC_DEFINE([HAVE_LDPD], [1], [ldpd])
1751 AS_IF([test "$enable_nhrpd" != "no"], [
1752 AC_DEFINE([HAVE_NHRPD], [1], [nhrpd])
1755 AS_IF([test "$enable_eigrpd" != "no"], [
1756 AC_DEFINE([HAVE_EIGRPD], [1], [eigrpd])
1759 AS_IF([test "$enable_babeld" != "no"], [
1760 AC_DEFINE([HAVE_BABELD], [1], [babeld])
1763 AS_IF([test "$enable_isisd" != "no"], [
1764 AC_DEFINE([HAVE_ISISD], [1], [isisd])
1767 AS_IF([test "$enable_pimd" != "no"], [
1768 AC_DEFINE([HAVE_PIMD], [1], [pimd])
1771 AS_IF([test "$enable_pim6d" != "no"], [
1772 AC_DEFINE([HAVE_PIM6D], [1], [pim6d])
1775 AS_IF([test "$enable_pbrd" != "no"], [
1776 AC_DEFINE([HAVE_PBRD], [1], [pbrd])
1779 AS_IF([test "$enable_sharpd" = "yes"], [
1780 AC_DEFINE([HAVE_SHARPD], [1], [sharpd])
1783 AS_IF([test "$enable_staticd" != "no"], [
1784 AC_DEFINE([HAVE_STATICD], [1], [staticd])
1787 AS_IF([test "$enable_fabricd" != "no"], [
1788 AC_DEFINE([HAVE_FABRICD], [1], [fabricd])
1791 AS_IF([test "$enable_vrrpd" != "no"], [
1792 AC_DEFINE([HAVE_VRRPD], [1], [vrrpd])
1795 if test "$enable_bfdd" = "no"; then
1796 AC_DEFINE([HAVE_BFDD], [0], [bfdd])
1799 AC_DEFINE([HAVE_BFDD], [1], [bfdd])
1804 AC_DEFINE([BFD_LINUX], [1], [bfdd])
1808 AC_DEFINE([BFD_BSD], [1], [bfdd])
1813 AS_IF([test "$enable_pathd" != "no"], [
1814 AC_DEFINE([HAVE_PATHD], [1], [pathd])
1817 if test "$ac_cv_lib_json_c_json_object_get" = "no" -a "$BFDD" = "bfdd"; then
1818 AC_MSG_ERROR(["you must use json-c library to use bfdd"])
1824 case "${enable_nhrpd}" in
1828 if test "$enable_clippy_only" != "yes"; then
1829 if test "$c_ares_found" != "true" ; then
1830 AC_MSG_ERROR([nhrpd requires libcares. Please install c-ares and its -dev headers.])
1836 if test "$c_ares_found" = "true" ; then
1843 if test "$enable_nhrpd" = "yes"; then
1844 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1849 if test "$enable_watchfrr" = "no";then
1856 if test "$enable_ospfapi" != "no";then
1857 AC_DEFINE([SUPPORT_OSPF_API], [1], [OSPFAPI])
1859 if test "$enable_ospfclient" != "no";then
1860 OSPFCLIENT="ospfclient"
1864 if test "$enable_bgp_announce" = "no";then
1865 AC_DEFINE([DISABLE_BGP_ANNOUNCE], [1], [Disable BGP installation to zebra])
1867 AC_DEFINE([DISABLE_BGP_ANNOUNCE], [0], [Disable BGP installation to zebra])
1870 if test "$enable_bgp_vnc" != "no";then
1871 AC_DEFINE([ENABLE_BGP_VNC], [1], [Enable BGP VNC support])
1875 case "${enable_bgp_bmp}" in
1879 if test "$c_ares_found" != "true" ; then
1880 AC_MSG_ERROR([BMP support requires libcares. Please install c-ares and its -dev headers.])
1885 if test "$c_ares_found" = "true" ; then
1891 if test "$enable_version_build_config" != "no";then
1892 AC_DEFINE([ENABLE_VERSION_BUILD_CONFIG], [1], [Report build configs in show version])
1895 dnl ##########################################################################
1897 if test "$enable_clippy_only" != "yes"; then
1898 dnl ##########################################################################
1900 dnl ------------------
1901 dnl check Net-SNMP library
1902 dnl ------------------
1903 if test "$enable_snmp" != "" -a "$enable_snmp" != "no"; then
1904 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1905 if test "$NETSNMP_CONFIG" = "no"; then
1906 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1908 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1909 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1910 # net-snmp lists all of its own dependencies. we absolutely do not want that
1911 # among other things we avoid a GPL vs. OpenSSL license conflict here
1912 for removelib in crypto ssl sensors pci wrap; do
1913 SNMP_LIBS="`echo $SNMP_LIBS | sed -e 's/\(^\|\s\)-l'$removelib'\b/ /g' -e 's/\(^\|\s\)\([^\s]*\/\)\?lib'$removelib'\.[^\s]\+\b/ /g'`"
1915 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1916 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
1925 AC_MSG_ERROR([--enable-snmp given but not usable])])
1926 case "${enable_snmp}" in
1931 SNMP_METHOD="${enable_snmp}"
1934 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use yes or agentx])
1937 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1938 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,[SNMP method to interface with snmpd])
1940 AC_SUBST([SNMP_LIBS])
1941 AC_SUBST([SNMP_CFLAGS])
1946 PKG_CHECK_MODULES([LIBYANG], [libyang >= 2.0.0], , [
1947 AC_MSG_ERROR([libyang (>= 2.0.0) was not found on your system.])
1949 ac_cflags_save="$CFLAGS"
1950 CFLAGS="$CFLAGS $LIBYANG_CFLAGS"
1951 AC_CHECK_MEMBER([struct lyd_node.priv], [], [
1952 AC_MSG_ERROR([m4_normalize([
1953 libyang needs to be compiled with ENABLE_LYD_PRIV=ON.
1954 Instructions for this are included in the build documentation for your platform at http://docs.frrouting.org/projects/dev-guide/en/latest/building.html])
1956 ], [[#include <libyang/libyang.h>]])
1957 CFLAGS="$ac_cflags_save"
1960 dnl configuration rollbacks
1963 if test "$enable_config_rollbacks" = "yes"; then
1964 PKG_CHECK_MODULES([SQLITE3], [sqlite3], [
1965 AC_DEFINE([HAVE_CONFIG_ROLLBACKS], [1], [Enable configuration rollbacks])
1966 AC_DEFINE([HAVE_SQLITE3], [1], [Enable sqlite3 database])
1969 AC_MSG_ERROR([--enable-config-rollbacks given but sqlite3 was not found on your system.])
1976 if test "$enable_confd" != "" -a "$enable_confd" != "no"; then
1977 AC_CHECK_PROG([CONFD], [confd], [confd], [/bin/false], "${enable_confd}/bin")
1978 if test "$CONFD" = "/bin/false"; then
1979 AC_MSG_ERROR([confd was not found on your system.])]
1981 AC_CHECK_PROG([CONFDC], [confdc], [confdc], [/bin/false], "${enable_confd}/bin")
1982 CONFD_CFLAGS="-I${enable_confd}/include -L${enable_confd}/lib"
1983 AC_SUBST([CONFD_CFLAGS])
1984 CONFD_LIBS="-lconfd"
1985 AC_SUBST([CONFD_LIBS])
1986 AC_DEFINE([HAVE_CONFD], [1], [Enable confd integration])
1992 if test "$enable_sysrepo" = "yes"; then
1993 PKG_CHECK_MODULES([SYSREPO], [sysrepo >= 2.1.42],
1994 [AC_DEFINE([HAVE_SYSREPO], [1], [Enable sysrepo integration])
1997 AC_MSG_ERROR([sysrepo was not found on your system.])]
2004 if test "$enable_grpc" = "yes"; then
2006 AX_CXX_COMPILE_STDCXX([11], [ext])
2007 PKG_CHECK_MODULES([GRPC], [grpc >= 6.0.0 grpc++ >= 1.16.1 protobuf >= 3.6.1 ], [
2008 AC_CHECK_PROGS([PROTOC], [protoc], [/bin/false])
2009 if test "$PROTOC" = "/bin/false"; then
2010 AC_MSG_FAILURE([grpc requested but protoc not found.])
2013 AC_DEFINE([HAVE_GRPC], [1], [Enable the gRPC northbound plugin])
2017 AC_MSG_ERROR([grpc/grpc++ were not found on your system.])
2025 if test "$enable_dp_dpdk" = "yes"; then
2026 PKG_CHECK_MODULES([DPDK], [libdpdk], [
2027 AC_DEFINE([HAVE_DPDK], [1], [Enable DPDK backend])
2030 AC_MSG_ERROR([configuration specifies --enable-dp-dpdk but DPDK libs were not found])
2037 if test "$enable_lttng" = "yes"; then
2038 PKG_CHECK_MODULES([UST], [lttng-ust >= 2.9.0], [
2039 AC_DEFINE([HAVE_LTTNG], [1], [Enable LTTng support])
2042 AC_MSG_ERROR([configuration specifies --enable-lttng but lttng-ust was not found])
2049 if test "$enable_usdt" = "yes"; then
2050 AC_CHECK_HEADERS([sys/sdt.h], [
2051 AC_DEFINE([HAVE_USDT], [1], [Enable USDT probes])
2054 AC_MSG_ERROR([configuration specifies --enable-usdt but no USDT kernel headers (sys/sdt.h) found])
2061 if test "$enable_zeromq" != "no"; then
2062 PKG_CHECK_MODULES([ZEROMQ], [libzmq >= 4.0.0], [
2063 AC_DEFINE([HAVE_ZEROMQ], [1], [Enable ZeroMQ support])
2066 if test "$enable_zeromq" = "yes"; then
2067 AC_MSG_ERROR([configuration specifies --enable-zeromq but libzmq was not found])
2072 dnl ------------------------------------
2073 dnl Enable RPKI and add librtr to libs
2074 dnl ------------------------------------
2075 if test "$enable_rpki" = "yes"; then
2076 PKG_CHECK_MODULES([RTRLIB], [rtrlib >= 0.8.0],
2079 AC_MSG_ERROR([rtrlib was not found on your system or is too old.])]
2083 dnl ------------------------------------
2084 dnl pimd and pim6d not supported on OpenBSD and MacOS
2085 dnl ------------------------------------
2086 if test "$enable_pimd" != "no"; then
2087 AC_MSG_CHECKING([for pimd OS support])
2098 AC_MSG_RESULT([yes])
2103 if test "$enable_pim6d" != "no"; then
2104 AC_MSG_CHECKING([for pim6d OS support])
2107 AC_MSG_RESULT([yes])
2116 dnl -------------------------------------
2117 dnl VRRP is only supported on linux
2118 dnl -------------------------------------
2119 if test "$enable_vrrpd" != "no"; then
2120 AC_MSG_CHECKING([for VRRP OS support])
2123 AC_MSG_RESULT([yes])
2132 dnl ------------------------------------------
2133 dnl Check whether rtrlib was build with ssh support
2134 dnl ------------------------------------------
2135 AC_MSG_CHECKING([whether the RTR Library is compiled with SSH])
2136 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "rtrlib/rtrlib.h"]],
2137 [[struct tr_ssh_config config;]])],
2138 [AC_MSG_RESULT([yes])
2139 AC_DEFINE([FOUND_SSH], [1], [found_ssh])],
2147 AC_SEARCH_LIBS([dlopen], [dl dld], [], [
2148 AC_MSG_ERROR([unable to find the dlopen()])
2151 AC_CHECK_HEADERS([link.h])
2153 AC_CACHE_CHECK([for dlinfo(RTLD_DI_ORIGIN)], [frr_cv_rtld_di_origin], [
2154 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
2162 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
2164 frr_cv_rtld_di_origin=yes
2166 frr_cv_rtld_di_origin=no
2169 if test "$frr_cv_rtld_di_origin" = "yes"; then
2170 AC_DEFINE([HAVE_DLINFO_ORIGIN], [1], [Have dlinfo RTLD_DI_ORIGIN])
2173 AC_CACHE_CHECK([for dlinfo(RTLD_DI_LINKMAP)], [frr_cv_rtld_di_linkmap], [
2174 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
2181 struct link_map *lm = NULL;
2182 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
2184 frr_cv_rtld_di_linkmap=yes
2186 frr_cv_rtld_di_linkmap=no
2189 if test "$frr_cv_rtld_di_linkmap" = "yes"; then
2190 AC_DEFINE([HAVE_DLINFO_LINKMAP], [1], [Have dlinfo RTLD_DI_LINKMAP])
2194 LIBDL="${LIBDL%$LIBS_save}"
2195 LIBDL="${LIBDL#$LIBS_save}"
2200 dnl ##########################################################################
2201 dnl test "$enable_clippy_only" != "yes"
2203 dnl END OF LARGE if block
2204 dnl ##########################################################################
2206 dnl ---------------------------
2207 dnl sockaddr and netinet checks
2208 dnl ---------------------------
2211 struct vifctl, struct mfcctl, struct sioc_sg_req,
2212 vifi_t, struct sioc_vif_req, struct igmpmsg,
2213 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
2214 struct nd_opt_adv_interval,
2215 struct nd_opt_homeagent_info, struct nd_opt_adv_interval,
2216 struct nd_opt_rdnss, struct nd_opt_dnssl],
2217 [], [], FRR_INCLUDES)
2219 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
2220 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
2221 struct sockaddr_dl.sdl_len,
2222 struct if6_aliasreq.ifra_lifetime,
2223 struct nd_opt_adv_interval.nd_opt_ai_type],
2224 [], [], FRR_INCLUDES)
2226 dnl ---------------------------
2227 dnl IRDP/pktinfo/icmphdr checks
2228 dnl ---------------------------
2230 AC_CHECK_TYPES([struct in_pktinfo], [
2231 AC_CHECK_TYPES([struct icmphdr], [
2240 case "${enable_irdp}" in
2242 $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
2250 dnl -----------------------
2251 dnl checking for IP_PKTINFO
2252 dnl -----------------------
2253 AC_MSG_CHECKING([for IP_PKTINFO])
2255 [ AC_LANG_PROGRAM([[
2258 int opt = IP_PKTINFO;
2261 AC_MSG_RESULT([yes])
2262 AC_DEFINE([HAVE_IP_PKTINFO], [1], [Have IP_PKTINFO])
2267 dnl ---------------------------
2268 dnl checking for IP_RECVDSTADDR
2269 dnl ---------------------------
2270 AC_MSG_CHECKING([for IP_RECVDSTADDR])
2272 [ AC_LANG_PROGRAM([[
2273 #include <netinet/in.h>
2275 int opt = IP_RECVDSTADDR;
2278 AC_MSG_RESULT([yes])
2279 AC_DEFINE([HAVE_IP_RECVDSTADDR], [1], [Have IP_RECVDSTADDR])
2284 dnl ----------------------
2285 dnl checking for IP_RECVIF
2286 dnl ----------------------
2287 AC_MSG_CHECKING([for IP_RECVIF])
2289 [ AC_LANG_PROGRAM([[
2290 #include <netinet/in.h>
2292 int opt = IP_RECVIF;
2295 AC_MSG_RESULT([yes])
2296 AC_DEFINE([HAVE_IP_RECVIF], [1], [Have IP_RECVIF])
2301 dnl ----------------------
2302 dnl checking for SO_BINDANY
2303 dnl ----------------------
2304 AC_MSG_CHECKING([for SO_BINDANY])
2306 [ AC_LANG_PROGRAM([[
2307 #include <sys/socket.h>
2309 int opt = SO_BINDANY;
2312 AC_MSG_RESULT([yes])
2313 AC_DEFINE([HAVE_SO_BINDANY], [1], [Have SO_BINDANY])
2318 dnl ----------------------
2319 dnl checking for IP_FREEBIND
2320 dnl ----------------------
2321 AC_MSG_CHECKING([for IP_FREEBIND])
2323 [ AC_LANG_PROGRAM([[
2324 #include <netinet/in.h>
2326 int opt = IP_FREEBIND;
2329 AC_MSG_RESULT([yes])
2330 AC_DEFINE([HAVE_IP_FREEBIND], [1], [Have IP_FREEBIND])
2335 dnl --------------------------------------
2336 dnl checking for be32dec existence or not
2337 dnl --------------------------------------
2338 AC_CHECK_DECLS([be32enc, be32dec], [], [], [
2339 #ifdef HAVE_SYS_ENDIAN_H
2340 #include <sys/endian.h>
2342 #ifdef HAVE_ENDIAN_H
2347 dnl --------------------------------------
2348 dnl checking for clock_time monotonic struct and call
2349 dnl --------------------------------------
2350 AC_CHECK_DECL([CLOCK_MONOTONIC],
2351 [AC_CHECK_LIB([rt], [clock_gettime], [LIBS="$LIBS -lrt"])
2352 AC_DEFINE([HAVE_CLOCK_MONOTONIC], [1], [Have monotonic clock])
2353 ], [AC_MSG_RESULT([no])], [FRR_INCLUDES])
2355 AC_CHECK_DECL([CLOCK_THREAD_CPUTIME_ID], [
2356 AC_DEFINE([HAVE_CLOCK_THREAD_CPUTIME_ID], [1], [Have cpu-time clock])
2357 ], [AC_MSG_RESULT([no])], [FRR_INCLUDES])
2359 AC_SEARCH_LIBS([clock_nanosleep], [rt], [
2360 AC_DEFINE([HAVE_CLOCK_NANOSLEEP], [1], [Have clock_nanosleep()])
2363 dnl --------------------------------------
2364 dnl checking for flex and bison
2365 dnl --------------------------------------
2367 dnl autoconf 2.69 AC_PROG_LEX has no parameters
2368 dnl autoconf 2.70 AC_PROG_LEX prints a deprecation warning without params
2369 m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.70]), [-1], [dnl
2373 dnl autoconf >= 2.70
2374 AC_PROG_LEX([noyywrap])
2377 AC_MSG_CHECKING([version of flex])
2378 frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
2379 frr_ac_flex_version="${frr_ac_flex_version##* }"
2380 AC_MSG_RESULT([$frr_ac_flex_version])
2381 AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
2382 LEX="$SHELL $missing_dir/missing flex"
2383 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
2384 AC_MSG_WARN([using pregenerated flex output files])
2386 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
2388 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
2389 AC_SUBST([LEXLIB], [''])
2393 dnl thanks GNU bison for this b*llshit...
2394 AC_MSG_CHECKING([version of bison])
2395 frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
2396 frr_ac_bison_version="${frr_ac_bison_version##* }"
2397 frr_ac_bison_missing="false"
2398 case "x${frr_ac_bison_version}x" in
2401 BISON_CLOSEBRACE='"'
2403 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
2406 AC_MSG_RESULT([$frr_ac_bison_version])
2407 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
2408 frr_ac_bison_missing="true"
2411 AC_MSG_RESULT([none])
2412 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
2413 frr_ac_bison_missing="true"
2417 BISON_CLOSEBRACE='}'
2418 BISON_VERBOSE='-Dparse.error=verbose'
2419 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 to 3.2])
2423 BISON_CLOSEBRACE='}'
2424 BISON_VERBOSE='-Dparse.error=verbose -Wno-yacc'
2425 AC_MSG_RESULT([$frr_ac_bison_version - 3.3 or newer])
2428 AC_SUBST([BISON_OPENBRACE])
2429 AC_SUBST([BISON_CLOSEBRACE])
2430 AC_SUBST([BISON_VERBOSE])
2432 if $frr_ac_bison_missing; then
2433 YACC="$SHELL $missing_dir/missing bison -y"
2434 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
2435 AC_MSG_WARN([using pregenerated bison output files])
2437 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
2441 dnl -------------------
2442 dnl capabilities checks
2443 dnl -------------------
2444 if test "$enable_capabilities" != "no"; then
2445 AC_MSG_CHECKING([whether prctl PR_SET_KEEPCAPS is available])
2447 [ AC_LANG_PROGRAM([[
2448 #include <sys/prctl.h>
2450 prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
2452 ],[AC_MSG_RESULT([yes])
2453 AC_DEFINE([HAVE_PR_SET_KEEPCAPS], [1], [prctl])
2454 frr_ac_keepcaps="yes"
2455 ],[AC_MSG_RESULT(no)
2457 if test "$frr_ac_keepcaps" = "yes"; then
2458 AC_CHECK_HEADERS([sys/capability.h])
2460 if test "$ac_cv_header_sys_capability_h" = "yes"; then
2461 AC_CHECK_LIB([cap], [cap_init],
2462 [AC_DEFINE([HAVE_LCAPS], [1], [Capabilities])
2467 if test "$frr_ac_scaps" = "yes" \
2468 -o "$frr_ac_lcaps" = "yes"; then
2469 AC_DEFINE([HAVE_CAPABILITIES], [1], [capabilities])
2474 if test "$enable_clippy_only" != "yes"; then
2475 if test "$frr_ac_lcaps" != "yes"; then
2476 AC_MSG_ERROR([libcap and/or its headers were not found. Running FRR without libcap support built in causes a huge performance penalty.])
2484 AC_MSG_WARN([Running FRR without libcap support built in causes a huge performance penalty.])
2490 dnl ---------------------------
2491 dnl check for glibc 'backtrace'
2492 dnl ---------------------------
2493 if test "$enable_backtrace" != "no" ; then
2495 PKG_CHECK_MODULES([UNWIND], [libunwind], [
2496 AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
2502 if test "$backtrace_ok" = "no"; then
2503 AC_CHECK_HEADER([unwind.h], [
2504 AC_SEARCH_LIBS([unw_getcontext], [unwind], [
2505 AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
2511 if test "$backtrace_ok" = "no"; then
2512 AC_CHECK_HEADER([execinfo.h], [
2513 AC_SEARCH_LIBS([backtrace], [execinfo], [
2514 AC_DEFINE([HAVE_GLIBC_BACKTRACE], [1], [Glibc backtrace])
2520 if test "$enable_backtrace" = "yes" -a "$backtrace_ok" = "no"; then
2521 dnl user explicitly requested backtrace but we failed to find support
2522 AC_MSG_FAILURE([failed to find backtrace or libunwind support])
2526 dnl -----------------------------------------
2527 dnl check for malloc mallinfo struct and call
2528 dnl this must try and link using LIBS, in
2529 dnl order to check no alternative allocator
2530 dnl has been specified, which might not provide
2532 dnl -----------------------------------------
2533 AC_CHECK_HEADERS([malloc.h malloc_np.h malloc/malloc.h],,, [FRR_INCLUDES])
2535 AC_CACHE_CHECK([whether mallinfo is available], [frr_cv_mallinfo], [
2536 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2537 #ifdef HAVE_MALLOC_H
2540 #ifdef HAVE_MALLOC_NP_H
2541 #include <malloc_np.h>
2543 #ifdef HAVE_MALLOC_MALLOC_H
2544 #include <malloc/malloc.h>
2547 struct mallinfo ac_x; ac_x = mallinfo ();
2554 if test "$frr_cv_mallinfo" = "yes"; then
2555 AC_DEFINE([HAVE_MALLINFO], [1], [mallinfo])
2558 AC_CACHE_CHECK([whether mallinfo2 is available], [frr_cv_mallinfo2], [
2559 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2560 #ifdef HAVE_MALLOC_H
2563 #ifdef HAVE_MALLOC_NP_H
2564 #include <malloc_np.h>
2566 #ifdef HAVE_MALLOC_MALLOC_H
2567 #include <malloc/malloc.h>
2570 struct mallinfo2 ac_x; ac_x = mallinfo2 ();
2572 frr_cv_mallinfo2=yes
2577 if test "$frr_cv_mallinfo2" = "yes"; then
2578 AC_DEFINE([HAVE_MALLINFO2], [1], [mallinfo2])
2581 AC_MSG_CHECKING([whether malloc_usable_size is available])
2582 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2583 #ifdef HAVE_MALLOC_H
2586 #ifdef HAVE_MALLOC_MALLOC_H
2587 #include <malloc/malloc.h>
2590 size_t ac_x; ac_x = malloc_usable_size(NULL);
2592 AC_MSG_RESULT([yes])
2593 AC_DEFINE([HAVE_MALLOC_USABLE_SIZE], [1], [malloc_usable_size])
2597 AC_MSG_CHECKING([whether malloc_size is available])
2598 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
2599 #ifdef HAVE_MALLOC_H
2602 #ifdef HAVE_MALLOC_MALLOC_H
2603 #include <malloc/malloc.h>
2606 size_t ac_x; ac_x = malloc_size(NULL);
2608 AC_MSG_RESULT([yes])
2609 AC_DEFINE([HAVE_MALLOC_SIZE], [1], [malloc_size])
2618 dev_version=`echo $VERSION | grep dev`
2619 #don't expire deprecated code in non 'dev' branch
2620 if test "$dev_version" = ""; then
2623 CONFDATE=`date '+%Y%m%d'`
2625 AC_SUBST([CONFDATE])
2627 dnl ------------------------------
2628 dnl set paths for state directory
2629 dnl ------------------------------
2630 AC_MSG_CHECKING([directory to use for state file])
2631 if test "$prefix" = "NONE"; then
2632 frr_statedir_prefix="";
2634 frr_statedir_prefix=${prefix}
2636 if test "$localstatedir" = '${prefix}/var'; then
2637 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
2638 ${frr_statedir_prefix}/var/adm dnl
2639 ${frr_statedir_prefix}/etc dnl
2645 test -d $FRR_STATE_DIR && break
2647 frr_statedir=$FRR_STATE_DIR
2649 frr_statedir=${localstatedir}
2651 if test "$frr_statedir" = "/dev/null"; then
2652 AC_MSG_ERROR([STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!])
2654 AC_MSG_RESULT([${frr_statedir}])
2655 AC_SUBST([frr_statedir])
2657 AC_DEFINE_UNQUOTED([LDPD_SOCKET], ["$frr_statedir%s%s/ldpd.sock"], [ldpd control socket])
2658 AC_DEFINE_UNQUOTED([ZEBRA_SERV_PATH], ["$frr_statedir%s%s/zserv.api"], [zebra api socket])
2659 AC_DEFINE_UNQUOTED([BFDD_CONTROL_SOCKET], ["$frr_statedir%s%s/bfdd.sock"], [bfdd control socket])
2660 AC_DEFINE_UNQUOTED([OSPFD_GR_STATE], ["$frr_statedir%s/ospfd-gr.json"], [ospfd GR state information])
2661 AC_DEFINE_UNQUOTED([OSPF6D_GR_STATE], ["$frr_statedir/ospf6d-gr.json"], [ospf6d GR state information])
2662 AC_DEFINE_UNQUOTED([ISISD_RESTART], ["$frr_statedir%s/isid-restart.json"], [isisd restart information])
2663 AC_DEFINE_UNQUOTED([OSPF6_AUTH_SEQ_NUM_FILE], ["$frr_statedir/ospf6d-at-seq-no.dat"], [ospf6d AT Sequence number information])
2664 AC_DEFINE_UNQUOTED([DAEMON_VTY_DIR], ["$frr_statedir%s%s"], [daemon vty directory])
2665 AC_DEFINE_UNQUOTED([DAEMON_DB_DIR], ["$frr_statedir"], [daemon database directory])
2667 dnl autoconf does this, but it does it too late...
2668 test "$prefix" = "NONE" && prefix=$ac_default_prefix
2669 test "$exec_prefix" = "NONE" && exec_prefix='${prefix}'
2671 dnl get the full path, recursing through variables...
2672 vtysh_bin="$bindir/vtysh"
2673 for I in 1 2 3 4 5 6 7 8 9 10; do
2674 eval vtysh_bin="\"$vtysh_bin\""
2676 AC_DEFINE_UNQUOTED([VTYSH_BIN_PATH], ["$vtysh_bin"], [path to vtysh binary])
2677 AC_SUBST([vtysh_bin])
2679 CFG_SYSCONF="$sysconfdir"
2681 CFG_STATE="$frr_statedir"
2682 CFG_MODULE="$moduledir"
2683 CFG_YANGMODELS="$yangmodelsdir"
2684 CFG_SCRIPT="$scriptdir"
2685 for I in 1 2 3 4 5 6 7 8 9 10; do
2686 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
2687 eval CFG_SBIN="\"$CFG_SBIN\""
2688 eval CFG_STATE="\"$CFG_STATE\""
2689 eval CFG_MODULE="\"$CFG_MODULE\""
2690 eval CFG_YANGMODELS="\"$CFG_YANGMODELS\""
2691 eval CFG_SCRIPT="\"$CFG_SCRIPT\""
2693 AC_SUBST([CFG_SYSCONF])
2694 AC_SUBST([CFG_SBIN])
2695 AC_SUBST([CFG_STATE])
2696 AC_SUBST([CFG_MODULE])
2697 AC_SUBST([CFG_SCRIPT])
2698 AC_SUBST([CFG_YANGMODELS])
2699 AC_DEFINE_UNQUOTED([MODULE_PATH], ["$CFG_MODULE"], [path to modules])
2700 AC_DEFINE_UNQUOTED([SCRIPT_PATH], ["$CFG_SCRIPT"], [path to scripts])
2701 AC_DEFINE_UNQUOTED([YANG_MODELS_PATH], ["$CFG_YANGMODELS"], [path to YANG data models])
2702 AC_DEFINE_UNQUOTED([WATCHFRR_SH_PATH], ["${CFG_SBIN%/}/watchfrr.sh"], [path to watchfrr.sh])
2704 dnl various features
2705 AM_CONDITIONAL([SUPPORT_REALMS], [test "$enable_realms" = "yes"])
2706 AM_CONDITIONAL([ENABLE_BGP_VNC], [test "$enable_bgp_vnc" != "no"])
2707 AM_CONDITIONAL([BGP_BMP], [$bgpd_bmp])
2709 AM_CONDITIONAL([SQLITE3], [$SQLITE3])
2710 AM_CONDITIONAL([CONFD], [test "$enable_confd" != ""])
2711 AM_CONDITIONAL([SYSREPO], [test "$enable_sysrepo" = "yes"])
2712 AM_CONDITIONAL([GRPC], [test "$enable_grpc" = "yes"])
2713 AM_CONDITIONAL([ZEROMQ], [test "$ZEROMQ" = "true"])
2715 AM_CONDITIONAL([RPKI], [test "$RPKI" = "true"])
2716 AM_CONDITIONAL([SNMP], [test "$SNMP_METHOD" = "agentx"])
2717 AM_CONDITIONAL([IRDP], [$IRDP])
2718 AM_CONDITIONAL([FPM], [test "$enable_fpm" = "yes"])
2719 AM_CONDITIONAL([HAVE_PROTOBUF], [test "$enable_protobuf" = "yes"])
2720 AM_CONDITIONAL([HAVE_PROTOBUF3], [$PROTO3])
2723 AS_IF([test "$enable_pathd" != "no"], [
2724 AC_SUBST([PATHD_PCEP_LIBS], ["pceplib/libpcep_pcc.la"])
2725 AC_SUBST([PATHD_PCEP_INCL], ["-I./pceplib "])
2727 AC_CHECK_LIB([cunit], [CU_initialize_registry], [pcep_cunit=yes],[pcep_cunit=no])
2728 AM_CONDITIONAL([PATHD_PCEP_TEST], [test "x${pcep_cunit}" = xyes])
2729 AC_CHECK_PROG(VALGRIND_CHECK, valgrind, yes)
2730 AM_CONDITIONAL([HAVE_VALGRIND_PCEP], [test "$VALGRIND_CHECK" = "yes"])
2733 AM_CONDITIONAL([VTYSH], [test "$VTYSH" = "vtysh"])
2734 AM_CONDITIONAL([ZEBRA], [test "$enable_zebra" != "no"])
2735 AM_CONDITIONAL([BGPD], [test "$enable_bgpd" != "no"])
2736 AM_CONDITIONAL([RIPD], [test "$enable_ripd" != "no"])
2737 AM_CONDITIONAL([OSPFD], [test "$enable_ospfd" != "no"])
2738 AM_CONDITIONAL([LDPD], [test "$enable_ldpd" != "no"])
2739 AM_CONDITIONAL([BFDD], [test "$BFDD" = "bfdd"])
2740 AM_CONDITIONAL([NHRPD], [test "$NHRPD" = "nhrpd"])
2741 AM_CONDITIONAL([EIGRPD], [test "$enable_eigrpd" != "no"])
2742 AM_CONDITIONAL([WATCHFRR], [test "$WATCHFRR" = "watchfrr"])
2743 AM_CONDITIONAL([OSPFCLIENT], [test "$OSPFCLIENT" = "ospfclient"])
2744 AM_CONDITIONAL([RIPNGD], [test "$enable_ripngd" != "no"])
2745 AM_CONDITIONAL([BABELD], [test "$enable_babeld" != "no"])
2746 AM_CONDITIONAL([OSPF6D], [test "$enable_ospf6d" != "no"])
2747 AM_CONDITIONAL([ISISD], [test "$enable_isisd" != "no"])
2748 AM_CONDITIONAL([PIMD], [test "$enable_pimd" != "no"])
2749 AM_CONDITIONAL([PIM6D], [test "$enable_pim6d" != "no"])
2750 AM_CONDITIONAL([PBRD], [test "$enable_pbrd" != "no"])
2751 AM_CONDITIONAL([SHARPD], [test "$enable_sharpd" = "yes"])
2752 AM_CONDITIONAL([STATICD], [test "$enable_staticd" != "no"])
2753 AM_CONDITIONAL([FABRICD], [test "$enable_fabricd" != "no"])
2754 AM_CONDITIONAL([VRRPD], [test "$enable_vrrpd" != "no"])
2755 AM_CONDITIONAL([PATHD], [test "$enable_pathd" != "no"])
2756 AM_CONDITIONAL([PATHD_PCEP], [test "$enable_pathd" != "no"])
2757 AM_CONDITIONAL([DP_DPDK], [test "$enable_dp_dpdk" = "yes"])
2759 AC_CONFIG_FILES([Makefile],[
2760 test "$enable_dev_build" = "yes" && makefile_devbuild="--dev-build"
2761 ${PYTHON} "${ac_abs_top_srcdir}/python/makefile.py" ${makefile_devbuild} || exit 1
2764 enable_dev_build="$enable_dev_build"
2771 snapcraft/snapcraft.yaml
2773 tests/lib/cli/test_cli.refout
2774 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
2775 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
2778 AC_CONFIG_FILES([tools/frr], [chmod +x tools/frr])
2779 AC_CONFIG_FILES([tools/watchfrr.sh], [chmod +x tools/watchfrr.sh])
2780 AC_CONFIG_FILES([tools/frrinit.sh], [chmod +x tools/frrinit.sh])
2781 AC_CONFIG_FILES([tools/frrcommon.sh])
2782 AC_CONFIG_FILES([tools/frr.service])
2783 AC_CONFIG_FILES([tools/frr@.service])
2785 AS_IF([test "$with_pkg_git_version" = "yes"], [
2786 AC_CONFIG_COMMANDS([lib/gitversion.h], [
2787 dst="${ac_abs_top_builddir}/lib/gitversion.h"
2788 ${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
2789 "${ac_abs_top_srcdir}" \
2792 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2793 && rm "${dst}.tmp" \
2794 || mv "${dst}.tmp" "${dst}"
2800 ## Hack, but working solution to avoid rebuilding of frr.info.
2801 ## It's already in CVS until texinfo 4.7 is more common.
2804 if test "$enable_rpath" = "yes" ; then
2807 # See https://old-en.opensuse.org/openSUSE:Packaging_Guidelines#Removing_Rpath
2808 sed -e 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool > libtool.sed && cat libtool.sed > libtool
2809 sed -e 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool > libtool.sed && cat libtool.sed > libtool
2810 test -f libtool.sed && rm libtool.sed
2814 FRRouting configuration
2815 ------------------------------
2816 FRR version : ${PACKAGE_VERSION}
2817 host operating system : ${host_os}
2818 source code location : ${srcdir}
2820 compiler flags : ${CFLAGS} ${WERROR} ${AC_CFLAGS} ${SAN_FLAGS}
2822 linker flags : ${LDFLAGS} ${SAN_FLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
2823 state file directory : ${frr_statedir}
2824 config file directory : `eval echo \`echo ${sysconfdir}\``
2825 module directory : ${CFG_MODULE}
2826 script directory : ${CFG_SCRIPT}
2827 user to run as : ${enable_user}
2828 group to run as : ${enable_group}
2829 group for vty sockets : ${enable_vty_group}
2830 config file mask : ${enable_configfile_mask}
2831 log file mask : ${enable_logfile_mask}
2832 zebra protobuf enabled : ${enable_protobuf:-no}
2833 vici socket path : ${vici_socket}
2835 The above user and group must have read/write access to the state file
2836 directory and to the config files in the config file directory."
2838 if test -n "$enable_datacenter"; then
2839 AC_MSG_WARN([The --enable-datacenter compile time option is deprecated. Please modify the init script to pass -F datacenter to the daemons instead.])
2841 if test -n "$enable_time_check"; then
2842 AC_MSG_WARN([The --enable-time-check compile time option is deprecated. Please use the service cputime-stats configuration option instead.])
2844 if test -n "$enable_cpu_time"; then
2845 AC_MSG_WARN([The --enable-cpu-time compile time option is deprecated. Please use the service cputime-warning NNN configuration option instead.])
2848 if test "$enable_doc" != "no" -a "$frr_py_mod_sphinx" = "false"; then
2849 AC_MSG_WARN([sphinx is missing but required to build documentation])
2851 if test "$frr_py_mod_pytest" = "false"; then
2852 AC_MSG_WARN([pytest is missing, unit tests cannot be performed])