2 ## Configure template file for FRRouting.
3 ## autoconf will generate configure script.
5 ## Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
6 ## Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
10 AC_INIT(frr, 5.1-dev, [https://github.com/frrouting/frr/issues])
11 PACKAGE_URL="https://frrouting.org/"
13 PACKAGE_FULLNAME="FRRouting"
14 AC_SUBST(PACKAGE_FULLNAME)
16 CONFIG_ARGS="$ac_configure_args"
19 AC_CONFIG_SRCDIR(lib/zebra.h)
20 AC_CONFIG_MACRO_DIR([m4])
22 dnl -----------------------------------
23 dnl Get hostname and other information.
24 dnl -----------------------------------
28 AS_IF([test "$host" != "$build"], [
29 if test "$srcdir" = "."; then
30 AC_MSG_ERROR([cross-compilation is only possible with builddir separate from srcdir. create a separate directory and run as .../path-to-frr/configure.])
32 test -d hosttools || mkdir hosttools
33 abssrc="`cd \"${srcdir}\"; pwd`"
36 AC_MSG_NOTICE([... cross-compilation: creating hosttools directory and self-configuring for build platform tools])
37 AC_MSG_NOTICE([... use HOST_CPPFLAGS / HOST_CFLAGS / HOST_LDFLAGS if neccessary])
40 ( CPPFLAGS="$HOST_CPPFLAGS"; \
41 CFLAGS="$HOST_CFLAGS"; \
42 LDFLAGS="$HOST_LDFLAGS"; \
43 cd hosttools; "${abssrc}/configure" "--host=$build" "--build=$build" "--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])
61 m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
62 AM_SILENT_RULES([yes])
63 AC_CONFIG_HEADERS(config.h)
65 AC_PATH_PROG(PERL, perl)
68 dnl default is to match previous behavior
69 exampledir=${sysconfdir}
70 AC_ARG_ENABLE([exampledir],
71 AS_HELP_STRING([--enable-exampledir],
72 [specify alternate directory for examples]),
73 exampledir="$enableval",)
74 dnl XXX add --exampledir to autoconf standard directory list somehow
77 dnl default is to match previous behavior
79 AC_ARG_ENABLE([pkgsrcrcdir],
80 AS_HELP_STRING([--enable-pkgsrcrcdir],
81 [specify directory for rc.d scripts]),
82 pkgsrcrcdir="$enableval",)
83 dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
85 AM_CONDITIONAL([PKGSRC], [test "x$pkgsrcrcdir" != "x"])
87 AC_ARG_WITH([moduledir], [AS_HELP_STRING([--with-moduledir=DIR], [module directory (${libdir}/frr/modules)])], [
90 moduledir="\${libdir}/frr/modules"
92 AC_SUBST([moduledir], [$moduledir])
94 AC_ARG_ENABLE(tcmalloc,
95 AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
96 [case "${enableval}" in
97 yes) tcmalloc_enabled=true
98 LIBS="$LIBS -ltcmalloc_minimal"
100 no) tcmalloc_enabled=false ;;
101 *) AC_MSG_ERROR(bad value ${enableval} for --enable-tcmalloc) ;;
102 esac],[tcmalloc_enabled=false])
105 dnl Thanks autoconf, but we don't want a default -g -O2. We have our own
106 dnl flag determination logic.
109 dnl --------------------
110 dnl Check CC and friends
111 dnl --------------------
112 dnl note orig_cflags is also used further down
113 orig_cflags="$CFLAGS"
118 dnl remove autoconf default "-g -O2"
119 CFLAGS="$orig_cflags"
121 dnl NB: see C11 below
126 dnl autoconf 2.59 appears not to support AC_PROG_SED
128 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
130 dnl try and enable CFLAGS that are useful for FRR
131 dnl - specifically, options to control warnings
133 AC_USE_SYSTEM_EXTENSIONS
134 AC_DEFUN([AC_C_FLAG], [{
136 ac_c_flag_save="$CFLAGS"
138 AC_MSG_CHECKING([[whether $CC supports $1]])
140 [AC_LANG_PROGRAM([[]])],
143 m4_if([$3], [], [], [
144 CFLAGS="$ac_c_flag_save"
148 CFLAGS="$ac_c_flag_save"
155 AC_DEFUN([AC_LINK_IFELSE_FLAGS], [{
157 ac_cflags_save="$CFLAGS"
165 CFLAGS="$ac_cflags_save"
170 CFLAGS="$ac_cflags_save"
177 dnl ICC won't bail on unknown options without -diag-error 10006
178 dnl need to do this first so we get useful results for the other options
179 AC_C_FLAG([-diag-error 10006])
181 dnl AC_PROG_CC_C99 may change CC to include -std=gnu99 or something
183 CC="${CC% -std=gnu99}"
186 AC_C_FLAG([-std=gnu11], [CC="$ac_cc"], [CC="$CC -std=gnu11"])
188 dnl AddressSanitizer support
189 AC_ARG_ENABLE([address-sanitizer], AS_HELP_STRING([--enable-address-sanitizer], \
190 [enabled AddressSanitizer support for detecting a wide variety of \
191 memory allocation and deallocation errors]), \
192 [AC_DEFINE(HAVE_ADDRESS_SANITIZER, 1, [enable AddressSanitizer])
193 ASAN_FLAGS="-fsanitize=address"
194 SAN_CLIPPY_FLAGS="-fno-sanitize=all"
195 AC_SUBST([ASAN_FLAGS])
196 AC_SUBST([SAN_CLIPPY_FLAGS])
198 AC_TRY_COMPILE([],[const int i=0;],[AC_MSG_NOTICE([Address Sanitizer Enabled])],
199 [AC_MSG_ERROR([Address Sanitizer not available])])
202 dnl ThreadSanitizer support
203 AC_ARG_ENABLE([thread-sanitizer], AS_HELP_STRING([--enable-thread-sanitizer], \
204 [enabled ThreadSanitizer support for detecting data races]), \
205 [AC_DEFINE(HAVE_THREAD_SANITIZER, 1, [enable ThreadSanitizer])
206 TSAN_FLAGS="-fsanitize=thread"
207 SAN_CLIPPY_FLAGS="-fno-sanitize=all"
208 AC_SUBST([TSAN_FLAGS])
209 AC_SUBST([SAN_CLIPPY_FLAGS])
211 AC_TRY_COMPILE([],[const int i=0;],[AC_MSG_NOTICE([Thread Sanitizer Enabled])],
212 [AC_MSG_ERROR([Thread Sanitizer not available])])
215 dnl MemorySanitizer support
216 AC_ARG_ENABLE([memory-sanitizer], AS_HELP_STRING([--enable-memory-sanitizer], \
217 [enabled MemorySanitizer support for detecting uninitialized memory reads]), \
218 [AC_DEFINE(HAVE_THREAD_SANITIZER, 1, [enable MemorySanitizer])
219 MSAN_FLAGS="-fsanitize=memory -fPIE -pie"
220 SAN_CLIPPY_FLAGS="-fno-sanitize=all"
221 AC_SUBST([MSAN_FLAGS])
222 AC_SUBST([SAN_CLIPPY_FLAGS])
224 AC_TRY_COMPILE([],[const int i=0;],[AC_MSG_NOTICE([Memory Sanitizer Enabled])],
225 [AC_MSG_ERROR([Memory Sanitizer not available])])
228 dnl if the user has specified any CFLAGS, override our settings
229 if test "x${enable_dev_build}" = "xyes"; then
230 AC_DEFINE(DEV_BUILD,,Build for development)
231 if test "z$orig_cflags" = "z"; then
236 if test "z$orig_cflags" = "z"; then
243 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
245 dnl always want these CFLAGS
246 AC_C_FLAG([-fno-omit-frame-pointer])
247 AC_C_FLAG([-funwind-tables])
250 AC_C_FLAG([-Wmissing-prototypes])
251 AC_C_FLAG([-Wmissing-declarations])
252 AC_C_FLAG([-Wpointer-arith])
253 AC_C_FLAG([-Wbad-function-cast])
254 AC_C_FLAG([-Wwrite-strings])
255 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
256 AC_C_FLAG([-Wcast-qual])
257 AC_C_FLAG([-Wstrict-prototypes])
258 AC_C_FLAG([-Wmissing-noreturn])
259 AC_C_FLAG([-Wmissing-format-attribute])
260 AC_C_FLAG([-Wunreachable-code])
261 AC_C_FLAG([-Wpacked])
262 AC_C_FLAG([-Wpadded])
264 AC_C_FLAG([-Wno-unused-result])
266 AC_C_FLAG([-Wno-unused-parameter])
267 AC_C_FLAG([-Wno-missing-field-initializers])
269 dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
270 dnl for some reason the string consts get 'promoted' to char *,
271 dnl triggering a const to non-const conversion warning.
272 AC_C_FLAG([-diag-disable 3179])
274 if test x"${enable_werror}" = x"yes" ; then
279 dnl need link on this one, not compile
281 ac_ld_flag_save="$LDFLAGS"
282 LDFLAGS="$LDFLAGS -rdynamic"
283 AC_MSG_CHECKING([[whether linker supports -rdynamic]])
285 [AC_LANG_PROGRAM([[]])],
286 [AC_MSG_RESULT([yes])],
288 LDFLAGS="$ac_ld_flag_save"
299 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
300 LIBS="$PTHREAD_LIBS $LIBS"
302 AC_MSG_FAILURE([This FRR version needs pthreads])
311 AC_CHECK_TOOL(AR, ar)
313 dnl -----------------
314 dnl System extensions
315 dnl -----------------
323 dnl ----------------------
324 dnl Packages configuration
325 dnl ----------------------
326 AC_ARG_WITH(pkg-extra-version,
327 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]),
328 [EXTRAVERSION=$withval],)
329 AC_ARG_WITH(pkg-git-version,
330 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
331 [ test "x$withval" != "xno" && with_pkg_git_version="yes" ])
332 AC_ARG_WITH(vtysh_pager,
333 AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
334 VTYSH_PAGER=$withval, VTYSH_PAGER="more")
336 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for FRR]))
338 AS_HELP_STRING([--disable-doc], [do not build docs]))
340 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
342 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
344 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
345 AC_ARG_ENABLE(ripngd,
346 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
348 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
349 AC_ARG_ENABLE(ospf6d,
350 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
352 AS_HELP_STRING([--enable-ldpd], [build ldpd]))
354 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
355 AC_ARG_ENABLE(eigrpd,
356 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
357 AC_ARG_ENABLE(babeld,
358 AS_HELP_STRING([--disable-babeld], [do not build babeld]))
359 AC_ARG_ENABLE(watchfrr,
360 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
362 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
364 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
366 AS_HELP_STRING([--disable-pbrd], [do not build pbrd]))
367 AC_ARG_ENABLE(sharpd,
368 AS_HELP_STRING([--enable-sharpd], [do not build sharpd]))
369 AC_ARG_ENABLE(bgp-announce,
370 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
371 AC_ARG_ENABLE(bgp-vnc,
372 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
373 AC_ARG_WITH(rfp-path,
374 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
376 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
377 AC_ARG_ENABLE(zeromq,
378 AS_HELP_STRING([--enable-zeromq], [enable ZeroMQ handler (libfrrzmq)]))
380 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
381 AC_ARG_ENABLE(ospfapi,
382 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
383 AC_ARG_ENABLE(ospfclient,
384 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
385 (this is the default if --disable-ospfapi is set)]))
386 AC_ARG_ENABLE(multipath,
387 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
389 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
391 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
392 AC_ARG_ENABLE(vty_group,
393 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
394 AC_ARG_ENABLE(configfile_mask,
395 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
396 AC_ARG_ENABLE(logfile_mask,
397 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
398 AC_ARG_ENABLE(shell_access,
399 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
400 AC_ARG_ENABLE(realms,
401 AS_HELP_STRING([--enable-realms], [enable REALMS support under Linux]))
403 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
405 AS_HELP_STRING([--disable-irdp], [enable IRDP server support in zebra (default if supported)]))
406 AC_ARG_ENABLE(capabilities,
407 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
408 AC_ARG_ENABLE(rusage,
409 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
410 AC_ARG_ENABLE(gcc_ultra_verbose,
411 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
412 AC_ARG_ENABLE(linux24_tcp_md5,
413 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
414 AC_ARG_ENABLE(backtrace,
415 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
416 AC_ARG_ENABLE(time-check,
417 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
418 AC_ARG_ENABLE(pcreposix,
419 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
421 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
422 AC_ARG_ENABLE(systemd,
423 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
424 AC_ARG_ENABLE(werror,
425 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
426 AC_ARG_ENABLE(cumulus,
427 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
428 AC_ARG_ENABLE(datacenter,
429 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
430 AC_ARG_ENABLE(fuzzing,
431 AS_HELP_STRING([--enable-fuzzing], [enable ability to fuzz various parts of FRR]))
432 AC_ARG_ENABLE(rr-semantics,
433 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
434 AC_ARG_ENABLE([protobuf],
435 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
436 AC_ARG_ENABLE([oldvpn_commands],
437 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
439 AS_HELP_STRING([--enable-rpki], [enable RPKI prefix validation support]))
440 AC_ARG_ENABLE([clippy-only],
441 AS_HELP_STRING([--enable-clippy-only], [Only build clippy]))
442 AC_ARG_ENABLE([numeric_version],
443 AS_HELP_STRING([--enable-numeric-version], [Only numeric digits allowed in version (for Alpine)]))
445 AS_IF([test "${enable_clippy_only}" != "yes"], [
446 AC_CHECK_HEADERS(json-c/json.h)
447 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c", [], [-lm])
448 if test $ac_cv_lib_json_c_json_object_get = no; then
449 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
450 if test $ac_cv_lib_json_json_object_get = no; then
451 AC_MSG_ERROR([lib json is needed to compile])
456 AC_ARG_ENABLE([dev_build],
457 AS_HELP_STRING([--enable-dev-build], [build for development]))
459 if test x"${enable_time_check}" != x"no" ; then
460 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
461 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
463 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
467 case "${enable_systemd}" in
470 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
471 if test $ac_cv_lib_systemd_sd_notify = no; then
472 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
474 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
480 if test "${enable_rr_semantics}" != "no" ; then
481 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
484 if test "${enable_datacenter}" = "yes" ; then
485 AC_DEFINE(HAVE_DATACENTER,,Compile extensions for a DataCenter)
486 DFLT_NAME="datacenter"
488 DFLT_NAME="traditional"
491 if test "${enable_fuzzing}" = "yes" ; then
492 AC_DEFINE(HANDLE_ZAPI_FUZZING,,Compile extensions to use with a fuzzer)
495 if test "${enable_cumulus}" = "yes" ; then
496 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
500 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
502 if test "${enable_shell_access}" = "yes"; then
503 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
506 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
511 AS_IF([test "$host" = "$build"], [
515 # 1. try python3, but respect the user's preference on which minor ver
516 # 2. try python, which might be py3 or py2 again on the user's preference
517 # 3. try python2 (can really only be 2.7 but eh)
518 # 4. try 3.5 > 3.4 > 3.3 > 3.2 > 2.7 through pkg-config (no user pref)
520 # (AX_PYTHON_DEVEL has no clue about py3 vs py2)
521 # (AX_PYTHON does not do what we need)
523 AC_CHECK_TOOLS([PYTHONCONFIG], [python3-config python-config python2-config])
524 if test -n "$PYTHONCONFIG"; then
525 PYTHON_CFLAGS="`\"${PYTHONCONFIG}\" --includes`"
526 PYTHON_LIBS="`\"${PYTHONCONFIG}\" --libs`"
528 AC_MSG_CHECKING([whether we found a working Python version])
529 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
531 #if PY_VERSION_HEX < 0x02070000
532 #error python too old
548 if test -z "$PYTHONCONFIG"; then
549 PKG_CHECK_MODULES([PYTHON], python-3.5, [], [
550 PKG_CHECK_MODULES([PYTHON], python-3.4, [], [
551 PKG_CHECK_MODULES([PYTHON], python-3.3, [], [
552 PKG_CHECK_MODULES([PYTHON], python-3.2, [], [
553 PKG_CHECK_MODULES([PYTHON], python-2.7, [], [
554 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
558 AC_MSG_CHECKING([whether we found a working Python version])
559 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
561 #if PY_VERSION_HEX < 0x02070000
562 #error python too old
572 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
576 AC_SUBST(PYTHON_CFLAGS)
577 AC_SUBST(PYTHON_LIBS)
580 # Logic for protobuf support.
582 if test "$enable_protobuf" = "yes"; then
586 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
587 if test "x$PROTOC_C" = "x/bin/false"; then
591 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
592 [found_protobuf_c=yes],
593 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
595 if test "x$found_protobuf_c" = "xyes"; then
596 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
597 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
599 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
600 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
606 # Logic for old vpn commans support.
608 if test "$enable_oldvpn_commands" = "yes"; then
609 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
612 # Fail if the user explicity enabled protobuf support and we couldn't
613 # find the compiler or libraries.
614 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
615 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
618 if test "x$have_protobuf" = "xyes"; then
619 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
622 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
625 # End of logic for protobuf support.
628 if test "${enable_linux24_tcp_md5}" = "yes"; then
629 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
632 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
633 if test "${enable_rtadv}" != "no"; then
635 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
640 if test x"${enable_user}" = x"no"; then
643 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
646 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
649 if test x"${enable_group}" = x"no"; then
652 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
655 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
658 if test x"${enable_vty_group}" = x"yes" ; then
659 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
660 elif test x"${enable_vty_group}" != x""; then
661 if test x"${enable_vty_group}" != x"no"; then
662 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
665 AC_SUBST([enable_user])
666 AC_SUBST([enable_group])
667 AC_SUBST([enable_vty_group])
669 enable_configfile_mask=${enable_configfile_mask:-0600}
670 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
672 enable_logfile_mask=${enable_logfile_mask:-0600}
673 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
677 case "${enable_multipath}" in
681 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
682 MPATH_NUM="${enable_multipath}"
687 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
691 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
693 AC_DEFINE_UNQUOTED(VTYSH_PAGER, "$VTYSH_PAGER", [What pager to use])
695 dnl ------------------------------------
696 dnl Alpine only accepts numeric versions
697 dnl ------------------------------------
698 if test "x${enable_numeric_version}" != "x" ; then
699 VERSION="`echo ${VERSION} | tr -c -d '[[.0-9]]'`"
700 PACKAGE_VERSION="`echo ${PACKAGE_VERSION} | tr -c -d '[[.0-9]]'`"
703 dnl -----------------------------------
704 dnl Add extra version string to package
705 dnl name, string and version fields.
706 dnl -----------------------------------
707 if test "x${EXTRAVERSION}" != "x" ; then
708 VERSION="${VERSION}${EXTRAVERSION}"
709 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
710 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
711 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
714 if test "x$with_pkg_git_version" = "xyes"; then
715 if test -d "${srcdir}/.git"; then
716 AC_DEFINE(GIT_VERSION, [1], [include git version info])
717 else with_pkg_git_version="no"
718 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
721 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
723 dnl ------------------------------------
724 dnl Check C keywords and standard types
725 dnl ------------------------------------
736 dnl -------------------------
737 dnl Check other header files.
738 dnl -------------------------
739 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
740 linux/version.h asm/types.h \
743 ac_stdatomic_ok=false
744 AC_DEFINE(FRR_AUTOCONF_ATOMIC, 1, [did autoconf checks for atomic funcs])
745 AC_CHECK_HEADER([stdatomic.h],[
747 AC_MSG_CHECKING([whether _Atomic qualifier works])
748 AC_LINK_IFELSE([AC_LANG_SOURCE([[
749 #include <stdatomic.h>
750 int main(int argc, char **argv) {
755 AC_DEFINE(HAVE_STDATOMIC_H, 1, [found stdatomic.h])
763 AS_IF([$ac_stdatomic_ok], [true], [
764 AC_MSG_CHECKING([for __atomic_* builtins])
765 AC_LINK_IFELSE([AC_LANG_SOURCE([[
766 int main(int argc, char **argv) {
768 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
769 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
772 AC_DEFINE(HAVE___ATOMIC, 1, [found __atomic builtins])
777 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
778 AC_MSG_CHECKING([for __sync_* builtins])
779 AC_LINK_IFELSE([AC_LANG_SOURCE([[
780 int main(int argc, char **argv) {
782 __sync_fetch_and_sub (&i, 1);
783 return __sync_val_compare_and_swap (&i, 0, 1);
786 AC_DEFINE(HAVE___SYNC, 1, [found __sync builtins])
789 AC_MSG_CHECKING([for __sync_swap builtin])
790 AC_LINK_IFELSE([AC_LANG_SOURCE([[
791 int main(int argc, char **argv) {
793 return __sync_swap (&i, 2);
796 AC_DEFINE(HAVE___SYNC_SWAP, 1, [found __sync_swap builtin])
804 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
809 dnl Utility macro to avoid retyping includes all the time
810 m4_define([FRR_INCLUDES],
813 #define __EXTENSIONS__
818 #include <sys/types.h>
819 /* sys/conf.h depends on param.h on FBSD at least */
820 #include <sys/param.h>
821 /* Required for MAXSIG */
823 #include <sys/socket.h>
825 # define __APPLE_USE_RFC_3542
827 #include <netinet/in.h>
828 #include <sys/time.h>
833 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
834 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
835 dnl an additional round for it.
837 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
839 m4_define([FRR_INCLUDES],
841 [#if HAVE_NET_IF_VAR_H
842 # include <net/if_var.h>
846 AC_CHECK_HEADERS([netinet/in_var.h \
847 net/if_dl.h net/netopt.h \
848 inet/nd.h netinet/ip_icmp.h \
849 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
850 [], [], FRR_INCLUDES)
852 AC_CHECK_HEADERS([ucontext.h], [], [],
855 #endif /* __USE_GNU */
859 m4_define([UCONTEXT_INCLUDES],
860 [#include <ucontext.h>])dnl
862 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
863 [], [], [UCONTEXT_INCLUDES])
864 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
865 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
866 [], [], [UCONTEXT_INCLUDES])],
867 [], [UCONTEXT_INCLUDES])
868 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
869 [], [], [UCONTEXT_INCLUDES])
871 m4_define([FRR_INCLUDES],
875 #include <netinet/in_systm.h>
876 #if HAVE_NETINET_IN_VAR_H
877 # include <netinet/in_var.h>
880 # include <net/if_dl.h>
882 #if HAVE_NET_NETOPT_H
883 # include <net/netopt.h>
885 #include <net/route.h>
887 # include <inet/nd.h>
889 #include <arpa/inet.h>
890 /* Required for IDRP */
891 #if HAVE_NETINET_IP_ICMP_H
892 # include <netinet/ip_icmp.h>
896 dnl V6 headers are checked below, after we check for v6
898 AC_MSG_CHECKING([which operating system interface to use])
901 AC_MSG_RESULT([Solaris])
903 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
904 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
906 AC_CHECK_LIB(socket, main)
907 AC_CHECK_LIB(nsl, main)
908 AC_CHECK_LIB(umem, main)
909 AC_CHECK_FUNCS([printstack], [
910 AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
911 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
917 AC_MSG_RESULT([Linux])
919 AC_DEFINE(GNU_LINUX,,GNU Linux)
920 AC_DEFINE(HAVE_NETLINK,,netlink)
921 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
923 dnl Linux has a compilation problem with mixing
924 dnl netinet/in.h and linux/in6.h they are not
925 dnl compatible. There has been discussion on
926 dnl how to fix it but no real progress on implementation
927 dnl when they fix it, remove this
928 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
931 AC_MSG_RESULT([OpenBSD])
933 AC_DEFINE(OPEN_BSD,,OpenBSD)
934 AC_DEFINE(KAME,1,KAME IPv6)
935 AC_DEFINE(BSD_V6_SYSCTL,1,BSD v6 sysctl to turn on and off forwarding)
937 if test "x${enable_pimd}" != "xno"; then
942 AC_MSG_FAILURE([pimd cannot be enabled as PIM support has been removed from OpenBSD 6.1])
950 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
951 AC_DEFINE(KAME,1,KAME IPv6)
952 AC_DEFINE(BSD_V6_SYSCTL,1,BSD v6 sysctl to turn on and off forwarding)
955 AM_CONDITIONAL(SOLARIS, test "${SOLARIS}" = "solaris")
959 dnl ------------------------
960 dnl Integrated REALMS option
961 dnl ------------------------
962 if test "${enable_realms}" = "yes"; then
965 AC_DEFINE(SUPPORT_REALMS,, Realms support)
968 echo "Sorry, only Linux has REALMS support"
973 AM_CONDITIONAL([SUPPORT_REALMS], [test "${enable_realms}" = "yes"])
975 dnl ---------------------
976 dnl Integrated VTY option
977 dnl ---------------------
978 case "${enable_vtysh}" in
981 AC_DEFINE(VTYSH,,VTY shell)
982 dnl Vtysh uses libreadline, which looks for termcap functions at
983 dnl configure time. We follow readlines search order.
984 dnl The required procedures are in libtermcap on NetBSD, in
985 dnl [TODO] on Linux, and in [TODO] on Solaris.
986 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
987 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
988 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
989 [AC_CHECK_LIB(ncurses, tputs,
990 LIBREADLINE="$LIBREADLINE -lncurses")]
994 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
996 if test $ac_cv_lib_readline_main = no; then
997 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
999 AC_CHECK_HEADER(readline/history.h)
1000 if test $ac_cv_header_readline_history_h = no;then
1001 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
1003 AC_CHECK_LIB(readline, rl_completion_matches,
1004 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
1005 if test $ac_cv_lib_readline_rl_completion_matches = no; then
1006 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
1010 AC_SUBST(LIBREADLINE)
1011 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
1016 dnl FRR detects the PAM library it is built against by checking for a
1017 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
1018 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
1019 dnl openpam.h doesn't do that, although depends on the header too. Hence a
1020 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
1023 if test "$with_libpam" = "yes"; then
1024 AC_CHECK_HEADER([security/pam_misc.h],
1025 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
1026 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
1027 pam_conv_func="misc_conv"
1030 AC_CHECK_HEADER([security/openpam.h],
1031 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
1032 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
1033 pam_conv_func="openpam_ttyconv"
1035 [], FRR_INCLUDES[#include <security/pam_appl.h>])
1036 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
1037 AC_MSG_WARN([*** pam support will not be built ***])
1042 if test "$with_libpam" = "yes"; then
1043 dnl took this test from proftpds configure.in and suited to our needs
1044 dnl -------------------------------------------------------------------------
1046 dnl This next check looks funky due to a linker problem with some versions
1047 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
1048 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
1049 dnl with RedHat 6.2 and Debian 2.2 or better.
1050 AC_CHECK_LIB(pam, pam_start,
1051 [AC_CHECK_LIB(pam, $pam_conv_func,
1052 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1054 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1055 LIBPAM="-lpam -lpam_misc"]
1059 [AC_CHECK_LIB(pam, pam_end,
1060 [AC_CHECK_LIB(pam, $pam_conv_func,
1061 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1062 LIBPAM="-lpam -ldl"],
1063 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1064 LIBPAM="-lpam -ldl -lpam_misc"]
1066 ],AC_MSG_WARN([*** pam support will not be built ***]),
1073 dnl -------------------------------
1074 dnl Endian-ness check
1075 dnl -------------------------------
1078 dnl -------------------------------
1079 dnl check the size in byte of the C
1080 dnl -------------------------------
1081 dnl AC_CHECK_SIZEOF(char)
1082 dnl AC_CHECK_SIZEOF(int)
1083 dnl AC_CHECK_SIZEOF(short)
1084 dnl AC_CHECK_SIZEOF(long)
1086 dnl ----------------------------
1087 dnl check existance of functions
1088 dnl ----------------------------
1094 dnl -------------------------------
1095 dnl bgpd needs pow() and hence libm
1096 dnl -------------------------------
1098 AC_CHECK_HEADER([math.h],
1099 [AC_CHECK_LIB([m], [pow],
1102 AC_CHECK_FUNCS(pow,[],[LIBM=""])
1105 if test x"$LIBM" = x ; then
1106 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1111 AC_CHECK_FUNCS([ppoll], [
1112 AC_DEFINE([HAVE_PPOLL], 1, [have Linux/BSD ppoll()])
1114 AC_CHECK_FUNCS([pollts], [
1115 AC_DEFINE([HAVE_POLLTS], 1, [have NetBSD pollts()])
1125 AC_CHECK_HEADER([asm-generic/unistd.h],
1126 [AC_CHECK_DECL(__NR_setns,
1127 AC_DEFINE(HAVE_NETNS,, Have netns),,
1128 FRR_INCLUDES [#include <asm-generic/unistd.h>
1130 AC_CHECK_FUNCS(setns)]
1133 dnl --------------------------
1134 dnl Determine IS-IS I/O method
1135 dnl --------------------------
1136 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
1137 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
1138 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
1139 AC_CHECK_HEADER(net/bpf.h)
1140 AC_CHECK_HEADER(sys/dlpi.h)
1141 AC_MSG_CHECKING(zebra IS-IS I/O method)
1145 AC_MSG_RESULT(pfpacket)
1146 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1150 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1153 if test $ac_cv_header_net_bpf_h = no; then
1154 if test $ac_cv_header_sys_dlpi_h = no; then
1156 if test "${enable_isisd}" = yes; then
1157 AC_MSG_FAILURE([IS-IS support requested but no packet backend found])
1159 AC_MSG_WARN([*** IS-IS support will not be built ***])
1164 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1167 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
1171 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
1173 dnl ------------------------------------
1174 dnl check for broken CMSG_FIRSTHDR macro
1175 dnl ------------------------------------
1176 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
1177 AC_RUN_IFELSE([AC_LANG_SOURCE([[
1180 #define __EXTENSIONS__
1183 #include <sys/types.h>
1184 #include <sys/socket.h>
1191 msg.msg_control = buf;
1192 msg.msg_controllen = 0;
1194 if (CMSG_FIRSTHDR(&msg) != NULL)
1197 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
1198 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
1200 dnl ---------------------------------------------------------------
1201 dnl figure out how to specify an interface in multicast sockets API
1202 dnl ---------------------------------------------------------------
1203 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1205 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1206 #include <sys/socket.h>
1207 #include <netinet/in.h>
1208 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1209 #include <linux/types.h>
1212 m4_define([FRR_INCLUDES],
1214 [#if HAVE_LINUX_MROUTE_H
1215 # include <linux/mroute.h>
1219 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1220 #include <sys/socket.h>
1221 #include <sys/types.h>
1222 #include <netinet/in.h>
1223 #include <net/route.h>
1226 m4_define([FRR_INCLUDES],
1228 [#if HAVE_NETINET_IP_MROUTE_H
1229 # include <netinet/ip_mroute.h>
1233 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1234 AC_TRY_COMPILE([#include <sys/param.h>],
1235 [#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)
1238 #error No support for BSD struct ip_mreq hack detected
1239 #endif],[AC_MSG_RESULT(yes)
1240 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1243 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1245 #include <sys/types.h>
1246 #include <netinet/in.h>
1247 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1248 ], [AC_MSG_RESULT(yes)
1249 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1252 dnl ---------------------------------------------------------------
1253 dnl figure out how to check link-state
1254 dnl ---------------------------------------------------------------
1255 AC_CHECK_HEADER( [net/if_media.h],
1256 [m4_define([LINK_DETECT_INCLUDES],
1258 [#include <net/if_media.h>
1260 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1261 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1262 [], LINK_DETECT_INCLUDES)],
1266 dnl ---------------------------------------------------------------
1267 dnl Additional, newer way to check link-state using ifi_link_state.
1268 dnl Not available in all BSD's when ifmediareq available
1269 dnl ---------------------------------------------------------------
1270 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1271 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1274 dnl ------------------------
1275 dnl TCP_MD5SIG socket option
1276 dnl ------------------------
1278 AC_CHECK_HEADER([netinet/tcp.h],
1279 [m4_define([MD5_INCLUDES],
1281 [#include <netinet/tcp.h>
1283 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1286 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1287 AC_CHECK_HEADER([linux/tcp.h],
1288 [m4_define([MD5_INCLUDES],
1290 [#include <linux/tcp.h>
1292 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1295 dnl ----------------------------------------------------------------------------
1296 dnl figure out if domainname is available in the utsname struct (GNU extension).
1297 dnl ----------------------------------------------------------------------------
1298 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1300 dnl ------------------
1301 dnl IPv6 header checks
1302 dnl ------------------
1303 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1304 netinet6/in6_var.h netinet6/nd6.h], [], [],
1307 m4_define([FRR_INCLUDES],dnl
1309 [#if HAVE_NETINET6_IN6_H
1310 #include <netinet6/in6.h>
1312 #if HAVE_NETINET_IN6_VAR_H
1313 #include <netinet/in6_var.h>
1315 #include <netinet/icmp6.h>
1316 #if HAVE_NETINET6_IN6_VAR_H
1317 # include <netinet6/in6_var.h>
1319 #if HAVE_NETINET6_ND6_H
1320 # include <netinet6/nd6.h>
1324 dnl disable doc check
1325 if test "${enable_doc}" = "no";then
1331 dnl --------------------
1332 dnl Daemon disable check
1333 dnl --------------------
1334 AM_CONDITIONAL(ZEBRA, test "${enable_zebra}" != "no")
1336 if test "${enable_bgpd}" = "no";then
1341 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1343 AM_CONDITIONAL(RIPD, test "${enable_ripd}" != "no")
1344 AM_CONDITIONAL(OSPFD, test "${enable_ospfd}" != "no")
1345 AM_CONDITIONAL(LDPD, test "${enable_ldpd}" != "no")
1347 AS_IF([test "${enable_ldpd}" != "no"], [
1348 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1354 if test "${enable_nhrpd}" != "no"; then
1359 if test "${enable_nhrpd}" = "yes"; then
1360 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1364 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1366 AM_CONDITIONAL(EIGRPD, test "${enable_eigrpd}" != "no")
1368 if test "${enable_watchfrr}" = "no";then
1373 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1376 if test "${enable_ospfapi}" != "no";then
1377 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1379 if test "${enable_ospfclient}" != "no";then
1380 OSPFCLIENT="ospfclient"
1384 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1385 AM_CONDITIONAL(RIPNGD, test "${enable_ripngd}" != "no")
1386 AM_CONDITIONAL(BABELD, test "${enable_babeld}" != "no")
1387 AM_CONDITIONAL(OSPF6D, test "${enable_ospf6d}" != "no")
1388 AM_CONDITIONAL(ISISD, test "${enable_isisd}" != "no")
1389 AM_CONDITIONAL(PIMD, test "${enable_pimd}" != "no")
1390 AM_CONDITIONAL(PBRD, test "${enable_pbrd}" != "no")
1391 AM_CONDITIONAL(SHARPD, test "${enable_sharpd}" = "yes")
1393 if test "${enable_bgp_announce}" = "no";then
1394 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1396 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1399 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1400 with_rfp_path="bgpd/rfp-example"
1402 if test "${with_rfp_path}" != "no"; then
1403 VNC_RFP_PATH="${with_rfp_path}"
1404 AC_SUBST(VNC_RFP_PATH)
1407 if test "${enable_bgp_vnc}" != "no";then
1408 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1409 RFPTEST="${with_rfp_path}/rfptest"
1410 LIBRFP="${with_rfp_path}/librfp"
1411 RFPINC="${with_rfp_path}/librfp"
1415 RFPINC="bgpd/rfp-example/librfp"
1418 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1428 AC_CHECK_LIB(crypt, crypt, [],
1429 [AC_CHECK_LIB(crypto, DES_crypt)])
1430 AC_CHECK_LIB(resolv, res_init)
1432 dnl ---------------------------
1433 dnl check system has PCRE regexp
1434 dnl ---------------------------
1435 if test "x$enable_pcreposix" = "xyes"; then
1436 AC_CHECK_LIB(pcreposix, regexec, [], [
1437 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1440 AC_SUBST(HAVE_LIBPCREPOSIX)
1442 dnl ------------------
1443 dnl check C-Ares library
1444 dnl ------------------
1445 if test "${NHRPD}" != ""; then
1446 PKG_CHECK_MODULES([CARES], [libcares], , [
1447 AC_MSG_ERROR([trying to build nhrpd, but libcares not found. install c-ares and its -dev headers.])
1452 dnl ------------------
1453 dnl check Net-SNMP library
1454 dnl ------------------
1455 if test "${enable_snmp}" != "" -a "${enable_snmp}" != "no"; then
1456 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1457 if test x"$NETSNMP_CONFIG" = x"no"; then
1458 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1460 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1461 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1462 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1463 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
1471 AC_MSG_ERROR([--enable-snmp given but not usable])])
1472 case "${enable_snmp}" in
1477 SNMP_METHOD="${enable_snmp}"
1480 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1483 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1484 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1485 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1487 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1489 AC_SUBST(SNMP_CFLAGS)
1494 AC_SEARCH_LIBS([sqrt], [m])
1499 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1500 AC_MSG_ERROR([unable to find the dlopen()])
1503 AC_CHECK_HEADERS([link.h])
1505 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1506 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1514 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1517 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1522 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1523 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1530 struct link_map *lm = NULL;
1531 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1534 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1540 AM_CONDITIONAL(SNMP, test "x$SNMP_METHOD" = "xagentx")
1542 dnl ---------------------------
1543 dnl sockaddr and netinet checks
1544 dnl ---------------------------
1547 struct vifctl, struct mfcctl, struct sioc_sg_req,
1548 vifi_t, struct sioc_vif_req, struct igmpmsg,
1549 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1550 struct nd_opt_adv_interval, struct rt_addrinfo,
1551 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1552 [], [], FRR_INCLUDES)
1554 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1555 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1556 struct sockaddr_dl.sdl_len,
1557 struct if6_aliasreq.ifra_lifetime,
1558 struct nd_opt_adv_interval.nd_opt_ai_type],
1559 [], [], FRR_INCLUDES)
1561 dnl ---------------------------
1562 dnl IRDP/pktinfo/icmphdr checks
1563 dnl ---------------------------
1565 AC_CHECK_TYPES([struct in_pktinfo], [
1566 AC_CHECK_TYPES([struct icmphdr], [
1575 case "${enable_irdp}" in
1577 $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1584 AM_CONDITIONAL(IRDP, $IRDP)
1586 dnl -----------------------
1587 dnl checking for IP_PKTINFO
1588 dnl -----------------------
1589 AC_MSG_CHECKING(for IP_PKTINFO)
1590 AC_TRY_COMPILE([#include <netdb.h>], [
1591 int opt = IP_PKTINFO;
1594 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1599 dnl ---------------------------
1600 dnl checking for IP_RECVDSTADDR
1601 dnl ---------------------------
1602 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1603 AC_TRY_COMPILE([#include <netinet/in.h>], [
1604 int opt = IP_RECVDSTADDR;
1607 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1612 dnl ----------------------
1613 dnl checking for IP_RECVIF
1614 dnl ----------------------
1615 AC_MSG_CHECKING(for IP_RECVIF)
1616 AC_TRY_COMPILE([#include <netinet/in.h>], [
1617 int opt = IP_RECVIF;
1620 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1625 dnl ----------------------
1626 dnl checking for SO_BINDANY
1627 dnl ----------------------
1628 AC_MSG_CHECKING(for SO_BINDANY)
1629 AC_TRY_COMPILE([#include <sys/socket.h>], [
1630 int opt = SO_BINDANY;
1633 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1638 dnl ----------------------
1639 dnl checking for IP_FREEBIND
1640 dnl ----------------------
1641 AC_MSG_CHECKING(for IP_FREEBIND)
1642 AC_TRY_COMPILE([#include <netinet/in.h>], [
1643 int opt = IP_FREEBIND;
1646 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1651 dnl --------------------------------------
1652 dnl checking for be32dec existence or not
1653 dnl --------------------------------------
1654 AC_CHECK_DECLS([be32enc, be32dec], [], [],
1655 [#include <sys/endian.h>])
1657 dnl --------------------------------------
1658 dnl checking for clock_time monotonic struct and call
1659 dnl --------------------------------------
1660 AC_CHECK_DECL(CLOCK_MONOTONIC,
1661 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1662 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1663 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1665 dnl --------------------------------------
1666 dnl checking for flex and bison
1667 dnl --------------------------------------
1670 AC_MSG_CHECKING(version of flex)
1671 frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1672 frr_ac_flex_version="${frr_ac_flex_version##* }"
1673 AC_MSG_RESULT([$frr_ac_flex_version])
1674 AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
1675 LEX="$SHELL $missing_dir/missing flex"
1676 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1677 AC_MSG_WARN([using pregenerated flex output files])
1679 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1681 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1682 AC_SUBST([LEXLIB], [''])
1686 dnl thanks GNU bison for this b*llshit...
1687 AC_MSG_CHECKING(version of bison)
1688 frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1689 frr_ac_bison_version="${frr_ac_bison_version##* }"
1690 frr_ac_bison_missing="false"
1691 case "x${frr_ac_bison_version}" in
1694 BISON_CLOSEBRACE='"'
1696 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
1699 AC_MSG_RESULT([$frr_ac_bison_version])
1700 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1701 frr_ac_bison_missing="true"
1704 AC_MSG_RESULT([none])
1705 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1706 frr_ac_bison_missing="true"
1710 BISON_CLOSEBRACE='}'
1711 BISON_VERBOSE='-Dparse.error=verbose'
1712 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 or newer])
1715 AC_SUBST(BISON_OPENBRACE)
1716 AC_SUBST(BISON_CLOSEBRACE)
1717 AC_SUBST(BISON_VERBOSE)
1719 if $frr_ac_bison_missing; then
1720 YACC="$SHELL $missing_dir/missing bison -y"
1721 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1722 AC_MSG_WARN([using pregenerated bison output files])
1724 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1728 dnl -------------------
1729 dnl capabilities checks
1730 dnl -------------------
1731 if test "${enable_capabilities}" != "no"; then
1732 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1733 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1735 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1736 frr_ac_keepcaps="yes"],
1739 if test x"${frr_ac_keepcaps}" = x"yes"; then
1740 AC_CHECK_HEADERS(sys/capability.h)
1742 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1743 AC_CHECK_LIB(cap, cap_init,
1744 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1749 AC_CHECK_HEADERS(priv.h,
1750 [AC_MSG_CHECKING(Solaris style privileges are available)
1751 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1753 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1754 frr_ac_scaps="yes"],
1760 if test x"${frr_ac_scaps}" = x"yes" \
1761 -o x"${frr_ac_lcaps}" = x"yes"; then
1762 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1767 dnl ---------------------------
1768 dnl check for glibc 'backtrace'
1769 dnl ---------------------------
1770 if test x"${enable_backtrace}" != x"no" ; then
1772 AC_CHECK_HEADER([execinfo.h], [
1773 AC_SEARCH_LIBS([backtrace], [execinfo], [
1774 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1775 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1780 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1781 dnl user explicitly requested backtrace but we failed to find support
1782 AC_MSG_FAILURE([failed to find backtrace support])
1786 dnl -----------------------------------------
1787 dnl check for malloc mallinfo struct and call
1788 dnl this must try and link using LIBS, in
1789 dnl order to check no alternative allocator
1790 dnl has been specified, which might not provide
1791 dnl mallinfo, e.g. such as Umem on Solaris.
1792 dnl -----------------------------------------
1793 AC_CHECK_HEADER([malloc.h],
1794 [AC_MSG_CHECKING(whether mallinfo is available)
1795 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1796 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1798 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1801 ], [], FRR_INCLUDES)
1806 if test "x$enable_zeromq" != "xno"; then
1807 PKG_CHECK_MODULES(ZEROMQ, [libzmq >= 4.0.0], [
1808 AC_DEFINE(HAVE_ZEROMQ, 1, [Enable ZeroMQ support])
1811 if test "x$enable_zeromq" = "xyes"; then
1812 AC_MSG_ERROR([configuration specifies --enable-zeromq but libzmq was not found])
1816 AM_CONDITIONAL([ZEROMQ], test "x$ZEROMQ" = "xtrue")
1821 CONFDATE=`date '+%Y%m%d'`
1824 dnl ------------------------------
1825 dnl set paths for state directory
1826 dnl ------------------------------
1827 AC_MSG_CHECKING(directory to use for state file)
1828 if test "${prefix}" = "NONE"; then
1829 frr_statedir_prefix="";
1831 frr_statedir_prefix=${prefix}
1833 if test "${localstatedir}" = '${prefix}/var'; then
1834 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1835 ${frr_statedir_prefix}/var/adm dnl
1836 ${frr_statedir_prefix}/etc dnl
1842 test -d $FRR_STATE_DIR && break
1844 frr_statedir=$FRR_STATE_DIR
1846 frr_statedir=${localstatedir}
1848 if test $frr_statedir = "/dev/null"; then
1849 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1851 AC_MSG_RESULT(${frr_statedir})
1852 AC_SUBST(frr_statedir)
1854 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1855 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1856 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1858 dnl autoconf does this, but it does it too late...
1859 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1860 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1862 dnl get the full path, recursing through variables...
1863 vtysh_bin="$bindir/vtysh"
1864 for I in 1 2 3 4 5 6 7 8 9 10; do
1865 eval vtysh_bin="\"$vtysh_bin\""
1867 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1869 CFG_SYSCONF="$sysconfdir"
1871 CFG_STATE="$frr_statedir"
1872 CFG_MODULE="$moduledir"
1873 for I in 1 2 3 4 5 6 7 8 9 10; do
1874 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1875 eval CFG_SBIN="\"$CFG_SBIN\""
1876 eval CFG_STATE="\"$CFG_STATE\""
1877 eval CFG_MODULE="\"$CFG_MODULE\""
1879 AC_SUBST(CFG_SYSCONF)
1882 AC_SUBST(CFG_MODULE)
1883 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1885 dnl ------------------------------------
1886 dnl Enable RPKI and add librtr to libs
1887 dnl ------------------------------------
1888 if test "${enable_rpki}" = "yes"; then
1889 PKG_CHECK_MODULES(RTRLIB,[rtrlib >= 0.5.0],
1890 [AC_DEFINE(HAVE_RPKI,1,Enable RPKI prefix validation for BGP)
1893 AC_MSG_ERROR([rtrlib was not found on your system or is too old.])]
1896 AM_CONDITIONAL([RPKI], test "x$RPKI" = "xtrue")
1898 dnl ------------------------------------------
1899 dnl Check whether rtrlib was build with ssh support
1900 dnl ------------------------------------------
1901 AC_MSG_CHECKING([whether the RTR Library is compiled with SSH])
1902 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "rtrlib/rtrlib.h"]],
1903 [[struct tr_ssh_config config;]])],
1905 AC_DEFINE(FOUND_SSH,,found_ssh)],
1909 dnl ---------------------------
1910 dnl Check htonl works correctly
1911 dnl ---------------------------
1912 AC_MSG_CHECKING(for working htonl)
1913 AC_CACHE_VAL(ac_cv_htonl_works,
1914 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1915 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1918 AC_MSG_RESULT($ac_cv_htonl_works)
1920 AC_CONFIG_FILES([Makefile
1925 doc/manpages/Makefile
1926 doc/developer/Makefile
1928 bgpd/rfp-example/rfptest/Makefile
1929 bgpd/rfp-example/librfp/Makefile
1934 snapcraft/snapcraft.yaml
1936 tests/lib/cli/test_cli.refout
1937 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1938 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1941 if test "${enable_bgp_vnc}" != "no"; then
1942 if test "${with_rfp_path}" != "bgpd/rfp-example" ; then
1943 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1947 AC_CONFIG_FILES([solaris/Makefile])
1949 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1951 AC_CONFIG_COMMANDS([lib/route_types.h], [
1952 dst="${ac_abs_top_builddir}/lib/route_types.h"
1953 ${PERL} "${ac_abs_top_srcdir}/lib/route_types.pl" \
1954 < "${ac_abs_top_srcdir}/lib/route_types.txt" \
1957 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
1958 && rm "${dst}.tmp" \
1959 || mv "${dst}.tmp" "${dst}"
1964 AS_IF([test "x$with_pkg_git_version" = "xyes"], [
1965 AC_CONFIG_COMMANDS([lib/gitversion.h], [
1966 dst="${ac_abs_top_builddir}/lib/gitversion.h"
1967 ${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
1968 "${ac_abs_top_srcdir}" \
1971 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
1972 && rm "${dst}.tmp" \
1973 || mv "${dst}.tmp" "${dst}"
1979 ## Hack, but working solution to avoid rebuilding of frr.info.
1980 ## It's already in CVS until texinfo 4.7 is more common.
1984 FRRouting configuration
1985 ------------------------------
1986 FRR version : ${PACKAGE_VERSION}
1987 host operating system : ${host_os}
1988 source code location : ${srcdir}
1990 compiler flags : ${CFLAGS}
1992 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1993 state file directory : ${frr_statedir}
1994 config file directory : `eval echo \`echo ${sysconfdir}\``
1995 example directory : `eval echo \`echo ${exampledir}\``
1996 module directory : ${CFG_MODULE}
1997 user to run as : ${enable_user}
1998 group to run as : ${enable_group}
1999 group for vty sockets : ${enable_vty_group}
2000 config file mask : ${enable_configfile_mask}
2001 log file mask : ${enable_logfile_mask}
2002 zebra protobuf enabled : ${have_protobuf:-no}
2004 The above user and group must have read/write access to the state file
2005 directory and to the config files in the config file directory."