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, 4.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 if the user has specified any CFLAGS, override our settings
189 if test "x${enable_dev_build}" = "xyes"; then
190 AC_DEFINE(DEV_BUILD,,Build for development)
191 if test "z$orig_cflags" = "z"; then
196 if test "z$orig_cflags" = "z"; then
203 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
204 AM_CONDITIONAL([SHARPD], [test "x$enable_dev_build" = "xyes"])
206 dnl always want these CFLAGS
207 AC_C_FLAG([-fno-omit-frame-pointer])
208 AC_C_FLAG([-funwind-tables])
211 AC_C_FLAG([-Wmissing-prototypes])
212 AC_C_FLAG([-Wmissing-declarations])
213 AC_C_FLAG([-Wpointer-arith])
214 AC_C_FLAG([-Wbad-function-cast])
215 AC_C_FLAG([-Wwrite-strings])
216 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
217 AC_C_FLAG([-Wcast-qual])
218 AC_C_FLAG([-Wstrict-prototypes])
219 AC_C_FLAG([-Wmissing-noreturn])
220 AC_C_FLAG([-Wmissing-format-attribute])
221 AC_C_FLAG([-Wunreachable-code])
222 AC_C_FLAG([-Wpacked])
223 AC_C_FLAG([-Wpadded])
225 AC_C_FLAG([-Wno-unused-result])
227 AC_C_FLAG([-Wno-unused-parameter])
228 AC_C_FLAG([-Wno-missing-field-initializers])
230 dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
231 dnl for some reason the string consts get 'promoted' to char *,
232 dnl triggering a const to non-const conversion warning.
233 AC_C_FLAG([-diag-disable 3179])
235 if test x"${enable_werror}" = x"yes" ; then
240 dnl need link on this one, not compile
242 ac_ld_flag_save="$LDFLAGS"
243 LDFLAGS="$LDFLAGS -rdynamic"
244 AC_MSG_CHECKING([[whether linker supports -rdynamic]])
246 [AC_LANG_PROGRAM([[]])],
247 [AC_MSG_RESULT([yes])],
249 LDFLAGS="$ac_ld_flag_save"
260 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
261 LIBS="$PTHREAD_LIBS $LIBS"
263 AC_MSG_FAILURE([This FRR version needs pthreads])
272 AC_CHECK_TOOL(AR, ar)
274 dnl -----------------
275 dnl System extensions
276 dnl -----------------
284 dnl ----------------------
285 dnl Packages configuration
286 dnl ----------------------
287 AC_ARG_WITH(pkg-extra-version,
288 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]),
289 [EXTRAVERSION=$withval],)
290 AC_ARG_WITH(pkg-git-version,
291 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
292 [ test "x$withval" != "xno" && with_pkg_git_version="yes" ])
293 AC_ARG_WITH(vtysh_pager,
294 AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
295 VTYSH_PAGER=$withval, VTYSH_PAGER="more")
297 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for FRR]))
299 AS_HELP_STRING([--disable-doc], [do not build docs]))
301 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
303 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
305 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
306 AC_ARG_ENABLE(ripngd,
307 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
309 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
310 AC_ARG_ENABLE(ospf6d,
311 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
313 AS_HELP_STRING([--enable-ldpd], [build ldpd]))
315 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
316 AC_ARG_ENABLE(eigrpd,
317 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
318 AC_ARG_ENABLE(babeld,
319 AS_HELP_STRING([--disable-babeld], [do not build babeld]))
320 AC_ARG_ENABLE(watchfrr,
321 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
323 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
325 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
326 AC_ARG_ENABLE(bgp-announce,
327 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
328 AC_ARG_ENABLE(bgp-vnc,
329 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
330 AC_ARG_WITH(rfp-path,
331 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
333 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
334 AC_ARG_ENABLE(zeromq,
335 AS_HELP_STRING([--enable-zeromq], [enable ZeroMQ handler (libfrrzmq)]))
337 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
338 AC_ARG_ENABLE(ospfapi,
339 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
340 AC_ARG_ENABLE(ospfclient,
341 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
342 (this is the default if --disable-ospfapi is set)]))
343 AC_ARG_ENABLE(multipath,
344 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
346 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
348 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
349 AC_ARG_ENABLE(vty_group,
350 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
351 AC_ARG_ENABLE(configfile_mask,
352 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
353 AC_ARG_ENABLE(logfile_mask,
354 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
355 AC_ARG_ENABLE(shell_access,
356 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
357 AC_ARG_ENABLE(realms,
358 AS_HELP_STRING([--enable-realms], [enable REALMS support under Linux]))
360 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
362 AS_HELP_STRING([--disable-irdp], [enable IRDP server support in zebra (default if supported)]))
363 AC_ARG_ENABLE(capabilities,
364 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
365 AC_ARG_ENABLE(rusage,
366 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
367 AC_ARG_ENABLE(gcc_ultra_verbose,
368 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
369 AC_ARG_ENABLE(linux24_tcp_md5,
370 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
371 AC_ARG_ENABLE(backtrace,
372 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
373 AC_ARG_ENABLE(time-check,
374 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
375 AC_ARG_ENABLE(pcreposix,
376 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
378 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
379 AC_ARG_ENABLE(systemd,
380 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
381 AC_ARG_ENABLE(werror,
382 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
383 AC_ARG_ENABLE(cumulus,
384 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
385 AC_ARG_ENABLE(datacenter,
386 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
387 AC_ARG_ENABLE(fuzzing,
388 AS_HELP_STRING([--enable-fuzzing], [enable ability to fuzz various parts of FRR]))
389 AC_ARG_ENABLE(rr-semantics,
390 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
391 AC_ARG_ENABLE([protobuf],
392 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
393 AC_ARG_ENABLE([oldvpn_commands],
394 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
396 AS_HELP_STRING([--enable-rpki], [enable RPKI prefix validation support]))
397 AC_ARG_ENABLE([clippy-only],
398 AS_HELP_STRING([--enable-clippy-only], [Only build clippy]))
400 AS_IF([test "${enable_clippy_only}" != "yes"], [
401 AC_CHECK_HEADERS(json-c/json.h)
402 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c", [], [-lm])
403 if test $ac_cv_lib_json_c_json_object_get = no; then
404 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
405 if test $ac_cv_lib_json_json_object_get = no; then
406 AC_MSG_ERROR([lib json is needed to compile])
411 AC_ARG_ENABLE([dev_build],
412 AS_HELP_STRING([--enable-dev-build], [build for development]))
414 if test x"${enable_time_check}" != x"no" ; then
415 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
416 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
418 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
422 case "${enable_systemd}" in
425 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
426 if test $ac_cv_lib_systemd_sd_notify = no; then
427 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
429 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
435 if test "${enable_rr_semantics}" != "no" ; then
436 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
439 if test "${enable_datacenter}" = "yes" ; then
440 AC_DEFINE(HAVE_DATACENTER,,Compile extensions for a DataCenter)
441 DFLT_NAME="datacenter"
443 DFLT_NAME="traditional"
446 if test "${enable_fuzzing}" = "yes" ; then
447 AC_DEFINE(HANDLE_ZAPI_FUZZING,,Compile extensions to use with a fuzzer)
450 if test "${enable_cumulus}" = "yes" ; then
451 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
455 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
457 if test "${enable_shell_access}" = "yes"; then
458 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
461 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
466 AS_IF([test "$host" = "$build"], [
470 # 1. try python3, but respect the user's preference on which minor ver
471 # 2. try python, which might be py3 or py2 again on the user's preference
472 # 3. try python2 (can really only be 2.7 but eh)
473 # 4. try 3.5 > 3.4 > 3.3 > 3.2 > 2.7 through pkg-config (no user pref)
475 # (AX_PYTHON_DEVEL has no clue about py3 vs py2)
476 # (AX_PYTHON does not do what we need)
478 AC_CHECK_TOOLS([PYTHONCONFIG], [python3-config python-config python2-config])
479 if test -n "$PYTHONCONFIG"; then
480 PYTHON_CFLAGS="`\"${PYTHONCONFIG}\" --includes`"
481 PYTHON_LIBS="`\"${PYTHONCONFIG}\" --libs`"
483 AC_MSG_CHECKING([whether we found a working Python version])
484 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
486 #if PY_VERSION_HEX < 0x02070000
487 #error python too old
503 if test -z "$PYTHONCONFIG"; then
504 PKG_CHECK_MODULES([PYTHON], python-3.5, [], [
505 PKG_CHECK_MODULES([PYTHON], python-3.4, [], [
506 PKG_CHECK_MODULES([PYTHON], python-3.3, [], [
507 PKG_CHECK_MODULES([PYTHON], python-3.2, [], [
508 PKG_CHECK_MODULES([PYTHON], python-2.7, [], [
509 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
513 AC_MSG_CHECKING([whether we found a working Python version])
514 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
516 #if PY_VERSION_HEX < 0x02070000
517 #error python too old
527 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
531 AC_SUBST(PYTHON_CFLAGS)
532 AC_SUBST(PYTHON_LIBS)
535 # Logic for protobuf support.
537 if test "$enable_protobuf" = "yes"; then
541 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
542 if test "x$PROTOC_C" = "x/bin/false"; then
546 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
547 [found_protobuf_c=yes],
548 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
550 if test "x$found_protobuf_c" = "xyes"; then
551 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
552 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
554 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
555 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
561 # Logic for old vpn commans support.
563 if test "$enable_oldvpn_commands" = "yes"; then
564 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
567 # Fail if the user explicity enabled protobuf support and we couldn't
568 # find the compiler or libraries.
569 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
570 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
573 if test "x$have_protobuf" = "xyes"; then
574 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
577 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
580 # End of logic for protobuf support.
583 if test "${enable_linux24_tcp_md5}" = "yes"; then
584 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
587 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
588 if test "${enable_rtadv}" != "no"; then
590 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
595 if test x"${enable_user}" = x"no"; then
598 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
601 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
604 if test x"${enable_group}" = x"no"; then
607 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
610 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
613 if test x"${enable_vty_group}" = x"yes" ; then
614 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
615 elif test x"${enable_vty_group}" != x""; then
616 if test x"${enable_vty_group}" != x"no"; then
617 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
620 AC_SUBST([enable_user])
621 AC_SUBST([enable_group])
622 AC_SUBST([enable_vty_group])
624 enable_configfile_mask=${enable_configfile_mask:-0600}
625 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
627 enable_logfile_mask=${enable_logfile_mask:-0600}
628 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
632 case "${enable_multipath}" in
636 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
637 MPATH_NUM="${enable_multipath}"
642 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
646 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
648 AC_DEFINE_UNQUOTED(VTYSH_PAGER, "$VTYSH_PAGER", [What pager to use])
650 dnl -----------------------------------
651 dnl Add extra version string to package
652 dnl name, string and version fields.
653 dnl -----------------------------------
654 if test "x${EXTRAVERSION}" != "x" ; then
655 VERSION="${VERSION}${EXTRAVERSION}"
656 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
657 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
658 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
661 if test "x$with_pkg_git_version" = "xyes"; then
662 if test -d "${srcdir}/.git"; then
663 AC_DEFINE(GIT_VERSION, [1], [include git version info])
664 else with_pkg_git_version="no"
665 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
668 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
670 dnl ------------------------------------
671 dnl Check C keywords and standard types
672 dnl ------------------------------------
683 dnl -------------------------
684 dnl Check other header files.
685 dnl -------------------------
686 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
687 linux/version.h asm/types.h \
690 ac_stdatomic_ok=false
691 AC_DEFINE(FRR_AUTOCONF_ATOMIC, 1, [did autoconf checks for atomic funcs])
692 AC_CHECK_HEADER([stdatomic.h],[
694 AC_MSG_CHECKING([whether _Atomic qualifier works])
695 AC_LINK_IFELSE([AC_LANG_SOURCE([[
696 #include <stdatomic.h>
697 int main(int argc, char **argv) {
702 AC_DEFINE(HAVE_STDATOMIC_H, 1, [found stdatomic.h])
710 AS_IF([$ac_stdatomic_ok], [true], [
711 AC_MSG_CHECKING([for __atomic_* builtins])
712 AC_LINK_IFELSE([AC_LANG_SOURCE([[
713 int main(int argc, char **argv) {
715 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
716 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
719 AC_DEFINE(HAVE___ATOMIC, 1, [found __atomic builtins])
724 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
725 AC_MSG_CHECKING([for __sync_* builtins])
726 AC_LINK_IFELSE([AC_LANG_SOURCE([[
727 int main(int argc, char **argv) {
729 __sync_fetch_and_sub (&i, 1);
730 return __sync_val_compare_and_swap (&i, 0, 1);
733 AC_DEFINE(HAVE___SYNC, 1, [found __sync builtins])
736 AC_MSG_CHECKING([for __sync_swap builtin])
737 AC_LINK_IFELSE([AC_LANG_SOURCE([[
738 int main(int argc, char **argv) {
740 return __sync_swap (&i, 2);
743 AC_DEFINE(HAVE___SYNC_SWAP, 1, [found __sync_swap builtin])
751 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
756 dnl Utility macro to avoid retyping includes all the time
757 m4_define([FRR_INCLUDES],
760 #define __EXTENSIONS__
765 #include <sys/types.h>
766 /* sys/conf.h depends on param.h on FBSD at least */
767 #include <sys/param.h>
768 /* Required for MAXSIG */
770 #include <sys/socket.h>
772 # define __APPLE_USE_RFC_3542
774 #include <netinet/in.h>
775 #include <sys/time.h>
780 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
781 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
782 dnl an additional round for it.
784 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
786 m4_define([FRR_INCLUDES],
788 [#if HAVE_NET_IF_VAR_H
789 # include <net/if_var.h>
793 AC_CHECK_HEADERS([netinet/in_var.h \
794 net/if_dl.h net/netopt.h \
795 inet/nd.h netinet/ip_icmp.h \
796 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
797 [], [], FRR_INCLUDES)
799 AC_CHECK_HEADERS([ucontext.h], [], [],
802 #endif /* __USE_GNU */
806 m4_define([UCONTEXT_INCLUDES],
807 [#include <ucontext.h>])dnl
809 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
810 [], [], [UCONTEXT_INCLUDES])
811 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
812 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
813 [], [], [UCONTEXT_INCLUDES])],
814 [], [UCONTEXT_INCLUDES])
815 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
816 [], [], [UCONTEXT_INCLUDES])
818 m4_define([FRR_INCLUDES],
822 #include <netinet/in_systm.h>
823 #if HAVE_NETINET_IN_VAR_H
824 # include <netinet/in_var.h>
827 # include <net/if_dl.h>
829 #if HAVE_NET_NETOPT_H
830 # include <net/netopt.h>
832 #include <net/route.h>
834 # include <inet/nd.h>
836 #include <arpa/inet.h>
837 /* Required for IDRP */
838 #if HAVE_NETINET_IP_ICMP_H
839 # include <netinet/ip_icmp.h>
843 dnl V6 headers are checked below, after we check for v6
845 AC_MSG_CHECKING([which operating system interface to use])
848 AC_MSG_RESULT([Solaris])
850 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
851 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
853 AC_CHECK_LIB(socket, main)
854 AC_CHECK_LIB(nsl, main)
855 AC_CHECK_LIB(umem, main)
856 AC_CHECK_FUNCS([printstack], [
857 AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
858 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
864 AC_MSG_RESULT([Linux])
866 AC_DEFINE(GNU_LINUX,,GNU Linux)
867 AC_DEFINE(HAVE_NETLINK,,netlink)
868 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
870 dnl Linux has a compilation problem with mixing
871 dnl netinet/in.h and linux/in6.h they are not
872 dnl compatible. There has been discussion on
873 dnl how to fix it but no real progress on implementation
874 dnl when they fix it, remove this
875 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
877 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
880 AC_MSG_RESULT([OpenBSD])
882 AC_DEFINE(OPEN_BSD,,OpenBSD)
883 AC_DEFINE(KAME,1,KAME IPv6)
884 AC_DEFINE(BSD_V6_SYSCTL,1,BSD v6 sysctl to turn on and off forwarding)
886 if test "x${enable_pimd}" != "xno"; then
891 AC_MSG_FAILURE([pimd cannot be enabled as PIM support has been removed from OpenBSD 6.1])
899 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
900 AC_DEFINE(KAME,1,KAME IPv6)
901 AC_DEFINE(BSD_V6_SYSCTL,1,BSD v6 sysctl to turn on and off forwarding)
904 AM_CONDITIONAL(SOLARIS, test "${SOLARIS}" = "solaris")
908 dnl ------------------------
909 dnl Integrated REALMS option
910 dnl ------------------------
911 if test "${enable_realms}" = "yes"; then
914 AC_DEFINE(SUPPORT_REALMS,, Realms support)
917 echo "Sorry, only Linux has REALMS support"
922 AM_CONDITIONAL([SUPPORT_REALMS], [test "${enable_realms}" = "yes"])
924 dnl ---------------------
925 dnl Integrated VTY option
926 dnl ---------------------
927 case "${enable_vtysh}" in
930 AC_DEFINE(VTYSH,,VTY shell)
931 dnl Vtysh uses libreadline, which looks for termcap functions at
932 dnl configure time. We follow readlines search order.
933 dnl The required procedures are in libtermcap on NetBSD, in
934 dnl [TODO] on Linux, and in [TODO] on Solaris.
935 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
936 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
937 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
938 [AC_CHECK_LIB(ncurses, tputs,
939 LIBREADLINE="$LIBREADLINE -lncurses")]
943 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
945 if test $ac_cv_lib_readline_main = no; then
946 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
948 AC_CHECK_HEADER(readline/history.h)
949 if test $ac_cv_header_readline_history_h = no;then
950 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
952 AC_CHECK_LIB(readline, rl_completion_matches,
953 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
954 if test $ac_cv_lib_readline_rl_completion_matches = no; then
955 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
959 AC_SUBST(LIBREADLINE)
960 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
965 dnl FRR detects the PAM library it is built against by checking for a
966 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
967 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
968 dnl openpam.h doesn't do that, although depends on the header too. Hence a
969 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
972 if test "$with_libpam" = "yes"; then
973 AC_CHECK_HEADER([security/pam_misc.h],
974 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
975 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
976 pam_conv_func="misc_conv"
979 AC_CHECK_HEADER([security/openpam.h],
980 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
981 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
982 pam_conv_func="openpam_ttyconv"
984 [], FRR_INCLUDES[#include <security/pam_appl.h>])
985 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
986 AC_MSG_WARN([*** pam support will not be built ***])
991 if test "$with_libpam" = "yes"; then
992 dnl took this test from proftpds configure.in and suited to our needs
993 dnl -------------------------------------------------------------------------
995 dnl This next check looks funky due to a linker problem with some versions
996 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
997 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
998 dnl with RedHat 6.2 and Debian 2.2 or better.
999 AC_CHECK_LIB(pam, pam_start,
1000 [AC_CHECK_LIB(pam, $pam_conv_func,
1001 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1003 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1004 LIBPAM="-lpam -lpam_misc"]
1008 [AC_CHECK_LIB(pam, pam_end,
1009 [AC_CHECK_LIB(pam, $pam_conv_func,
1010 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1011 LIBPAM="-lpam -ldl"],
1012 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1013 LIBPAM="-lpam -ldl -lpam_misc"]
1015 ],AC_MSG_WARN([*** pam support will not be built ***]),
1022 dnl -------------------------------
1023 dnl Endian-ness check
1024 dnl -------------------------------
1027 dnl -------------------------------
1028 dnl check the size in byte of the C
1029 dnl -------------------------------
1030 dnl AC_CHECK_SIZEOF(char)
1031 dnl AC_CHECK_SIZEOF(int)
1032 dnl AC_CHECK_SIZEOF(short)
1033 dnl AC_CHECK_SIZEOF(long)
1035 dnl ----------------------------
1036 dnl check existance of functions
1037 dnl ----------------------------
1043 dnl -------------------------------
1044 dnl bgpd needs pow() and hence libm
1045 dnl -------------------------------
1047 AC_CHECK_HEADER([math.h],
1048 [AC_CHECK_LIB([m], [pow],
1051 AC_CHECK_FUNCS(pow,[],[LIBM=""])
1054 if test x"$LIBM" = x ; then
1055 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1060 AC_CHECK_FUNCS([ppoll], [
1061 AC_DEFINE([HAVE_PPOLL], 1, [have Linux/BSD ppoll()])
1063 AC_CHECK_FUNCS([pollts], [
1064 AC_DEFINE([HAVE_POLLTS], 1, [have NetBSD pollts()])
1074 AC_CHECK_HEADER([asm-generic/unistd.h],
1075 [AC_CHECK_DECL(__NR_setns,
1076 AC_DEFINE(HAVE_NETNS,, Have netns),,
1077 FRR_INCLUDES [#include <asm-generic/unistd.h>
1079 AC_CHECK_FUNCS(setns)]
1082 dnl --------------------------
1083 dnl Determine IS-IS I/O method
1084 dnl --------------------------
1085 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
1086 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
1087 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
1088 AC_CHECK_HEADER(net/bpf.h)
1089 AC_CHECK_HEADER(sys/dlpi.h)
1090 AC_MSG_CHECKING(zebra IS-IS I/O method)
1094 AC_MSG_RESULT(pfpacket)
1095 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1099 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1102 if test $ac_cv_header_net_bpf_h = no; then
1103 if test $ac_cv_header_sys_dlpi_h = no; then
1105 if test "${enable_isisd}" = yes; then
1106 AC_MSG_FAILURE([IS-IS support requested but no packet backend found])
1108 AC_MSG_WARN([*** IS-IS support will not be built ***])
1113 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1116 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
1120 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
1122 dnl ------------------------------------
1123 dnl check for broken CMSG_FIRSTHDR macro
1124 dnl ------------------------------------
1125 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
1126 AC_RUN_IFELSE([AC_LANG_SOURCE([[
1129 #define __EXTENSIONS__
1132 #include <sys/types.h>
1133 #include <sys/socket.h>
1140 msg.msg_control = buf;
1141 msg.msg_controllen = 0;
1143 if (CMSG_FIRSTHDR(&msg) != NULL)
1146 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
1147 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
1149 dnl ---------------------------------------------------------------
1150 dnl figure out how to specify an interface in multicast sockets API
1151 dnl ---------------------------------------------------------------
1152 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1154 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1155 #include <sys/socket.h>
1156 #include <netinet/in.h>
1157 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1158 #include <linux/types.h>
1161 m4_define([FRR_INCLUDES],
1163 [#if HAVE_LINUX_MROUTE_H
1164 # include <linux/mroute.h>
1168 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1169 #include <sys/socket.h>
1170 #include <sys/types.h>
1171 #include <netinet/in.h>
1172 #include <net/route.h>
1175 m4_define([FRR_INCLUDES],
1177 [#if HAVE_NETINET_IP_MROUTE_H
1178 # include <netinet/ip_mroute.h>
1182 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1183 AC_TRY_COMPILE([#include <sys/param.h>],
1184 [#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)
1187 #error No support for BSD struct ip_mreq hack detected
1188 #endif],[AC_MSG_RESULT(yes)
1189 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1192 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1194 #include <sys/types.h>
1195 #include <netinet/in.h>
1196 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1197 ], [AC_MSG_RESULT(yes)
1198 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1201 dnl ---------------------------------------------------------------
1202 dnl figure out how to check link-state
1203 dnl ---------------------------------------------------------------
1204 AC_CHECK_HEADER( [net/if_media.h],
1205 [m4_define([LINK_DETECT_INCLUDES],
1207 [#include <net/if_media.h>
1209 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1210 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1211 [], LINK_DETECT_INCLUDES)],
1215 dnl ---------------------------------------------------------------
1216 dnl Additional, newer way to check link-state using ifi_link_state.
1217 dnl Not available in all BSD's when ifmediareq available
1218 dnl ---------------------------------------------------------------
1219 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1220 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1223 dnl ------------------------
1224 dnl TCP_MD5SIG socket option
1225 dnl ------------------------
1227 AC_CHECK_HEADER([netinet/tcp.h],
1228 [m4_define([MD5_INCLUDES],
1230 [#include <netinet/tcp.h>
1232 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1235 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1236 AC_CHECK_HEADER([linux/tcp.h],
1237 [m4_define([MD5_INCLUDES],
1239 [#include <linux/tcp.h>
1241 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1244 dnl ----------------------------------------------------------------------------
1245 dnl figure out if domainname is available in the utsname struct (GNU extension).
1246 dnl ----------------------------------------------------------------------------
1247 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1249 dnl ------------------
1250 dnl IPv6 header checks
1251 dnl ------------------
1252 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1253 netinet6/in6_var.h netinet6/nd6.h], [], [],
1256 m4_define([FRR_INCLUDES],dnl
1258 [#if HAVE_NETINET6_IN6_H
1259 #include <netinet6/in6.h>
1261 #if HAVE_NETINET_IN6_VAR_H
1262 #include <netinet/in6_var.h>
1264 #include <netinet/icmp6.h>
1265 #if HAVE_NETINET6_IN6_VAR_H
1266 # include <netinet6/in6_var.h>
1268 #if HAVE_NETINET6_ND6_H
1269 # include <netinet6/nd6.h>
1273 dnl disable doc check
1274 if test "${enable_doc}" = "no";then
1280 dnl --------------------
1281 dnl Daemon disable check
1282 dnl --------------------
1283 AM_CONDITIONAL(ZEBRA, test "${enable_zebra}" != "no")
1285 if test "${enable_bgpd}" = "no";then
1290 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1292 AM_CONDITIONAL(RIPD, test "${enable_ripd}" != "no")
1293 AM_CONDITIONAL(OSPFD, test "${enable_ospfd}" != "no")
1294 AM_CONDITIONAL(LDPD, test "${enable_ldpd}" != "no")
1296 AS_IF([test "${enable_ldpd}" != "no"], [
1297 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1303 if test "${enable_nhrpd}" != "no"; then
1308 if test "${enable_nhrpd}" = "yes"; then
1309 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1313 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1315 AM_CONDITIONAL(EIGRPD, test "${enable_eigrpd}" != "no")
1317 if test "${enable_watchfrr}" = "no";then
1322 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1325 if test "${enable_ospfapi}" != "no";then
1326 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1328 if test "${enable_ospfclient}" != "no";then
1329 OSPFCLIENT="ospfclient"
1333 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1334 AM_CONDITIONAL(RIPNGD, test "${enable_ripngd}" != "no")
1335 AM_CONDITIONAL(BABELD, test "${enable_babeld}" != "no")
1336 AM_CONDITIONAL(OSPF6D, test "${enable_ospf6d}" != "no")
1337 AM_CONDITIONAL(ISISD, test "${enable_isisd}" != "no")
1338 AM_CONDITIONAL(PIMD, test "${enable_pimd}" != "no")
1340 if test "${enable_bgp_announce}" = "no";then
1341 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1343 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1346 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1347 with_rfp_path="bgpd/rfp-example"
1349 if test "${with_rfp_path}" != "no"; then
1350 VNC_RFP_PATH="${with_rfp_path}"
1351 AC_SUBST(VNC_RFP_PATH)
1354 if test "${enable_bgp_vnc}" != "no";then
1355 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1356 RFPTEST="${with_rfp_path}/rfptest"
1357 LIBRFP="${with_rfp_path}/librfp"
1358 RFPINC="${with_rfp_path}/librfp"
1362 RFPINC="bgpd/rfp-example/librfp"
1365 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1375 AC_CHECK_LIB(crypt, crypt, [],
1376 [AC_CHECK_LIB(crypto, DES_crypt)])
1377 AC_CHECK_LIB(resolv, res_init)
1379 dnl ---------------------------
1380 dnl check system has PCRE regexp
1381 dnl ---------------------------
1382 if test "x$enable_pcreposix" = "xyes"; then
1383 AC_CHECK_LIB(pcreposix, regexec, [], [
1384 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1387 AC_SUBST(HAVE_LIBPCREPOSIX)
1389 dnl ------------------
1390 dnl check C-Ares library
1391 dnl ------------------
1392 if test "${NHRPD}" != ""; then
1393 PKG_CHECK_MODULES([CARES], [libcares], , [
1394 AC_MSG_ERROR([trying to build nhrpd, but libcares not found. install c-ares and its -dev headers.])
1399 dnl ------------------
1400 dnl check Net-SNMP library
1401 dnl ------------------
1402 if test "${enable_snmp}" != "" -a "${enable_snmp}" != "no"; then
1403 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1404 if test x"$NETSNMP_CONFIG" = x"no"; then
1405 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1407 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1408 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1409 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1410 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
1418 AC_MSG_ERROR([--enable-snmp given but not usable])])
1419 case "${enable_snmp}" in
1424 SNMP_METHOD="${enable_snmp}"
1427 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1430 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1431 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1432 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1434 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1436 AC_SUBST(SNMP_CFLAGS)
1441 AC_SEARCH_LIBS([sqrt], [m])
1446 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1447 AC_MSG_ERROR([unable to find the dlopen()])
1450 AC_CHECK_HEADERS([link.h])
1452 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1453 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1461 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1464 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1469 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1470 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1477 struct link_map *lm = NULL;
1478 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1481 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1487 AM_CONDITIONAL(SNMP, test "x$SNMP_METHOD" = "xagentx")
1489 dnl ---------------------------
1490 dnl sockaddr and netinet checks
1491 dnl ---------------------------
1494 struct vifctl, struct mfcctl, struct sioc_sg_req,
1495 vifi_t, struct sioc_vif_req, struct igmpmsg,
1496 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1497 struct nd_opt_adv_interval, struct rt_addrinfo,
1498 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1499 [], [], FRR_INCLUDES)
1501 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1502 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1503 struct sockaddr_dl.sdl_len,
1504 struct if6_aliasreq.ifra_lifetime,
1505 struct nd_opt_adv_interval.nd_opt_ai_type],
1506 [], [], FRR_INCLUDES)
1508 dnl ---------------------------
1509 dnl IRDP/pktinfo/icmphdr checks
1510 dnl ---------------------------
1512 AC_CHECK_TYPES([struct in_pktinfo], [
1513 AC_CHECK_TYPES([struct icmphdr], [
1522 case "${enable_irdp}" in
1524 $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1531 AM_CONDITIONAL(IRDP, $IRDP)
1533 dnl -----------------------
1534 dnl checking for IP_PKTINFO
1535 dnl -----------------------
1536 AC_MSG_CHECKING(for IP_PKTINFO)
1537 AC_TRY_COMPILE([#include <netdb.h>], [
1538 int opt = IP_PKTINFO;
1541 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1546 dnl ---------------------------
1547 dnl checking for IP_RECVDSTADDR
1548 dnl ---------------------------
1549 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1550 AC_TRY_COMPILE([#include <netinet/in.h>], [
1551 int opt = IP_RECVDSTADDR;
1554 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1559 dnl ----------------------
1560 dnl checking for IP_RECVIF
1561 dnl ----------------------
1562 AC_MSG_CHECKING(for IP_RECVIF)
1563 AC_TRY_COMPILE([#include <netinet/in.h>], [
1564 int opt = IP_RECVIF;
1567 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1572 dnl ----------------------
1573 dnl checking for SO_BINDANY
1574 dnl ----------------------
1575 AC_MSG_CHECKING(for SO_BINDANY)
1576 AC_TRY_COMPILE([#include <sys/socket.h>], [
1577 int opt = SO_BINDANY;
1580 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1585 dnl ----------------------
1586 dnl checking for IP_FREEBIND
1587 dnl ----------------------
1588 AC_MSG_CHECKING(for IP_FREEBIND)
1589 AC_TRY_COMPILE([#include <netinet/in.h>], [
1590 int opt = IP_FREEBIND;
1593 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1598 dnl --------------------------------------
1599 dnl checking for be32dec existence or not
1600 dnl --------------------------------------
1601 AC_CHECK_DECLS([be32enc, be32dec], [], [],
1602 [#include <sys/endian.h>])
1604 dnl --------------------------------------
1605 dnl checking for clock_time monotonic struct and call
1606 dnl --------------------------------------
1607 AC_CHECK_DECL(CLOCK_MONOTONIC,
1608 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1609 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1610 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1612 dnl --------------------------------------
1613 dnl checking for flex and bison
1614 dnl --------------------------------------
1617 AC_MSG_CHECKING(version of flex)
1618 frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1619 frr_ac_flex_version="${frr_ac_flex_version##* }"
1620 AC_MSG_RESULT([$frr_ac_flex_version])
1621 AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
1622 LEX="$SHELL $missing_dir/missing flex"
1623 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1624 AC_MSG_WARN([using pregenerated flex output files])
1626 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1628 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1629 AC_SUBST([LEXLIB], [''])
1633 dnl thanks GNU bison for this b*llshit...
1634 AC_MSG_CHECKING(version of bison)
1635 frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1636 frr_ac_bison_version="${frr_ac_bison_version##* }"
1637 frr_ac_bison_missing="false"
1638 case "x${frr_ac_bison_version}" in
1641 BISON_CLOSEBRACE='"'
1643 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
1646 AC_MSG_RESULT([$frr_ac_bison_version])
1647 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1648 frr_ac_bison_missing="true"
1651 AC_MSG_RESULT([none])
1652 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1653 frr_ac_bison_missing="true"
1657 BISON_CLOSEBRACE='}'
1658 BISON_VERBOSE='-Dparse.error=verbose'
1659 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 or newer])
1662 AC_SUBST(BISON_OPENBRACE)
1663 AC_SUBST(BISON_CLOSEBRACE)
1664 AC_SUBST(BISON_VERBOSE)
1666 if $frr_ac_bison_missing; then
1667 YACC="$SHELL $missing_dir/missing bison -y"
1668 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1669 AC_MSG_WARN([using pregenerated bison output files])
1671 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1675 dnl -------------------
1676 dnl capabilities checks
1677 dnl -------------------
1678 if test "${enable_capabilities}" != "no"; then
1679 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1680 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1682 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1683 frr_ac_keepcaps="yes"],
1686 if test x"${frr_ac_keepcaps}" = x"yes"; then
1687 AC_CHECK_HEADERS(sys/capability.h)
1689 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1690 AC_CHECK_LIB(cap, cap_init,
1691 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1696 AC_CHECK_HEADERS(priv.h,
1697 [AC_MSG_CHECKING(Solaris style privileges are available)
1698 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1700 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1701 frr_ac_scaps="yes"],
1707 if test x"${frr_ac_scaps}" = x"yes" \
1708 -o x"${frr_ac_lcaps}" = x"yes"; then
1709 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1714 dnl ---------------------------
1715 dnl check for glibc 'backtrace'
1716 dnl ---------------------------
1717 if test x"${enable_backtrace}" != x"no" ; then
1719 AC_CHECK_HEADER([execinfo.h], [
1720 AC_SEARCH_LIBS([backtrace], [execinfo], [
1721 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1722 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1727 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1728 dnl user explicitly requested backtrace but we failed to find support
1729 AC_MSG_FAILURE([failed to find backtrace support])
1733 dnl -----------------------------------------
1734 dnl check for malloc mallinfo struct and call
1735 dnl this must try and link using LIBS, in
1736 dnl order to check no alternative allocator
1737 dnl has been specified, which might not provide
1738 dnl mallinfo, e.g. such as Umem on Solaris.
1739 dnl -----------------------------------------
1740 AC_CHECK_HEADER([malloc.h],
1741 [AC_MSG_CHECKING(whether mallinfo is available)
1742 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1743 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1745 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1748 ], [], FRR_INCLUDES)
1753 if test "x$enable_zeromq" != "xno"; then
1754 PKG_CHECK_MODULES(ZEROMQ, [libzmq >= 4.0.0], [
1755 AC_DEFINE(HAVE_ZEROMQ, 1, [Enable ZeroMQ support])
1758 if test "x$enable_zeromq" = "xyes"; then
1759 AC_MSG_ERROR([configuration specifies --enable-zeromq but libzmq was not found])
1763 AM_CONDITIONAL([ZEROMQ], test "x$ZEROMQ" = "xtrue")
1768 CONFDATE=`date '+%Y%m%d'`
1771 dnl ------------------------------
1772 dnl set paths for state directory
1773 dnl ------------------------------
1774 AC_MSG_CHECKING(directory to use for state file)
1775 if test "${prefix}" = "NONE"; then
1776 frr_statedir_prefix="";
1778 frr_statedir_prefix=${prefix}
1780 if test "${localstatedir}" = '${prefix}/var'; then
1781 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1782 ${frr_statedir_prefix}/var/adm dnl
1783 ${frr_statedir_prefix}/etc dnl
1789 test -d $FRR_STATE_DIR && break
1791 frr_statedir=$FRR_STATE_DIR
1793 frr_statedir=${localstatedir}
1795 if test $frr_statedir = "/dev/null"; then
1796 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1798 AC_MSG_RESULT(${frr_statedir})
1799 AC_SUBST(frr_statedir)
1801 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1802 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1803 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1805 dnl autoconf does this, but it does it too late...
1806 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1807 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1809 dnl get the full path, recursing through variables...
1810 vtysh_bin="$bindir/vtysh"
1811 for I in 1 2 3 4 5 6 7 8 9 10; do
1812 eval vtysh_bin="\"$vtysh_bin\""
1814 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1816 CFG_SYSCONF="$sysconfdir"
1818 CFG_STATE="$frr_statedir"
1819 CFG_MODULE="$moduledir"
1820 for I in 1 2 3 4 5 6 7 8 9 10; do
1821 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1822 eval CFG_SBIN="\"$CFG_SBIN\""
1823 eval CFG_STATE="\"$CFG_STATE\""
1824 eval CFG_MODULE="\"$CFG_MODULE\""
1826 AC_SUBST(CFG_SYSCONF)
1829 AC_SUBST(CFG_MODULE)
1830 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1832 dnl ------------------------------------
1833 dnl Enable RPKI and add librtr to libs
1834 dnl ------------------------------------
1835 if test "${enable_rpki}" = "yes"; then
1836 PKG_CHECK_MODULES(RTRLIB,[rtrlib >= 0.5.0],
1837 [AC_DEFINE(HAVE_RPKI,1,Enable RPKI prefix validation for BGP)
1840 AC_MSG_ERROR([rtrlib was not found on your system or is too old.])]
1843 AM_CONDITIONAL([RPKI], test "x$RPKI" = "xtrue")
1845 dnl ------------------------------------------
1846 dnl Check whether rtrlib was build with ssh support
1847 dnl ------------------------------------------
1848 AC_MSG_CHECKING([whether the RTR Library is compiled with SSH])
1849 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "rtrlib/rtrlib.h"]],
1850 [[struct tr_ssh_config config;]])],
1852 AC_DEFINE(FOUND_SSH,,found_ssh)],
1856 dnl ---------------------------
1857 dnl Check htonl works correctly
1858 dnl ---------------------------
1859 AC_MSG_CHECKING(for working htonl)
1860 AC_CACHE_VAL(ac_cv_htonl_works,
1861 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1862 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1865 AC_MSG_RESULT($ac_cv_htonl_works)
1867 AC_CONFIG_FILES([Makefile
1870 doc/Makefile tests/Makefile
1871 bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile
1875 snapcraft/snapcraft.yaml
1877 tests/lib/cli/test_cli.refout
1896 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1897 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1900 if test "${enable_bgp_vnc}" != "no"; then
1901 if test "${with_rfp_path}" != "bgpd/rfp-example" ; then
1902 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1906 AC_CONFIG_FILES([solaris/Makefile])
1908 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1910 AC_CONFIG_COMMANDS([lib/route_types.h], [
1911 dst="${ac_abs_top_builddir}/lib/route_types.h"
1912 ${PERL} "${ac_abs_top_srcdir}/lib/route_types.pl" \
1913 < "${ac_abs_top_srcdir}/lib/route_types.txt" \
1916 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
1917 && rm "${dst}.tmp" \
1918 || mv "${dst}.tmp" "${dst}"
1923 AS_IF([test "x$with_pkg_git_version" = "xyes"], [
1924 AC_CONFIG_COMMANDS([lib/gitversion.h], [
1925 dst="${ac_abs_top_builddir}/lib/gitversion.h"
1926 ${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
1927 "${ac_abs_top_srcdir}" \
1930 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
1931 && rm "${dst}.tmp" \
1932 || mv "${dst}.tmp" "${dst}"
1938 ## Hack, but working solution to avoid rebuilding of frr.info.
1939 ## It's already in CVS until texinfo 4.7 is more common.
1943 FRRouting configuration
1944 ------------------------------
1945 FRR version : ${PACKAGE_VERSION}
1946 host operating system : ${host_os}
1947 source code location : ${srcdir}
1949 compiler flags : ${CFLAGS}
1951 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1952 state file directory : ${frr_statedir}
1953 config file directory : `eval echo \`echo ${sysconfdir}\``
1954 example directory : `eval echo \`echo ${exampledir}\``
1955 module directory : ${CFG_MODULE}
1956 user to run as : ${enable_user}
1957 group to run as : ${enable_group}
1958 group for vty sockets : ${enable_vty_group}
1959 config file mask : ${enable_configfile_mask}
1960 log file mask : ${enable_logfile_mask}
1961 zebra protobuf enabled : ${have_protobuf:-no}
1963 The above user and group must have read/write access to the state file
1964 directory and to the config files in the config file directory."