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")
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)
875 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
876 AC_DEFINE(KAME,1,KAME IPv6)
882 dnl ---------------------
883 dnl Integrated VTY option
884 dnl ---------------------
885 case "${enable_vtysh}" in
888 AC_DEFINE(VTYSH,,VTY shell)
889 dnl Vtysh uses libreadline, which looks for termcap functions at
890 dnl configure time. We follow readlines search order.
891 dnl The required procedures are in libtermcap on NetBSD, in
892 dnl [TODO] on Linux, and in [TODO] on Solaris.
893 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
894 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
895 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
896 [AC_CHECK_LIB(ncurses, tputs,
897 LIBREADLINE="$LIBREADLINE -lncurses")]
901 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
903 if test $ac_cv_lib_readline_main = no; then
904 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
906 AC_CHECK_HEADER(readline/history.h)
907 if test $ac_cv_header_readline_history_h = no;then
908 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
910 AC_CHECK_LIB(readline, rl_completion_matches,
911 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
912 if test $ac_cv_lib_readline_rl_completion_matches = no; then
913 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
917 AC_SUBST(LIBREADLINE)
918 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
923 dnl FRR detects the PAM library it is built against by checking for a
924 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
925 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
926 dnl openpam.h doesn't do that, although depends on the header too. Hence a
927 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
930 if test "$with_libpam" = "yes"; then
931 AC_CHECK_HEADER([security/pam_misc.h],
932 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
933 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
934 pam_conv_func="misc_conv"
937 AC_CHECK_HEADER([security/openpam.h],
938 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
939 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
940 pam_conv_func="openpam_ttyconv"
942 [], FRR_INCLUDES[#include <security/pam_appl.h>])
943 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
944 AC_MSG_WARN([*** pam support will not be built ***])
949 if test "$with_libpam" = "yes"; then
950 dnl took this test from proftpds configure.in and suited to our needs
951 dnl -------------------------------------------------------------------------
953 dnl This next check looks funky due to a linker problem with some versions
954 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
955 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
956 dnl with RedHat 6.2 and Debian 2.2 or better.
957 AC_CHECK_LIB(pam, pam_start,
958 [AC_CHECK_LIB(pam, $pam_conv_func,
959 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
961 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
962 LIBPAM="-lpam -lpam_misc"]
966 [AC_CHECK_LIB(pam, pam_end,
967 [AC_CHECK_LIB(pam, $pam_conv_func,
968 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
969 LIBPAM="-lpam -ldl"],
970 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
971 LIBPAM="-lpam -ldl -lpam_misc"]
973 ],AC_MSG_WARN([*** pam support will not be built ***]),
980 dnl -------------------------------
981 dnl Endian-ness check
982 dnl -------------------------------
985 dnl -------------------------------
986 dnl check the size in byte of the C
987 dnl -------------------------------
988 dnl AC_CHECK_SIZEOF(char)
989 dnl AC_CHECK_SIZEOF(int)
990 dnl AC_CHECK_SIZEOF(short)
991 dnl AC_CHECK_SIZEOF(long)
993 dnl ----------------------------
994 dnl check existance of functions
995 dnl ----------------------------
1001 dnl -------------------------------
1002 dnl bgpd needs pow() and hence libm
1003 dnl -------------------------------
1005 AC_CHECK_HEADER([math.h],
1006 [AC_CHECK_LIB([m], [pow],
1009 AC_CHECK_FUNCS(pow,[],[LIBM=""])
1012 if test x"$LIBM" = x ; then
1013 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1025 AC_CHECK_HEADER([asm-generic/unistd.h],
1026 [AC_CHECK_DECL(__NR_setns,
1027 AC_DEFINE(HAVE_NETNS,, Have netns),,
1028 FRR_INCLUDES [#include <asm-generic/unistd.h>
1030 AC_CHECK_FUNCS(setns)]
1033 dnl --------------------------
1034 dnl Determine IS-IS I/O method
1035 dnl --------------------------
1036 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
1037 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
1038 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
1039 AC_CHECK_HEADER(net/bpf.h)
1040 AC_CHECK_HEADER(sys/dlpi.h)
1041 AC_MSG_CHECKING(zebra IS-IS I/O method)
1045 AC_MSG_RESULT(pfpacket)
1046 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1050 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1053 if test $ac_cv_header_net_bpf_h = no; then
1054 if test $ac_cv_header_sys_dlpi_h = no; then
1056 AC_MSG_WARN([*** IS-IS support will not be built ***])
1061 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1064 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
1068 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
1070 dnl ------------------------------------
1071 dnl check for broken CMSG_FIRSTHDR macro
1072 dnl ------------------------------------
1073 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
1074 AC_RUN_IFELSE([AC_LANG_SOURCE([[
1077 #define __EXTENSIONS__
1080 #include <sys/types.h>
1081 #include <sys/socket.h>
1088 msg.msg_control = buf;
1089 msg.msg_controllen = 0;
1091 if (CMSG_FIRSTHDR(&msg) != NULL)
1094 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
1095 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
1097 dnl ---------------------------------------------------------------
1098 dnl figure out how to specify an interface in multicast sockets API
1099 dnl ---------------------------------------------------------------
1100 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1102 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1103 #include <sys/socket.h>
1104 #include <netinet/in.h>
1105 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1106 #include <linux/types.h>
1109 m4_define([FRR_INCLUDES],
1111 [#if HAVE_LINUX_MROUTE_H
1112 # include <linux/mroute.h>
1116 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1117 #include <sys/socket.h>
1118 #include <sys/types.h>
1119 #include <netinet/in.h>
1120 #include <net/route.h>
1123 m4_define([FRR_INCLUDES],
1125 [#if HAVE_NETINET_IP_MROUTE_H
1126 # include <netinet/ip_mroute.h>
1130 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1131 AC_TRY_COMPILE([#include <sys/param.h>],
1132 [#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)
1135 #error No support for BSD struct ip_mreq hack detected
1136 #endif],[AC_MSG_RESULT(yes)
1137 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1140 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1142 #include <sys/types.h>
1143 #include <netinet/in.h>
1144 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1145 ], [AC_MSG_RESULT(yes)
1146 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1149 dnl ---------------------------------------------------------------
1150 dnl figure out how to check link-state
1151 dnl ---------------------------------------------------------------
1152 AC_CHECK_HEADER( [net/if_media.h],
1153 [m4_define([LINK_DETECT_INCLUDES],
1155 [#include <net/if_media.h>
1157 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1158 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1159 [], LINK_DETECT_INCLUDES)],
1163 dnl ---------------------------------------------------------------
1164 dnl Additional, newer way to check link-state using ifi_link_state.
1165 dnl Not available in all BSD's when ifmediareq available
1166 dnl ---------------------------------------------------------------
1167 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1168 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1171 dnl ------------------------
1172 dnl TCP_MD5SIG socket option
1173 dnl ------------------------
1175 AC_CHECK_HEADER([netinet/tcp.h],
1176 [m4_define([MD5_INCLUDES],
1178 [#include <netinet/tcp.h>
1180 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1183 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1184 AC_CHECK_HEADER([linux/tcp.h],
1185 [m4_define([MD5_INCLUDES],
1187 [#include <linux/tcp.h>
1189 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1192 dnl ----------------------------------------------------------------------------
1193 dnl figure out if domainname is available in the utsname struct (GNU extension).
1194 dnl ----------------------------------------------------------------------------
1195 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1197 dnl ------------------
1198 dnl IPv6 header checks
1199 dnl ------------------
1200 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1201 netinet6/in6_var.h netinet6/nd6.h], [], [],
1204 m4_define([FRR_INCLUDES],dnl
1206 [#if HAVE_NETINET6_IN6_H
1207 #include <netinet6/in6.h>
1209 #if HAVE_NETINET_IN6_VAR_H
1210 #include <netinet/in6_var.h>
1212 #include <netinet/icmp6.h>
1213 #if HAVE_NETINET6_IN6_VAR_H
1214 # include <netinet6/in6_var.h>
1216 #if HAVE_NETINET6_ND6_H
1217 # include <netinet6/nd6.h>
1221 dnl disable doc check
1222 if test "${enable_doc}" = "no";then
1228 dnl --------------------
1229 dnl Daemon disable check
1230 dnl --------------------
1231 AM_CONDITIONAL(ZEBRA, test "${enable_zebra}" != "no")
1233 if test "${enable_bgpd}" = "no";then
1238 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1240 if test "${enable_ripd}" = "no";then
1245 AM_CONDITIONAL(RIPD, test "x$RIPD" = "xripd")
1247 if test "${enable_ospfd}" = "no";then
1252 AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd")
1254 if test "${enable_ldpd}" = "no";then
1258 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1260 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1265 if test "${enable_nhrpd}" != "no"; then
1270 if test "${enable_nhrpd}" = "yes"; then
1271 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1275 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1277 if test "${enable_eigrpd}" = "no";then
1282 AM_CONDITIONAL(EIGRPD, test "x$EIGRPD" = "xeigrpd")
1284 if test "${enable_watchfrr}" = "no";then
1289 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1292 if test "${enable_ospfapi}" != "no";then
1293 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1295 if test "${enable_ospfclient}" != "no";then
1296 OSPFCLIENT="ospfclient"
1300 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1302 case "${enable_ripngd}" in
1304 * ) RIPNGD="ripngd";;
1306 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1308 case "${enable_babeld}" in
1310 * ) BABELD="babeld";;
1312 AM_CONDITIONAL(BABELD, test "x$BABELD" = "xbabeld")
1314 case "${enable_ospf6d}" in
1316 * ) OSPF6D="ospf6d";;
1318 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1320 case "${enable_isisd}" in
1324 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1326 case "${enable_pimd}" in
1330 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1332 if test "${enable_bgp_announce}" = "no";then
1333 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1335 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1338 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1339 with_rfp_path="bgpd/rfp-example"
1341 if test "${with_rfp_path}" != "no"; then
1342 VNC_RFP_PATH="${with_rfp_path}"
1343 AC_SUBST(VNC_RFP_PATH)
1346 if test "${enable_bgp_vnc}" != "no";then
1347 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1348 RFPTEST="${with_rfp_path}/rfptest"
1349 LIBRFP="${with_rfp_path}/librfp"
1350 RFPINC="${with_rfp_path}/librfp"
1354 RFPINC="bgpd/rfp-example/librfp"
1357 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1378 AC_SUBST(OSPFCLIENT)
1380 AC_CHECK_LIB(crypt, crypt, [],
1381 [AC_CHECK_LIB(crypto, DES_crypt)])
1382 AC_CHECK_LIB(resolv, res_init)
1384 dnl ---------------------------
1385 dnl check system has PCRE regexp
1386 dnl ---------------------------
1387 if test "x$enable_pcreposix" = "xyes"; then
1388 AC_CHECK_LIB(pcreposix, regexec, [], [
1389 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1392 AC_SUBST(HAVE_LIBPCREPOSIX)
1394 dnl ------------------
1395 dnl check C-Ares library
1396 dnl ------------------
1397 if test "${NHRPD}" != ""; then
1398 PKG_CHECK_MODULES([CARES], [libcares], , [
1399 AC_MSG_ERROR([trying to build nhrpd, but libcares not found. install c-ares and its -dev headers.])
1404 dnl ------------------
1405 dnl check Net-SNMP library
1406 dnl ------------------
1407 if test "${enable_snmp}" != ""; then
1408 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1409 if test x"$NETSNMP_CONFIG" = x"no"; then
1410 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1412 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1413 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1414 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1415 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
1423 AC_MSG_ERROR([--enable-snmp given but not usable])])
1424 case "${enable_snmp}" in
1429 SNMP_METHOD="${enable_snmp}"
1432 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1435 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1436 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1437 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1439 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1441 AC_SUBST(SNMP_CFLAGS)
1446 AC_SEARCH_LIBS([sqrt], [m])
1451 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1452 AC_MSG_ERROR([unable to find the dlopen()])
1455 AC_CHECK_HEADERS([link.h])
1457 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1458 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1466 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1469 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1474 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1475 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1482 struct link_map *lm = NULL;
1483 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1486 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1492 AM_CONDITIONAL(SNMP, test "x$SNMP_METHOD" = "xagentx")
1494 dnl ---------------------------
1495 dnl sockaddr and netinet checks
1496 dnl ---------------------------
1499 struct vifctl, struct mfcctl, struct sioc_sg_req,
1500 vifi_t, struct sioc_vif_req, struct igmpmsg,
1501 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1502 struct nd_opt_adv_interval, struct rt_addrinfo,
1503 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1504 [], [], FRR_INCLUDES)
1506 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1507 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1508 struct sockaddr_dl.sdl_len,
1509 struct if6_aliasreq.ifra_lifetime,
1510 struct nd_opt_adv_interval.nd_opt_ai_type],
1511 [], [], FRR_INCLUDES)
1513 dnl ---------------------------
1514 dnl IRDP/pktinfo/icmphdr checks
1515 dnl ---------------------------
1516 AC_CHECK_TYPES([struct in_pktinfo],
1517 [AC_CHECK_TYPES([struct icmphdr],
1518 [if test "${enable_irdp}" != "no"; then
1519 AC_DEFINE(HAVE_IRDP,, IRDP)
1521 [if test "${enable_irdp}" = "yes"; then
1522 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1523 fi], [FRR_INCLUDES])],
1524 [if test "${enable_irdp}" = "yes"; then
1525 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1526 fi], [FRR_INCLUDES])
1528 dnl -----------------------
1529 dnl checking for IP_PKTINFO
1530 dnl -----------------------
1531 AC_MSG_CHECKING(for IP_PKTINFO)
1532 AC_TRY_COMPILE([#include <netdb.h>], [
1533 int opt = IP_PKTINFO;
1536 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1541 dnl ---------------------------
1542 dnl checking for IP_RECVDSTADDR
1543 dnl ---------------------------
1544 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1545 AC_TRY_COMPILE([#include <netinet/in.h>], [
1546 int opt = IP_RECVDSTADDR;
1549 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1554 dnl ----------------------
1555 dnl checking for IP_RECVIF
1556 dnl ----------------------
1557 AC_MSG_CHECKING(for IP_RECVIF)
1558 AC_TRY_COMPILE([#include <netinet/in.h>], [
1559 int opt = IP_RECVIF;
1562 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1567 dnl ----------------------
1568 dnl checking for SO_BINDANY
1569 dnl ----------------------
1570 AC_MSG_CHECKING(for SO_BINDANY)
1571 AC_TRY_COMPILE([#include <sys/socket.h>], [
1572 int opt = SO_BINDANY;
1575 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1580 dnl ----------------------
1581 dnl checking for IP_FREEBIND
1582 dnl ----------------------
1583 AC_MSG_CHECKING(for IP_FREEBIND)
1584 AC_TRY_COMPILE([#include <netinet/in.h>], [
1585 int opt = IP_FREEBIND;
1588 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1593 dnl --------------------------------------
1594 dnl checking for be32dec existence or not
1595 dnl --------------------------------------
1596 AC_CHECK_DECLS([be32enc, be32dec], [], [],
1597 [#include <sys/endian.h>])
1599 dnl --------------------------------------
1600 dnl checking for clock_time monotonic struct and call
1601 dnl --------------------------------------
1602 AC_CHECK_DECL(CLOCK_MONOTONIC,
1603 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1604 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1605 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1607 dnl --------------------------------------
1608 dnl checking for flex and bison
1609 dnl --------------------------------------
1612 AC_MSG_CHECKING(version of flex)
1613 frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1614 frr_ac_flex_version="${frr_ac_flex_version##* }"
1615 AC_MSG_RESULT([$frr_ac_flex_version])
1616 AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
1617 LEX="$SHELL $missing_dir/missing flex"
1618 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1619 AC_MSG_WARN([using pregenerated flex output files])
1621 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1623 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1624 AC_SUBST([LEXLIB], [''])
1628 dnl thanks GNU bison for this b*llshit...
1629 AC_MSG_CHECKING(version of bison)
1630 frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1631 frr_ac_bison_version="${frr_ac_bison_version##* }"
1632 frr_ac_bison_missing="false"
1633 case "x${frr_ac_bison_version}" in
1636 BISON_CLOSEBRACE='"'
1638 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
1641 AC_MSG_RESULT([$frr_ac_bison_version])
1642 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1643 frr_ac_bison_missing="true"
1646 AC_MSG_RESULT([none])
1647 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1648 frr_ac_bison_missing="true"
1652 BISON_CLOSEBRACE='}'
1653 BISON_VERBOSE='-Dparse.error=verbose'
1654 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 or newer])
1657 AC_SUBST(BISON_OPENBRACE)
1658 AC_SUBST(BISON_CLOSEBRACE)
1659 AC_SUBST(BISON_VERBOSE)
1661 if $frr_ac_bison_missing; then
1662 YACC="$SHELL $missing_dir/missing bison -y"
1663 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1664 AC_MSG_WARN([using pregenerated bison output files])
1666 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1670 dnl -------------------
1671 dnl capabilities checks
1672 dnl -------------------
1673 if test "${enable_capabilities}" != "no"; then
1674 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1675 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1677 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1678 frr_ac_keepcaps="yes"],
1681 if test x"${frr_ac_keepcaps}" = x"yes"; then
1682 AC_CHECK_HEADERS(sys/capability.h)
1684 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1685 AC_CHECK_LIB(cap, cap_init,
1686 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1691 AC_CHECK_HEADERS(priv.h,
1692 [AC_MSG_CHECKING(Solaris style privileges are available)
1693 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1695 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1696 frr_ac_scaps="yes"],
1702 if test x"${frr_ac_scaps}" = x"yes" \
1703 -o x"${frr_ac_lcaps}" = x"yes"; then
1704 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1709 dnl ---------------------------
1710 dnl check for glibc 'backtrace'
1711 dnl ---------------------------
1712 if test x"${enable_backtrace}" != x"no" ; then
1714 AC_CHECK_HEADER([execinfo.h], [
1715 AC_SEARCH_LIBS([backtrace], [execinfo], [
1716 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1717 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1722 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1723 dnl user explicitly requested backtrace but we failed to find support
1724 AC_MSG_FAILURE([failed to find backtrace support])
1728 dnl -----------------------------------------
1729 dnl check for malloc mallinfo struct and call
1730 dnl this must try and link using LIBS, in
1731 dnl order to check no alternative allocator
1732 dnl has been specified, which might not provide
1733 dnl mallinfo, e.g. such as Umem on Solaris.
1734 dnl -----------------------------------------
1735 AC_CHECK_HEADER([malloc.h],
1736 [AC_MSG_CHECKING(whether mallinfo is available)
1737 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1738 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1740 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1743 ], [], FRR_INCLUDES)
1748 CONFDATE=`date '+%Y%m%d'`
1751 dnl ------------------------------
1752 dnl set paths for state directory
1753 dnl ------------------------------
1754 AC_MSG_CHECKING(directory to use for state file)
1755 if test "${prefix}" = "NONE"; then
1756 frr_statedir_prefix="";
1758 frr_statedir_prefix=${prefix}
1760 if test "${localstatedir}" = '${prefix}/var'; then
1761 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1762 ${frr_statedir_prefix}/var/adm dnl
1763 ${frr_statedir_prefix}/etc dnl
1769 test -d $FRR_STATE_DIR && break
1771 frr_statedir=$FRR_STATE_DIR
1773 frr_statedir=${localstatedir}
1775 if test $frr_statedir = "/dev/null"; then
1776 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1778 AC_MSG_RESULT(${frr_statedir})
1779 AC_SUBST(frr_statedir)
1781 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1782 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1783 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1785 dnl autoconf does this, but it does it too late...
1786 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1787 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1789 dnl get the full path, recursing through variables...
1790 vtysh_bin="$bindir/vtysh"
1791 for I in 1 2 3 4 5 6 7 8 9 10; do
1792 eval vtysh_bin="\"$vtysh_bin\""
1794 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1796 CFG_SYSCONF="$sysconfdir"
1798 CFG_STATE="$frr_statedir"
1799 CFG_MODULE="$moduledir"
1800 for I in 1 2 3 4 5 6 7 8 9 10; do
1801 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1802 eval CFG_SBIN="\"$CFG_SBIN\""
1803 eval CFG_STATE="\"$CFG_STATE\""
1804 eval CFG_MODULE="\"$CFG_MODULE\""
1806 AC_SUBST(CFG_SYSCONF)
1809 AC_SUBST(CFG_MODULE)
1810 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1812 dnl ---------------------------
1813 dnl Check htonl works correctly
1814 dnl ---------------------------
1815 AC_MSG_CHECKING(for working htonl)
1816 AC_CACHE_VAL(ac_cv_htonl_works,
1817 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1818 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1821 AC_MSG_RESULT($ac_cv_htonl_works)
1823 AC_CONFIG_FILES([Makefile ripd/Makefile
1824 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile
1825 ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile
1826 doc/Makefile ospfclient/Makefile tests/Makefile
1827 bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile
1834 snapcraft/snapcraft.yaml
1836 tests/lib/cli/test_cli.refout
1853 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1854 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1858 AC_CONFIG_FILES([solaris/Makefile])
1860 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1862 ## Hack, but working solution to avoid rebuilding of frr.info.
1863 ## It's already in CVS until texinfo 4.7 is more common.
1867 FRRouting configuration
1868 ------------------------------
1869 FRR version : ${PACKAGE_VERSION}
1870 host operating system : ${host_os}
1871 source code location : ${srcdir}
1873 compiler flags : ${CFLAGS}
1875 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1876 state file directory : ${frr_statedir}
1877 config file directory : `eval echo \`echo ${sysconfdir}\``
1878 example directory : `eval echo \`echo ${exampledir}\``
1879 module directory : ${CFG_MODULE}
1880 user to run as : ${enable_user}
1881 group to run as : ${enable_group}
1882 group for vty sockets : ${enable_vty_group}
1883 config file mask : ${enable_configfile_mask}
1884 log file mask : ${enable_logfile_mask}
1885 zebra protobuf enabled : ${have_protobuf:-no}
1887 The above user and group must have read/write access to the state file
1888 directory and to the config files in the config file directory."