2 ## Configure template file for FRRouting.
3 ## autoconf will generate configure script.
5 ## Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
6 ## Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
10 AC_INIT(frr, 3.1-dev, [https://github.com/frrouting/frr/issues])
11 PACKAGE_URL="https://frrouting.org/"
12 PACKAGE_FULLNAME="FRRouting"
13 AC_SUBST(PACKAGE_FULLNAME)
15 CONFIG_ARGS="$ac_configure_args"
18 AC_CONFIG_SRCDIR(lib/zebra.h)
19 AC_CONFIG_MACRO_DIR([m4])
21 dnl -----------------------------------
22 dnl Get hostname and other information.
23 dnl -----------------------------------
27 AS_IF([test "$host" != "$build"], [
28 if test "$srcdir" = "."; then
29 AC_MSG_ERROR([cross-compilation is only possible with builddir separate from srcdir. create a separate directory and run as .../path-to-frr/configure.])
31 test -d hosttools || mkdir hosttools
32 abssrc="`cd \"${srcdir}\"; pwd`"
35 AC_MSG_NOTICE([... cross-compilation: creating hosttools directory and self-configuring for build platform tools])
36 AC_MSG_NOTICE([... use HOST_CPPFLAGS / HOST_CFLAGS / HOST_LDFLAGS if neccessary])
39 ( CPPFLAGS="$HOST_CPPFLAGS"; \
40 CFLAGS="$HOST_CFLAGS"; \
41 LDFLAGS="$HOST_LDFLAGS"; \
42 cd hosttools; "${abssrc}/configure" "--host=$build" "--build=$build"; )
45 AC_MSG_NOTICE([... cross-compilation: finished self-configuring for build platform tools])
49 HOSTTOOLS="hosttools/"
55 AM_CONDITIONAL([BUILD_CLIPPY], [$build_clippy])
57 # Disable portability warnings -- our automake code (in particular
58 # common.am) uses some constructs specific to gmake.
59 AM_INIT_AUTOMAKE([1.12 -Wno-portability])
60 m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
61 AM_SILENT_RULES([yes])
62 AC_CONFIG_HEADERS(config.h)
64 AC_PATH_PROG(PERL, perl)
67 dnl default is to match previous behavior
68 exampledir=${sysconfdir}
69 AC_ARG_ENABLE([exampledir],
70 AS_HELP_STRING([--enable-exampledir],
71 [specify alternate directory for examples]),
72 exampledir="$enableval",)
73 dnl XXX add --exampledir to autoconf standard directory list somehow
76 dnl default is to match previous behavior
78 AC_ARG_ENABLE([pkgsrcrcdir],
79 AS_HELP_STRING([--enable-pkgsrcrcdir],
80 [specify directory for rc.d scripts]),
81 pkgsrcrcdir="$enableval",)
82 dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
84 AM_CONDITIONAL([PKGSRC], [test "x$pkgsrcrcdir" != "x"])
86 AC_ARG_WITH([moduledir], [AS_HELP_STRING([--with-moduledir=DIR], [module directory (${libdir}/frr/modules)])], [
89 moduledir="\${libdir}/frr/modules"
91 AC_SUBST([moduledir], [$moduledir])
93 AC_ARG_ENABLE(tcmalloc,
94 AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
95 [case "${enableval}" in
96 yes) tcmalloc_enabled=true
97 LIBS="$LIBS -ltcmalloc_minimal"
99 no) tcmalloc_enabled=false ;;
100 *) AC_MSG_ERROR(bad value ${enableval} for --enable-tcmalloc) ;;
101 esac],[tcmalloc_enabled=false])
104 dnl Thanks autoconf, but we don't want a default -g -O2. We have our own
105 dnl flag determination logic.
108 dnl --------------------
109 dnl Check CC and friends
110 dnl --------------------
111 dnl note orig_cflags is also used further down
112 orig_cflags="$CFLAGS"
117 dnl remove autoconf default "-g -O2"
118 CFLAGS="$orig_cflags"
120 dnl NB: see C11 below
125 dnl autoconf 2.59 appears not to support AC_PROG_SED
127 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
129 dnl try and enable CFLAGS that are useful for FRR
130 dnl - specifically, options to control warnings
132 AC_USE_SYSTEM_EXTENSIONS
133 AC_DEFUN([AC_C_FLAG], [{
135 ac_c_flag_save="$CFLAGS"
137 AC_MSG_CHECKING([[whether $CC supports $1]])
139 [AC_LANG_PROGRAM([[]])],
142 m4_if([$3], [], [], [
143 CFLAGS="$ac_c_flag_save"
147 CFLAGS="$ac_c_flag_save"
154 AC_DEFUN([AC_LINK_IFELSE_FLAGS], [{
156 ac_cflags_save="$CFLAGS"
164 CFLAGS="$ac_cflags_save"
169 CFLAGS="$ac_cflags_save"
176 dnl ICC won't bail on unknown options without -diag-error 10006
177 dnl need to do this first so we get useful results for the other options
178 AC_C_FLAG([-diag-error 10006])
180 dnl AC_PROG_CC_C99 may change CC to include -std=gnu99 or something
182 CC="${CC% -std=gnu99}"
185 AC_C_FLAG([-std=gnu11], [CC="$ac_cc"], [CC="$CC -std=gnu11"])
187 dnl if the user specified any CFLAGS, we don't add "-g -Os/-O2" here
188 if test "z$orig_cflags" = "z"; then
195 dnl always want these CFLAGS
196 AC_C_FLAG([-fno-omit-frame-pointer])
199 AC_C_FLAG([-Wmissing-prototypes])
200 AC_C_FLAG([-Wmissing-declarations])
201 AC_C_FLAG([-Wpointer-arith])
202 AC_C_FLAG([-Wbad-function-cast])
203 AC_C_FLAG([-Wwrite-strings])
204 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
205 AC_C_FLAG([-Wcast-qual])
206 AC_C_FLAG([-Wstrict-prototypes])
207 AC_C_FLAG([-Wmissing-noreturn])
208 AC_C_FLAG([-Wmissing-format-attribute])
209 AC_C_FLAG([-Wunreachable-code])
210 AC_C_FLAG([-Wpacked])
211 AC_C_FLAG([-Wpadded])
213 AC_C_FLAG([-Wno-unused-result])
215 AC_C_FLAG([-Wno-unused-parameter])
216 AC_C_FLAG([-Wno-missing-field-initializers])
218 dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
219 dnl for some reason the string consts get 'promoted' to char *,
220 dnl triggering a const to non-const conversion warning.
221 AC_C_FLAG([-diag-disable 3179])
223 if test x"${enable_werror}" = x"yes" ; then
228 dnl need link on this one, not compile
230 ac_ld_flag_save="$LDFLAGS"
231 LDFLAGS="$LDFLAGS -rdynamic"
232 AC_MSG_CHECKING([[whether linker supports -rdynamic]])
234 [AC_LANG_PROGRAM([[]])],
235 [AC_MSG_RESULT([yes])],
237 LDFLAGS="$ac_ld_flag_save"
248 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
249 LIBS="$PTHREAD_LIBS $LIBS"
251 AC_MSG_FAILURE([This FRR version needs pthreads])
260 AC_CHECK_TOOL(AR, ar)
262 dnl -----------------
263 dnl System extensions
264 dnl -----------------
272 dnl ----------------------
273 dnl Packages configuration
274 dnl ----------------------
275 AC_ARG_WITH(pkg-extra-version,
276 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]),
277 [EXTRAVERSION=$withval],)
278 AC_ARG_WITH(pkg-git-version,
279 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
280 [ test "x$withval" != "xno" && with_pkg_git_version="yes" ])
281 AC_ARG_WITH(vtysh_pager,
282 AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
283 VTYSH_PAGER=$withval, VTYSH_PAGER="more")
285 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for FRR]))
287 AS_HELP_STRING([--disable-doc], [do not build docs]))
289 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
291 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
293 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
294 AC_ARG_ENABLE(ripngd,
295 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
297 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
298 AC_ARG_ENABLE(ospf6d,
299 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
301 AS_HELP_STRING([--enable-ldpd], [build ldpd]))
303 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
304 AC_ARG_ENABLE(eigrpd,
305 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
306 AC_ARG_ENABLE(babeld,
307 AS_HELP_STRING([--disable-babeld], [do not build babeld]))
308 AC_ARG_ENABLE(watchfrr,
309 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
311 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
313 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
314 AC_ARG_ENABLE(bgp-announce,
315 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
316 AC_ARG_ENABLE(bgp-vnc,
317 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
318 AC_ARG_WITH(rfp-path,
319 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
321 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
323 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
324 AC_ARG_ENABLE(tcp-zebra,
325 AS_HELP_STRING([--enable-tcp-zebra], [enable TCP/IP socket connection between zebra and protocol daemon]))
326 AC_ARG_ENABLE(ospfapi,
327 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
328 AC_ARG_ENABLE(ospfclient,
329 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
330 (this is the default if --disable-ospfapi is set)]))
331 AC_ARG_ENABLE(multipath,
332 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
334 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
336 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
337 AC_ARG_ENABLE(vty_group,
338 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
339 AC_ARG_ENABLE(configfile_mask,
340 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
341 AC_ARG_ENABLE(logfile_mask,
342 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
343 AC_ARG_ENABLE(shell_access,
344 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
346 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
348 AS_HELP_STRING([--enable-irdp], [enable IRDP server support in zebra]))
349 AC_ARG_ENABLE(capabilities,
350 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
351 AC_ARG_ENABLE(rusage,
352 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
353 AC_ARG_ENABLE(gcc_ultra_verbose,
354 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
355 AC_ARG_ENABLE(linux24_tcp_md5,
356 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
357 AC_ARG_ENABLE(backtrace,
358 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
359 AC_ARG_ENABLE(time-check,
360 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
361 AC_ARG_ENABLE(pcreposix,
362 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
364 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
365 AC_ARG_ENABLE(systemd,
366 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
367 AC_ARG_ENABLE(werror,
368 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
369 AC_ARG_ENABLE(cumulus,
370 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
371 AC_ARG_ENABLE(datacenter,
372 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
373 AC_ARG_ENABLE(rr-semantics,
374 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
375 AC_ARG_ENABLE([protobuf],
376 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
377 AC_ARG_ENABLE([oldvpn_commands],
378 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
380 AC_CHECK_HEADERS(json-c/json.h)
381 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c", [], [-lm])
382 if test $ac_cv_lib_json_c_json_object_get = no; then
383 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
384 if test $ac_cv_lib_json_json_object_get = no; then
385 AC_MSG_ERROR([lib json is needed to compile])
389 AC_ARG_ENABLE([dev_build],
390 AS_HELP_STRING([--enable-dev-build], [build for development]))
392 if test x"${enable_time_check}" != x"no" ; then
393 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
394 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
396 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
400 case "${enable_systemd}" in
403 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
404 if test $ac_cv_lib_systemd_sd_notify = no; then
405 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
407 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
413 if test "${enable_rr_semantics}" != "no" ; then
414 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
417 if test "${enable_datacenter}" = "yes" ; then
418 AC_DEFINE(HAVE_DATACENTER,,Compile extensions for a DataCenter)
419 DFLT_NAME="datacenter"
421 DFLT_NAME="traditional"
424 if test "${enable_cumulus}" = "yes" ; then
425 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
429 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
431 if test "${enable_shell_access}" = "yes"; then
432 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
435 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
437 if test "x${enable_dev_build}" = "xyes"; then
438 AC_DEFINE(DEV_BUILD,,Build for development)
440 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
445 AS_IF([test "$host" = "$build"], [
449 # 1. try python3, but respect the user's preference on which minor ver
450 # 2. try python, which might be py3 or py2 again on the user's preference
451 # 3. try python2 (can really only be 2.7 but eh)
452 # 4. try 3.5 > 3.4 > 3.3 > 3.2 > 2.7 through pkg-config (no user pref)
454 # (AX_PYTHON_DEVEL has no clue about py3 vs py2)
455 # (AX_PYTHON does not do what we need)
457 AC_CHECK_TOOLS([PYTHONCONFIG], [python3-config python-config python2-config])
458 if test -n "$PYTHONCONFIG"; then
459 PYTHON_CFLAGS="`\"${PYTHONCONFIG}\" --includes`"
460 PYTHON_LIBS="`\"${PYTHONCONFIG}\" --libs`"
462 AC_MSG_CHECKING([whether we found a working Python version])
463 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
465 #if PY_VERSION_HEX < 0x02070000
466 #error python too old
482 if test -z "$PYTHONCONFIG"; then
483 PKG_CHECK_MODULES([PYTHON], python-3.5, [], [
484 PKG_CHECK_MODULES([PYTHON], python-3.4, [], [
485 PKG_CHECK_MODULES([PYTHON], python-3.3, [], [
486 PKG_CHECK_MODULES([PYTHON], python-3.2, [], [
487 PKG_CHECK_MODULES([PYTHON], python-2.7, [], [
488 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
492 AC_MSG_CHECKING([whether we found a working Python version])
493 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
495 #if PY_VERSION_HEX < 0x02070000
496 #error python too old
506 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
510 AC_SUBST(PYTHON_CFLAGS)
511 AC_SUBST(PYTHON_LIBS)
514 # Logic for protobuf support.
516 if test "$enable_protobuf" = "yes"; then
520 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
521 if test "x$PROTOC_C" = "x/bin/false"; then
525 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
526 [found_protobuf_c=yes],
527 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
529 if test "x$found_protobuf_c" = "xyes"; then
530 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
531 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
533 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
534 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
540 # Logic for old vpn commans support.
542 if test "$enable_oldvpn_commands" = "yes"; then
543 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
546 # Fail if the user explicity enabled protobuf support and we couldn't
547 # find the compiler or libraries.
548 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
549 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
552 if test "x$have_protobuf" = "xyes"; then
553 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
556 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
559 # End of logic for protobuf support.
562 if test "${enable_tcp_zebra}" = "yes"; then
563 AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
566 if test "${enable_linux24_tcp_md5}" = "yes"; then
567 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
570 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
571 if test "${enable_rtadv}" != "no"; then
573 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
578 if test "${enable_irdp}" = "yes"; then
579 AC_DEFINE(HAVE_IRDP,, IRDP )
582 if test x"${enable_user}" = x"no"; then
585 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
588 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
591 if test x"${enable_group}" = x"no"; then
594 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
597 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
600 if test x"${enable_vty_group}" = x"yes" ; then
601 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
602 elif test x"${enable_vty_group}" != x""; then
603 if test x"${enable_vty_group}" != x"no"; then
604 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
607 AC_SUBST([enable_user])
608 AC_SUBST([enable_group])
609 AC_SUBST([enable_vty_group])
611 enable_configfile_mask=${enable_configfile_mask:-0600}
612 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
614 enable_logfile_mask=${enable_logfile_mask:-0600}
615 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
619 case "${enable_multipath}" in
623 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
624 MPATH_NUM="${enable_multipath}"
629 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
633 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
635 AC_DEFINE_UNQUOTED(VTYSH_PAGER, "$VTYSH_PAGER", [What pager to use])
637 dnl -----------------------------------
638 dnl Add extra version string to package
639 dnl name, string and version fields.
640 dnl -----------------------------------
641 if test "x${EXTRAVERSION}" != "x" ; then
642 VERSION="${VERSION}${EXTRAVERSION}"
643 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
644 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
645 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
648 if test "x$with_pkg_git_version" = "xyes"; then
649 if test -d "${srcdir}/.git"; then
650 AC_DEFINE(GIT_VERSION, [1], [include git version info])
651 else with_pkg_git_version="no"
652 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
655 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
657 dnl ------------------------------------
658 dnl Check C keywords and standard types
659 dnl ------------------------------------
670 dnl -------------------------
671 dnl Check other header files.
672 dnl -------------------------
673 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
674 linux/version.h asm/types.h \
677 ac_stdatomic_ok=false
678 AC_DEFINE(FRR_AUTOCONF_ATOMIC, 1, [did autoconf checks for atomic funcs])
679 AC_CHECK_HEADER([stdatomic.h],[
681 AC_MSG_CHECKING([whether _Atomic qualifier works])
682 AC_LINK_IFELSE([AC_LANG_SOURCE([[
683 #include <stdatomic.h>
684 int main(int argc, char **argv) {
689 AC_DEFINE(HAVE_STDATOMIC_H, 1, [found stdatomic.h])
697 AS_IF([$ac_stdatomic_ok], [true], [
698 AC_MSG_CHECKING([for __atomic_* builtins])
699 AC_LINK_IFELSE([AC_LANG_SOURCE([[
700 int main(int argc, char **argv) {
702 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
703 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
706 AC_DEFINE(HAVE___ATOMIC, 1, [found __atomic builtins])
711 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
712 AC_MSG_CHECKING([for __sync_* builtins])
713 AC_LINK_IFELSE([AC_LANG_SOURCE([[
714 int main(int argc, char **argv) {
716 __sync_fetch_and_sub (&i, 1);
717 return __sync_val_compare_and_swap (&i, 0, 1);
720 AC_DEFINE(HAVE___SYNC, 1, [found __sync builtins])
723 AC_MSG_CHECKING([for __sync_swap builtin])
724 AC_LINK_IFELSE([AC_LANG_SOURCE([[
725 int main(int argc, char **argv) {
727 return __sync_swap (&i, 2);
730 AC_DEFINE(HAVE___SYNC_SWAP, 1, [found __sync_swap builtin])
738 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
743 dnl Utility macro to avoid retyping includes all the time
744 m4_define([FRR_INCLUDES],
747 #define __EXTENSIONS__
752 #include <sys/types.h>
753 /* sys/conf.h depends on param.h on FBSD at least */
754 #include <sys/param.h>
755 /* Required for MAXSIG */
757 #include <sys/socket.h>
759 # define __APPLE_USE_RFC_3542
761 #include <netinet/in.h>
762 #include <sys/time.h>
767 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
768 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
769 dnl an additional round for it.
771 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
773 m4_define([FRR_INCLUDES],
775 [#if HAVE_NET_IF_VAR_H
776 # include <net/if_var.h>
780 AC_CHECK_HEADERS([netinet/in_var.h \
781 net/if_dl.h net/netopt.h \
782 inet/nd.h netinet/ip_icmp.h \
783 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
784 [], [], FRR_INCLUDES)
786 AC_CHECK_HEADERS([ucontext.h], [], [],
789 #endif /* __USE_GNU */
793 m4_define([UCONTEXT_INCLUDES],
794 [#include <ucontext.h>])dnl
796 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
797 [], [], [UCONTEXT_INCLUDES])
798 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
799 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
800 [], [], [UCONTEXT_INCLUDES])],
801 [], [UCONTEXT_INCLUDES])
802 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
803 [], [], [UCONTEXT_INCLUDES])
805 m4_define([FRR_INCLUDES],
809 #include <netinet/in_systm.h>
810 #if HAVE_NETINET_IN_VAR_H
811 # include <netinet/in_var.h>
814 # include <net/if_dl.h>
816 #if HAVE_NET_NETOPT_H
817 # include <net/netopt.h>
819 #include <net/route.h>
821 # include <inet/nd.h>
823 #include <arpa/inet.h>
824 /* Required for IDRP */
825 #if HAVE_NETINET_IP_ICMP_H
826 # include <netinet/ip_icmp.h>
830 dnl V6 headers are checked below, after we check for v6
832 AC_MSG_CHECKING([which operating system interface to use])
835 AC_MSG_RESULT([Solaris])
837 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
838 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
840 AC_CHECK_LIB(socket, main)
841 AC_CHECK_LIB(nsl, main)
842 AC_CHECK_LIB(umem, main)
843 AC_CHECK_FUNCS([printstack], [
844 AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
845 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
851 AC_MSG_RESULT([Linux])
853 AC_DEFINE(GNU_LINUX,,GNU Linux)
854 AC_DEFINE(HAVE_NETLINK,,netlink)
855 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
857 dnl Linux has a compilation problem with mixing
858 dnl netinet/in.h and linux/in6.h they are not
859 dnl compatible. There has been discussion on
860 dnl how to fix it but no real progress on implementation
861 dnl when they fix it, remove this
862 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
864 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
867 AC_MSG_RESULT([OpenBSD])
869 AC_DEFINE(OPEN_BSD,,OpenBSD)
870 AC_DEFINE(KAME,1,KAME IPv6)
872 if test "x${enable_pimd}" != "xno"; then
877 AC_MSG_FAILURE([pimd cannot be enabled as PIM support has been removed from OpenBSD 6.1])
885 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
886 AC_DEFINE(KAME,1,KAME IPv6)
892 dnl ---------------------
893 dnl Integrated VTY option
894 dnl ---------------------
895 case "${enable_vtysh}" in
898 AC_DEFINE(VTYSH,,VTY shell)
899 dnl Vtysh uses libreadline, which looks for termcap functions at
900 dnl configure time. We follow readlines search order.
901 dnl The required procedures are in libtermcap on NetBSD, in
902 dnl [TODO] on Linux, and in [TODO] on Solaris.
903 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
904 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
905 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
906 [AC_CHECK_LIB(ncurses, tputs,
907 LIBREADLINE="$LIBREADLINE -lncurses")]
911 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
913 if test $ac_cv_lib_readline_main = no; then
914 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
916 AC_CHECK_HEADER(readline/history.h)
917 if test $ac_cv_header_readline_history_h = no;then
918 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
920 AC_CHECK_LIB(readline, rl_completion_matches,
921 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
922 if test $ac_cv_lib_readline_rl_completion_matches = no; then
923 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
927 AC_SUBST(LIBREADLINE)
928 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
933 dnl FRR detects the PAM library it is built against by checking for a
934 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
935 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
936 dnl openpam.h doesn't do that, although depends on the header too. Hence a
937 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
940 if test "$with_libpam" = "yes"; then
941 AC_CHECK_HEADER([security/pam_misc.h],
942 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
943 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
944 pam_conv_func="misc_conv"
947 AC_CHECK_HEADER([security/openpam.h],
948 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
949 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
950 pam_conv_func="openpam_ttyconv"
952 [], FRR_INCLUDES[#include <security/pam_appl.h>])
953 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
954 AC_MSG_WARN([*** pam support will not be built ***])
959 if test "$with_libpam" = "yes"; then
960 dnl took this test from proftpds configure.in and suited to our needs
961 dnl -------------------------------------------------------------------------
963 dnl This next check looks funky due to a linker problem with some versions
964 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
965 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
966 dnl with RedHat 6.2 and Debian 2.2 or better.
967 AC_CHECK_LIB(pam, pam_start,
968 [AC_CHECK_LIB(pam, $pam_conv_func,
969 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
971 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
972 LIBPAM="-lpam -lpam_misc"]
976 [AC_CHECK_LIB(pam, pam_end,
977 [AC_CHECK_LIB(pam, $pam_conv_func,
978 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
979 LIBPAM="-lpam -ldl"],
980 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
981 LIBPAM="-lpam -ldl -lpam_misc"]
983 ],AC_MSG_WARN([*** pam support will not be built ***]),
990 dnl -------------------------------
991 dnl Endian-ness check
992 dnl -------------------------------
995 dnl -------------------------------
996 dnl check the size in byte of the C
997 dnl -------------------------------
998 dnl AC_CHECK_SIZEOF(char)
999 dnl AC_CHECK_SIZEOF(int)
1000 dnl AC_CHECK_SIZEOF(short)
1001 dnl AC_CHECK_SIZEOF(long)
1003 dnl ----------------------------
1004 dnl check existance of functions
1005 dnl ----------------------------
1011 dnl -------------------------------
1012 dnl bgpd needs pow() and hence libm
1013 dnl -------------------------------
1015 AC_CHECK_HEADER([math.h],
1016 [AC_CHECK_LIB([m], [pow],
1019 AC_CHECK_FUNCS(pow,[],[LIBM=""])
1022 if test x"$LIBM" = x ; then
1023 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1035 AC_CHECK_HEADER([asm-generic/unistd.h],
1036 [AC_CHECK_DECL(__NR_setns,
1037 AC_DEFINE(HAVE_NETNS,, Have netns),,
1038 FRR_INCLUDES [#include <asm-generic/unistd.h>
1040 AC_CHECK_FUNCS(setns)]
1043 dnl --------------------------
1044 dnl Determine IS-IS I/O method
1045 dnl --------------------------
1046 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
1047 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
1048 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
1049 AC_CHECK_HEADER(net/bpf.h)
1050 AC_CHECK_HEADER(sys/dlpi.h)
1051 AC_MSG_CHECKING(zebra IS-IS I/O method)
1055 AC_MSG_RESULT(pfpacket)
1056 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1060 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1063 if test $ac_cv_header_net_bpf_h = no; then
1064 if test $ac_cv_header_sys_dlpi_h = no; then
1066 AC_MSG_WARN([*** IS-IS support will not be built ***])
1071 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1074 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
1078 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
1080 dnl ------------------------------------
1081 dnl check for broken CMSG_FIRSTHDR macro
1082 dnl ------------------------------------
1083 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
1084 AC_RUN_IFELSE([AC_LANG_SOURCE([[
1087 #define __EXTENSIONS__
1090 #include <sys/types.h>
1091 #include <sys/socket.h>
1098 msg.msg_control = buf;
1099 msg.msg_controllen = 0;
1101 if (CMSG_FIRSTHDR(&msg) != NULL)
1104 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
1105 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
1107 dnl ---------------------------------------------------------------
1108 dnl figure out how to specify an interface in multicast sockets API
1109 dnl ---------------------------------------------------------------
1110 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1112 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1113 #include <sys/socket.h>
1114 #include <netinet/in.h>
1115 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1116 #include <linux/types.h>
1119 m4_define([FRR_INCLUDES],
1121 [#if HAVE_LINUX_MROUTE_H
1122 # include <linux/mroute.h>
1126 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1127 #include <sys/socket.h>
1128 #include <sys/types.h>
1129 #include <netinet/in.h>
1130 #include <net/route.h>
1133 m4_define([FRR_INCLUDES],
1135 [#if HAVE_NETINET_IP_MROUTE_H
1136 # include <netinet/ip_mroute.h>
1140 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1141 AC_TRY_COMPILE([#include <sys/param.h>],
1142 [#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)
1145 #error No support for BSD struct ip_mreq hack detected
1146 #endif],[AC_MSG_RESULT(yes)
1147 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1150 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1152 #include <sys/types.h>
1153 #include <netinet/in.h>
1154 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1155 ], [AC_MSG_RESULT(yes)
1156 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1159 dnl ---------------------------------------------------------------
1160 dnl figure out how to check link-state
1161 dnl ---------------------------------------------------------------
1162 AC_CHECK_HEADER( [net/if_media.h],
1163 [m4_define([LINK_DETECT_INCLUDES],
1165 [#include <net/if_media.h>
1167 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1168 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1169 [], LINK_DETECT_INCLUDES)],
1173 dnl ---------------------------------------------------------------
1174 dnl Additional, newer way to check link-state using ifi_link_state.
1175 dnl Not available in all BSD's when ifmediareq available
1176 dnl ---------------------------------------------------------------
1177 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1178 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1181 dnl ------------------------
1182 dnl TCP_MD5SIG socket option
1183 dnl ------------------------
1185 AC_CHECK_HEADER([netinet/tcp.h],
1186 [m4_define([MD5_INCLUDES],
1188 [#include <netinet/tcp.h>
1190 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1193 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1194 AC_CHECK_HEADER([linux/tcp.h],
1195 [m4_define([MD5_INCLUDES],
1197 [#include <linux/tcp.h>
1199 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1202 dnl ----------------------------------------------------------------------------
1203 dnl figure out if domainname is available in the utsname struct (GNU extension).
1204 dnl ----------------------------------------------------------------------------
1205 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1207 dnl ------------------
1208 dnl IPv6 header checks
1209 dnl ------------------
1210 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1211 netinet6/in6_var.h netinet6/nd6.h], [], [],
1214 m4_define([FRR_INCLUDES],dnl
1216 [#if HAVE_NETINET6_IN6_H
1217 #include <netinet6/in6.h>
1219 #if HAVE_NETINET_IN6_VAR_H
1220 #include <netinet/in6_var.h>
1222 #include <netinet/icmp6.h>
1223 #if HAVE_NETINET6_IN6_VAR_H
1224 # include <netinet6/in6_var.h>
1226 #if HAVE_NETINET6_ND6_H
1227 # include <netinet6/nd6.h>
1231 dnl disable doc check
1232 if test "${enable_doc}" = "no";then
1238 dnl --------------------
1239 dnl Daemon disable check
1240 dnl --------------------
1241 AM_CONDITIONAL(ZEBRA, test "${enable_zebra}" != "no")
1243 if test "${enable_bgpd}" = "no";then
1248 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1250 if test "${enable_ripd}" = "no";then
1255 AM_CONDITIONAL(RIPD, test "x$RIPD" = "xripd")
1257 if test "${enable_ospfd}" = "no";then
1262 AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd")
1264 if test "${enable_ldpd}" = "no";then
1268 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1270 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1275 if test "${enable_nhrpd}" != "no"; then
1280 if test "${enable_nhrpd}" = "yes"; then
1281 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1285 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1287 if test "${enable_eigrpd}" = "no";then
1292 AM_CONDITIONAL(EIGRPD, test "x$EIGRPD" = "xeigrpd")
1294 if test "${enable_watchfrr}" = "no";then
1299 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1302 if test "${enable_ospfapi}" != "no";then
1303 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1305 if test "${enable_ospfclient}" != "no";then
1306 OSPFCLIENT="ospfclient"
1310 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1312 case "${enable_ripngd}" in
1314 * ) RIPNGD="ripngd";;
1316 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1318 case "${enable_babeld}" in
1320 * ) BABELD="babeld";;
1322 AM_CONDITIONAL(BABELD, test "x$BABELD" = "xbabeld")
1324 case "${enable_ospf6d}" in
1326 * ) OSPF6D="ospf6d";;
1328 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1330 case "${enable_isisd}" in
1334 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1336 case "${enable_pimd}" in
1340 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1342 if test "${enable_bgp_announce}" = "no";then
1343 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1345 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1348 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1349 with_rfp_path="bgpd/rfp-example"
1351 if test "${with_rfp_path}" != "no"; then
1352 VNC_RFP_PATH="${with_rfp_path}"
1353 AC_SUBST(VNC_RFP_PATH)
1356 if test "${enable_bgp_vnc}" != "no";then
1357 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1358 RFPTEST="${with_rfp_path}/rfptest"
1359 LIBRFP="${with_rfp_path}/librfp"
1360 RFPINC="${with_rfp_path}/librfp"
1364 RFPINC="bgpd/rfp-example/librfp"
1367 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1388 AC_SUBST(OSPFCLIENT)
1390 AC_CHECK_LIB(crypt, crypt, [],
1391 [AC_CHECK_LIB(crypto, DES_crypt)])
1392 AC_CHECK_LIB(resolv, res_init)
1394 dnl ---------------------------
1395 dnl check system has PCRE regexp
1396 dnl ---------------------------
1397 if test "x$enable_pcreposix" = "xyes"; then
1398 AC_CHECK_LIB(pcreposix, regexec, [], [
1399 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1402 AC_SUBST(HAVE_LIBPCREPOSIX)
1404 dnl ------------------
1405 dnl check C-Ares library
1406 dnl ------------------
1407 if test "${NHRPD}" != ""; then
1408 PKG_CHECK_MODULES([CARES], [libcares], , [
1409 AC_MSG_ERROR([trying to build nhrpd, but libcares not found. install c-ares and its -dev headers.])
1414 dnl ------------------
1415 dnl check Net-SNMP library
1416 dnl ------------------
1417 if test "${enable_snmp}" != ""; then
1418 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1419 if test x"$NETSNMP_CONFIG" = x"no"; then
1420 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1422 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1423 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1424 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1425 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
1433 AC_MSG_ERROR([--enable-snmp given but not usable])])
1434 case "${enable_snmp}" in
1439 SNMP_METHOD="${enable_snmp}"
1442 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1445 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1446 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1447 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1449 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1451 AC_SUBST(SNMP_CFLAGS)
1456 AC_SEARCH_LIBS([sqrt], [m])
1461 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1462 AC_MSG_ERROR([unable to find the dlopen()])
1465 AC_CHECK_HEADERS([link.h])
1467 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1468 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1476 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1479 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1484 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1485 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1492 struct link_map *lm = NULL;
1493 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1496 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1502 AM_CONDITIONAL(SNMP, test "x$SNMP_METHOD" = "xagentx")
1504 dnl ---------------------------
1505 dnl sockaddr and netinet checks
1506 dnl ---------------------------
1509 struct vifctl, struct mfcctl, struct sioc_sg_req,
1510 vifi_t, struct sioc_vif_req, struct igmpmsg,
1511 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1512 struct nd_opt_adv_interval, struct rt_addrinfo,
1513 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1514 [], [], FRR_INCLUDES)
1516 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1517 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1518 struct sockaddr_dl.sdl_len,
1519 struct if6_aliasreq.ifra_lifetime,
1520 struct nd_opt_adv_interval.nd_opt_ai_type],
1521 [], [], FRR_INCLUDES)
1523 dnl ---------------------------
1524 dnl IRDP/pktinfo/icmphdr checks
1525 dnl ---------------------------
1526 AC_CHECK_TYPES([struct in_pktinfo],
1527 [AC_CHECK_TYPES([struct icmphdr],
1528 [if test "${enable_irdp}" != "no"; then
1529 AC_DEFINE(HAVE_IRDP,, IRDP)
1531 [if test "${enable_irdp}" = "yes"; then
1532 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1533 fi], [FRR_INCLUDES])],
1534 [if test "${enable_irdp}" = "yes"; then
1535 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1536 fi], [FRR_INCLUDES])
1538 dnl -----------------------
1539 dnl checking for IP_PKTINFO
1540 dnl -----------------------
1541 AC_MSG_CHECKING(for IP_PKTINFO)
1542 AC_TRY_COMPILE([#include <netdb.h>], [
1543 int opt = IP_PKTINFO;
1546 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1551 dnl ---------------------------
1552 dnl checking for IP_RECVDSTADDR
1553 dnl ---------------------------
1554 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1555 AC_TRY_COMPILE([#include <netinet/in.h>], [
1556 int opt = IP_RECVDSTADDR;
1559 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1564 dnl ----------------------
1565 dnl checking for IP_RECVIF
1566 dnl ----------------------
1567 AC_MSG_CHECKING(for IP_RECVIF)
1568 AC_TRY_COMPILE([#include <netinet/in.h>], [
1569 int opt = IP_RECVIF;
1572 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1577 dnl ----------------------
1578 dnl checking for SO_BINDANY
1579 dnl ----------------------
1580 AC_MSG_CHECKING(for SO_BINDANY)
1581 AC_TRY_COMPILE([#include <sys/socket.h>], [
1582 int opt = SO_BINDANY;
1585 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1590 dnl ----------------------
1591 dnl checking for IP_FREEBIND
1592 dnl ----------------------
1593 AC_MSG_CHECKING(for IP_FREEBIND)
1594 AC_TRY_COMPILE([#include <netinet/in.h>], [
1595 int opt = IP_FREEBIND;
1598 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1603 dnl --------------------------------------
1604 dnl checking for be32dec existence or not
1605 dnl --------------------------------------
1606 AC_CHECK_DECLS([be32enc, be32dec], [], [],
1607 [#include <sys/endian.h>])
1609 dnl --------------------------------------
1610 dnl checking for clock_time monotonic struct and call
1611 dnl --------------------------------------
1612 AC_CHECK_DECL(CLOCK_MONOTONIC,
1613 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1614 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1615 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1617 dnl --------------------------------------
1618 dnl checking for flex and bison
1619 dnl --------------------------------------
1622 AC_MSG_CHECKING(version of flex)
1623 frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1624 frr_ac_flex_version="${frr_ac_flex_version##* }"
1625 AC_MSG_RESULT([$frr_ac_flex_version])
1626 AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
1627 LEX="$SHELL $missing_dir/missing flex"
1628 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1629 AC_MSG_WARN([using pregenerated flex output files])
1631 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1633 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1634 AC_SUBST([LEXLIB], [''])
1638 dnl thanks GNU bison for this b*llshit...
1639 AC_MSG_CHECKING(version of bison)
1640 frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1641 frr_ac_bison_version="${frr_ac_bison_version##* }"
1642 frr_ac_bison_missing="false"
1643 case "x${frr_ac_bison_version}" in
1646 BISON_CLOSEBRACE='"'
1648 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
1651 AC_MSG_RESULT([$frr_ac_bison_version])
1652 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1653 frr_ac_bison_missing="true"
1656 AC_MSG_RESULT([none])
1657 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1658 frr_ac_bison_missing="true"
1662 BISON_CLOSEBRACE='}'
1663 BISON_VERBOSE='-Dparse.error=verbose'
1664 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 or newer])
1667 AC_SUBST(BISON_OPENBRACE)
1668 AC_SUBST(BISON_CLOSEBRACE)
1669 AC_SUBST(BISON_VERBOSE)
1671 if $frr_ac_bison_missing; then
1672 YACC="$SHELL $missing_dir/missing bison -y"
1673 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1674 AC_MSG_WARN([using pregenerated bison output files])
1676 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1680 dnl -------------------
1681 dnl capabilities checks
1682 dnl -------------------
1683 if test "${enable_capabilities}" != "no"; then
1684 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1685 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1687 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1688 frr_ac_keepcaps="yes"],
1691 if test x"${frr_ac_keepcaps}" = x"yes"; then
1692 AC_CHECK_HEADERS(sys/capability.h)
1694 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1695 AC_CHECK_LIB(cap, cap_init,
1696 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1701 AC_CHECK_HEADERS(priv.h,
1702 [AC_MSG_CHECKING(Solaris style privileges are available)
1703 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1705 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1706 frr_ac_scaps="yes"],
1712 if test x"${frr_ac_scaps}" = x"yes" \
1713 -o x"${frr_ac_lcaps}" = x"yes"; then
1714 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1719 dnl ---------------------------
1720 dnl check for glibc 'backtrace'
1721 dnl ---------------------------
1722 if test x"${enable_backtrace}" != x"no" ; then
1724 AC_CHECK_HEADER([execinfo.h], [
1725 AC_SEARCH_LIBS([backtrace], [execinfo], [
1726 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1727 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1732 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1733 dnl user explicitly requested backtrace but we failed to find support
1734 AC_MSG_FAILURE([failed to find backtrace support])
1738 dnl -----------------------------------------
1739 dnl check for malloc mallinfo struct and call
1740 dnl this must try and link using LIBS, in
1741 dnl order to check no alternative allocator
1742 dnl has been specified, which might not provide
1743 dnl mallinfo, e.g. such as Umem on Solaris.
1744 dnl -----------------------------------------
1745 AC_CHECK_HEADER([malloc.h],
1746 [AC_MSG_CHECKING(whether mallinfo is available)
1747 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1748 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1750 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1753 ], [], FRR_INCLUDES)
1758 CONFDATE=`date '+%Y%m%d'`
1761 dnl ------------------------------
1762 dnl set paths for state directory
1763 dnl ------------------------------
1764 AC_MSG_CHECKING(directory to use for state file)
1765 if test "${prefix}" = "NONE"; then
1766 frr_statedir_prefix="";
1768 frr_statedir_prefix=${prefix}
1770 if test "${localstatedir}" = '${prefix}/var'; then
1771 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1772 ${frr_statedir_prefix}/var/adm dnl
1773 ${frr_statedir_prefix}/etc dnl
1779 test -d $FRR_STATE_DIR && break
1781 frr_statedir=$FRR_STATE_DIR
1783 frr_statedir=${localstatedir}
1785 if test $frr_statedir = "/dev/null"; then
1786 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1788 AC_MSG_RESULT(${frr_statedir})
1789 AC_SUBST(frr_statedir)
1791 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1792 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1793 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1795 dnl autoconf does this, but it does it too late...
1796 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1797 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1799 dnl get the full path, recursing through variables...
1800 vtysh_bin="$bindir/vtysh"
1801 for I in 1 2 3 4 5 6 7 8 9 10; do
1802 eval vtysh_bin="\"$vtysh_bin\""
1804 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1806 CFG_SYSCONF="$sysconfdir"
1808 CFG_STATE="$frr_statedir"
1809 CFG_MODULE="$moduledir"
1810 for I in 1 2 3 4 5 6 7 8 9 10; do
1811 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1812 eval CFG_SBIN="\"$CFG_SBIN\""
1813 eval CFG_STATE="\"$CFG_STATE\""
1814 eval CFG_MODULE="\"$CFG_MODULE\""
1816 AC_SUBST(CFG_SYSCONF)
1819 AC_SUBST(CFG_MODULE)
1820 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1822 dnl ---------------------------
1823 dnl Check htonl works correctly
1824 dnl ---------------------------
1825 AC_MSG_CHECKING(for working htonl)
1826 AC_CACHE_VAL(ac_cv_htonl_works,
1827 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1828 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1831 AC_MSG_RESULT($ac_cv_htonl_works)
1833 AC_CONFIG_FILES([Makefile ripd/Makefile
1834 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile
1835 ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile
1836 doc/Makefile ospfclient/Makefile tests/Makefile
1837 bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile
1844 snapcraft/snapcraft.yaml
1846 tests/lib/cli/test_cli.refout
1863 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1864 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1868 AC_CONFIG_FILES([solaris/Makefile])
1870 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1872 ## Hack, but working solution to avoid rebuilding of frr.info.
1873 ## It's already in CVS until texinfo 4.7 is more common.
1877 FRRouting configuration
1878 ------------------------------
1879 FRR version : ${PACKAGE_VERSION}
1880 host operating system : ${host_os}
1881 source code location : ${srcdir}
1883 compiler flags : ${CFLAGS}
1885 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1886 state file directory : ${frr_statedir}
1887 config file directory : `eval echo \`echo ${sysconfdir}\``
1888 example directory : `eval echo \`echo ${exampledir}\``
1889 module directory : ${CFG_MODULE}
1890 user to run as : ${enable_user}
1891 group to run as : ${enable_group}
1892 group for vty sockets : ${enable_vty_group}
1893 config file mask : ${enable_configfile_mask}
1894 log file mask : ${enable_logfile_mask}
1895 zebra protobuf enabled : ${have_protobuf:-no}
1897 The above user and group must have read/write access to the state file
1898 directory and to the config files in the config file directory."