2 ## Configure template file for FRRouting.
3 ## autoconf will generate configure script.
5 ## Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
6 ## Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
10 AC_INIT(frr, 4.1-dev, [https://github.com/frrouting/frr/issues])
11 PACKAGE_URL="https://frrouting.org/"
13 PACKAGE_FULLNAME="FRRouting"
14 AC_SUBST(PACKAGE_FULLNAME)
16 CONFIG_ARGS="$ac_configure_args"
19 AC_CONFIG_SRCDIR(lib/zebra.h)
20 AC_CONFIG_MACRO_DIR([m4])
22 dnl -----------------------------------
23 dnl Get hostname and other information.
24 dnl -----------------------------------
28 AS_IF([test "$host" != "$build"], [
29 if test "$srcdir" = "."; then
30 AC_MSG_ERROR([cross-compilation is only possible with builddir separate from srcdir. create a separate directory and run as .../path-to-frr/configure.])
32 test -d hosttools || mkdir hosttools
33 abssrc="`cd \"${srcdir}\"; pwd`"
36 AC_MSG_NOTICE([... cross-compilation: creating hosttools directory and self-configuring for build platform tools])
37 AC_MSG_NOTICE([... use HOST_CPPFLAGS / HOST_CFLAGS / HOST_LDFLAGS if neccessary])
40 ( CPPFLAGS="$HOST_CPPFLAGS"; \
41 CFLAGS="$HOST_CFLAGS"; \
42 LDFLAGS="$HOST_LDFLAGS"; \
43 cd hosttools; "${abssrc}/configure" "--host=$build" "--build=$build" "--enable-clippy-only" "--disable-nhrpd" "--disable-vtysh"; )
46 AC_MSG_NOTICE([... cross-compilation: finished self-configuring for build platform tools])
50 HOSTTOOLS="hosttools/"
56 AM_CONDITIONAL([BUILD_CLIPPY], [$build_clippy])
58 # Disable portability warnings -- our automake code (in particular
59 # common.am) uses some constructs specific to gmake.
60 AM_INIT_AUTOMAKE([1.12 -Wno-portability])
61 m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
62 AM_SILENT_RULES([yes])
63 AC_CONFIG_HEADERS(config.h)
65 AC_PATH_PROG(PERL, perl)
68 dnl default is to match previous behavior
69 exampledir=${sysconfdir}
70 AC_ARG_ENABLE([exampledir],
71 AS_HELP_STRING([--enable-exampledir],
72 [specify alternate directory for examples]),
73 exampledir="$enableval",)
74 dnl XXX add --exampledir to autoconf standard directory list somehow
77 dnl default is to match previous behavior
79 AC_ARG_ENABLE([pkgsrcrcdir],
80 AS_HELP_STRING([--enable-pkgsrcrcdir],
81 [specify directory for rc.d scripts]),
82 pkgsrcrcdir="$enableval",)
83 dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
85 AM_CONDITIONAL([PKGSRC], [test "x$pkgsrcrcdir" != "x"])
87 AC_ARG_WITH([moduledir], [AS_HELP_STRING([--with-moduledir=DIR], [module directory (${libdir}/frr/modules)])], [
90 moduledir="\${libdir}/frr/modules"
92 AC_SUBST([moduledir], [$moduledir])
94 AC_ARG_ENABLE(tcmalloc,
95 AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
96 [case "${enableval}" in
97 yes) tcmalloc_enabled=true
98 LIBS="$LIBS -ltcmalloc_minimal"
100 no) tcmalloc_enabled=false ;;
101 *) AC_MSG_ERROR(bad value ${enableval} for --enable-tcmalloc) ;;
102 esac],[tcmalloc_enabled=false])
105 dnl Thanks autoconf, but we don't want a default -g -O2. We have our own
106 dnl flag determination logic.
109 dnl --------------------
110 dnl Check CC and friends
111 dnl --------------------
112 dnl note orig_cflags is also used further down
113 orig_cflags="$CFLAGS"
118 dnl remove autoconf default "-g -O2"
119 CFLAGS="$orig_cflags"
121 dnl NB: see C11 below
126 dnl autoconf 2.59 appears not to support AC_PROG_SED
128 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
130 dnl try and enable CFLAGS that are useful for FRR
131 dnl - specifically, options to control warnings
133 AC_USE_SYSTEM_EXTENSIONS
134 AC_DEFUN([AC_C_FLAG], [{
136 ac_c_flag_save="$CFLAGS"
138 AC_MSG_CHECKING([[whether $CC supports $1]])
140 [AC_LANG_PROGRAM([[]])],
143 m4_if([$3], [], [], [
144 CFLAGS="$ac_c_flag_save"
148 CFLAGS="$ac_c_flag_save"
155 AC_DEFUN([AC_LINK_IFELSE_FLAGS], [{
157 ac_cflags_save="$CFLAGS"
165 CFLAGS="$ac_cflags_save"
170 CFLAGS="$ac_cflags_save"
177 dnl ICC won't bail on unknown options without -diag-error 10006
178 dnl need to do this first so we get useful results for the other options
179 AC_C_FLAG([-diag-error 10006])
181 dnl AC_PROG_CC_C99 may change CC to include -std=gnu99 or something
183 CC="${CC% -std=gnu99}"
186 AC_C_FLAG([-std=gnu11], [CC="$ac_cc"], [CC="$CC -std=gnu11"])
188 dnl if the user has specified any CFLAGS, override our settings
189 if test "x${enable_dev_build}" = "xyes"; then
190 AC_DEFINE(DEV_BUILD,,Build for development)
191 if test "z$orig_cflags" = "z"; then
196 if test "z$orig_cflags" = "z"; then
203 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
204 AM_CONDITIONAL([SHARPD], [test "x$enable_dev_build" = "xyes"])
206 dnl always want these CFLAGS
207 AC_C_FLAG([-fno-omit-frame-pointer])
208 AC_C_FLAG([-funwind-tables])
211 AC_C_FLAG([-Wmissing-prototypes])
212 AC_C_FLAG([-Wmissing-declarations])
213 AC_C_FLAG([-Wpointer-arith])
214 AC_C_FLAG([-Wbad-function-cast])
215 AC_C_FLAG([-Wwrite-strings])
216 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
217 AC_C_FLAG([-Wcast-qual])
218 AC_C_FLAG([-Wstrict-prototypes])
219 AC_C_FLAG([-Wmissing-noreturn])
220 AC_C_FLAG([-Wmissing-format-attribute])
221 AC_C_FLAG([-Wunreachable-code])
222 AC_C_FLAG([-Wpacked])
223 AC_C_FLAG([-Wpadded])
225 AC_C_FLAG([-Wno-unused-result])
227 AC_C_FLAG([-Wno-unused-parameter])
228 AC_C_FLAG([-Wno-missing-field-initializers])
230 dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
231 dnl for some reason the string consts get 'promoted' to char *,
232 dnl triggering a const to non-const conversion warning.
233 AC_C_FLAG([-diag-disable 3179])
235 if test x"${enable_werror}" = x"yes" ; then
240 dnl need link on this one, not compile
242 ac_ld_flag_save="$LDFLAGS"
243 LDFLAGS="$LDFLAGS -rdynamic"
244 AC_MSG_CHECKING([[whether linker supports -rdynamic]])
246 [AC_LANG_PROGRAM([[]])],
247 [AC_MSG_RESULT([yes])],
249 LDFLAGS="$ac_ld_flag_save"
260 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
261 LIBS="$PTHREAD_LIBS $LIBS"
263 AC_MSG_FAILURE([This FRR version needs pthreads])
272 AC_CHECK_TOOL(AR, ar)
274 dnl -----------------
275 dnl System extensions
276 dnl -----------------
284 dnl ----------------------
285 dnl Packages configuration
286 dnl ----------------------
287 AC_ARG_WITH(pkg-extra-version,
288 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]),
289 [EXTRAVERSION=$withval],)
290 AC_ARG_WITH(pkg-git-version,
291 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
292 [ test "x$withval" != "xno" && with_pkg_git_version="yes" ])
293 AC_ARG_WITH(vtysh_pager,
294 AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
295 VTYSH_PAGER=$withval, VTYSH_PAGER="more")
297 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for FRR]))
299 AS_HELP_STRING([--disable-doc], [do not build docs]))
301 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
303 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
305 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
306 AC_ARG_ENABLE(ripngd,
307 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
309 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
310 AC_ARG_ENABLE(ospf6d,
311 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
313 AS_HELP_STRING([--enable-ldpd], [build ldpd]))
315 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
316 AC_ARG_ENABLE(eigrpd,
317 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
318 AC_ARG_ENABLE(babeld,
319 AS_HELP_STRING([--disable-babeld], [do not build babeld]))
320 AC_ARG_ENABLE(watchfrr,
321 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
323 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
325 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
326 AC_ARG_ENABLE(bgp-announce,
327 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
328 AC_ARG_ENABLE(bgp-vnc,
329 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
330 AC_ARG_WITH(rfp-path,
331 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
333 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
334 AC_ARG_ENABLE(zeromq,
335 AS_HELP_STRING([--enable-zeromq], [enable ZeroMQ handler (libfrrzmq)]))
337 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
338 AC_ARG_ENABLE(ospfapi,
339 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
340 AC_ARG_ENABLE(ospfclient,
341 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
342 (this is the default if --disable-ospfapi is set)]))
343 AC_ARG_ENABLE(multipath,
344 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
346 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
348 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
349 AC_ARG_ENABLE(vty_group,
350 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
351 AC_ARG_ENABLE(configfile_mask,
352 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
353 AC_ARG_ENABLE(logfile_mask,
354 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
355 AC_ARG_ENABLE(shell_access,
356 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
357 AC_ARG_ENABLE(realms,
358 AS_HELP_STRING([--enable-realms], [enable REALMS support under Linux]))
360 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
362 AS_HELP_STRING([--disable-irdp], [enable IRDP server support in zebra (default if supported)]))
363 AC_ARG_ENABLE(capabilities,
364 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
365 AC_ARG_ENABLE(rusage,
366 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
367 AC_ARG_ENABLE(gcc_ultra_verbose,
368 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
369 AC_ARG_ENABLE(linux24_tcp_md5,
370 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
371 AC_ARG_ENABLE(backtrace,
372 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
373 AC_ARG_ENABLE(time-check,
374 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
375 AC_ARG_ENABLE(pcreposix,
376 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
378 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
379 AC_ARG_ENABLE(systemd,
380 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
381 AC_ARG_ENABLE(werror,
382 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
383 AC_ARG_ENABLE(cumulus,
384 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
385 AC_ARG_ENABLE(datacenter,
386 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
387 AC_ARG_ENABLE(fuzzing,
388 AS_HELP_STRING([--enable-fuzzing], [enable ability to fuzz various parts of FRR]))
389 AC_ARG_ENABLE(rr-semantics,
390 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
391 AC_ARG_ENABLE([protobuf],
392 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
393 AC_ARG_ENABLE([oldvpn_commands],
394 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
396 AS_HELP_STRING([--enable-rpki], [enable RPKI prefix validation support]))
397 AC_ARG_ENABLE([clippy-only],
398 AS_HELP_STRING([--enable-clippy-only], [Only build clippy]))
399 AC_ARG_ENABLE([numeric_version],
400 AS_HELP_STRING([--enable-numeric-version], [Only numeric digits allowed in version (for Alpine)]))
402 AS_IF([test "${enable_clippy_only}" != "yes"], [
403 AC_CHECK_HEADERS(json-c/json.h)
404 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c", [], [-lm])
405 if test $ac_cv_lib_json_c_json_object_get = no; then
406 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
407 if test $ac_cv_lib_json_json_object_get = no; then
408 AC_MSG_ERROR([lib json is needed to compile])
413 AC_ARG_ENABLE([dev_build],
414 AS_HELP_STRING([--enable-dev-build], [build for development]))
416 if test x"${enable_time_check}" != x"no" ; then
417 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
418 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
420 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
424 case "${enable_systemd}" in
427 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
428 if test $ac_cv_lib_systemd_sd_notify = no; then
429 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
431 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
437 if test "${enable_rr_semantics}" != "no" ; then
438 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
441 if test "${enable_datacenter}" = "yes" ; then
442 AC_DEFINE(HAVE_DATACENTER,,Compile extensions for a DataCenter)
443 DFLT_NAME="datacenter"
445 DFLT_NAME="traditional"
448 if test "${enable_fuzzing}" = "yes" ; then
449 AC_DEFINE(HANDLE_ZAPI_FUZZING,,Compile extensions to use with a fuzzer)
452 if test "${enable_cumulus}" = "yes" ; then
453 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
457 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
459 if test "${enable_shell_access}" = "yes"; then
460 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
463 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
468 AS_IF([test "$host" = "$build"], [
472 # 1. try python3, but respect the user's preference on which minor ver
473 # 2. try python, which might be py3 or py2 again on the user's preference
474 # 3. try python2 (can really only be 2.7 but eh)
475 # 4. try 3.5 > 3.4 > 3.3 > 3.2 > 2.7 through pkg-config (no user pref)
477 # (AX_PYTHON_DEVEL has no clue about py3 vs py2)
478 # (AX_PYTHON does not do what we need)
480 AC_CHECK_TOOLS([PYTHONCONFIG], [python3-config python-config python2-config])
481 if test -n "$PYTHONCONFIG"; then
482 PYTHON_CFLAGS="`\"${PYTHONCONFIG}\" --includes`"
483 PYTHON_LIBS="`\"${PYTHONCONFIG}\" --libs`"
485 AC_MSG_CHECKING([whether we found a working Python version])
486 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
488 #if PY_VERSION_HEX < 0x02070000
489 #error python too old
505 if test -z "$PYTHONCONFIG"; then
506 PKG_CHECK_MODULES([PYTHON], python-3.5, [], [
507 PKG_CHECK_MODULES([PYTHON], python-3.4, [], [
508 PKG_CHECK_MODULES([PYTHON], python-3.3, [], [
509 PKG_CHECK_MODULES([PYTHON], python-3.2, [], [
510 PKG_CHECK_MODULES([PYTHON], python-2.7, [], [
511 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
515 AC_MSG_CHECKING([whether we found a working Python version])
516 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
518 #if PY_VERSION_HEX < 0x02070000
519 #error python too old
529 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
533 AC_SUBST(PYTHON_CFLAGS)
534 AC_SUBST(PYTHON_LIBS)
537 # Logic for protobuf support.
539 if test "$enable_protobuf" = "yes"; then
543 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
544 if test "x$PROTOC_C" = "x/bin/false"; then
548 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
549 [found_protobuf_c=yes],
550 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
552 if test "x$found_protobuf_c" = "xyes"; then
553 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
554 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
556 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
557 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
563 # Logic for old vpn commans support.
565 if test "$enable_oldvpn_commands" = "yes"; then
566 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
569 # Fail if the user explicity enabled protobuf support and we couldn't
570 # find the compiler or libraries.
571 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
572 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
575 if test "x$have_protobuf" = "xyes"; then
576 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
579 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
582 # End of logic for protobuf support.
585 if test "${enable_linux24_tcp_md5}" = "yes"; then
586 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
589 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
590 if test "${enable_rtadv}" != "no"; then
592 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
597 if test x"${enable_user}" = x"no"; then
600 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
603 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
606 if test x"${enable_group}" = x"no"; then
609 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
612 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
615 if test x"${enable_vty_group}" = x"yes" ; then
616 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
617 elif test x"${enable_vty_group}" != x""; then
618 if test x"${enable_vty_group}" != x"no"; then
619 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
622 AC_SUBST([enable_user])
623 AC_SUBST([enable_group])
624 AC_SUBST([enable_vty_group])
626 enable_configfile_mask=${enable_configfile_mask:-0600}
627 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
629 enable_logfile_mask=${enable_logfile_mask:-0600}
630 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
634 case "${enable_multipath}" in
638 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
639 MPATH_NUM="${enable_multipath}"
644 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
648 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
650 AC_DEFINE_UNQUOTED(VTYSH_PAGER, "$VTYSH_PAGER", [What pager to use])
652 dnl ------------------------------------
653 dnl Alpine only accepts numeric versions
654 dnl ------------------------------------
655 if test "x${enable_numeric_version}" != "x" ; then
656 VERSION="`echo ${VERSION} | tr -c -d '[[.0-9]]'`"
657 PACKAGE_VERSION="`echo ${PACKAGE_VERSION} | tr -c -d '[[.0-9]]'`"
660 dnl -----------------------------------
661 dnl Add extra version string to package
662 dnl name, string and version fields.
663 dnl -----------------------------------
664 if test "x${EXTRAVERSION}" != "x" ; then
665 VERSION="${VERSION}${EXTRAVERSION}"
666 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
667 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
668 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
671 if test "x$with_pkg_git_version" = "xyes"; then
672 if test -d "${srcdir}/.git"; then
673 AC_DEFINE(GIT_VERSION, [1], [include git version info])
674 else with_pkg_git_version="no"
675 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
678 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
680 dnl ------------------------------------
681 dnl Check C keywords and standard types
682 dnl ------------------------------------
693 dnl -------------------------
694 dnl Check other header files.
695 dnl -------------------------
696 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
697 linux/version.h asm/types.h \
700 ac_stdatomic_ok=false
701 AC_DEFINE(FRR_AUTOCONF_ATOMIC, 1, [did autoconf checks for atomic funcs])
702 AC_CHECK_HEADER([stdatomic.h],[
704 AC_MSG_CHECKING([whether _Atomic qualifier works])
705 AC_LINK_IFELSE([AC_LANG_SOURCE([[
706 #include <stdatomic.h>
707 int main(int argc, char **argv) {
712 AC_DEFINE(HAVE_STDATOMIC_H, 1, [found stdatomic.h])
720 AS_IF([$ac_stdatomic_ok], [true], [
721 AC_MSG_CHECKING([for __atomic_* builtins])
722 AC_LINK_IFELSE([AC_LANG_SOURCE([[
723 int main(int argc, char **argv) {
725 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
726 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
729 AC_DEFINE(HAVE___ATOMIC, 1, [found __atomic builtins])
734 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
735 AC_MSG_CHECKING([for __sync_* builtins])
736 AC_LINK_IFELSE([AC_LANG_SOURCE([[
737 int main(int argc, char **argv) {
739 __sync_fetch_and_sub (&i, 1);
740 return __sync_val_compare_and_swap (&i, 0, 1);
743 AC_DEFINE(HAVE___SYNC, 1, [found __sync builtins])
746 AC_MSG_CHECKING([for __sync_swap builtin])
747 AC_LINK_IFELSE([AC_LANG_SOURCE([[
748 int main(int argc, char **argv) {
750 return __sync_swap (&i, 2);
753 AC_DEFINE(HAVE___SYNC_SWAP, 1, [found __sync_swap builtin])
761 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
766 dnl Utility macro to avoid retyping includes all the time
767 m4_define([FRR_INCLUDES],
770 #define __EXTENSIONS__
775 #include <sys/types.h>
776 /* sys/conf.h depends on param.h on FBSD at least */
777 #include <sys/param.h>
778 /* Required for MAXSIG */
780 #include <sys/socket.h>
782 # define __APPLE_USE_RFC_3542
784 #include <netinet/in.h>
785 #include <sys/time.h>
790 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
791 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
792 dnl an additional round for it.
794 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
796 m4_define([FRR_INCLUDES],
798 [#if HAVE_NET_IF_VAR_H
799 # include <net/if_var.h>
803 AC_CHECK_HEADERS([netinet/in_var.h \
804 net/if_dl.h net/netopt.h \
805 inet/nd.h netinet/ip_icmp.h \
806 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
807 [], [], FRR_INCLUDES)
809 AC_CHECK_HEADERS([ucontext.h], [], [],
812 #endif /* __USE_GNU */
816 m4_define([UCONTEXT_INCLUDES],
817 [#include <ucontext.h>])dnl
819 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
820 [], [], [UCONTEXT_INCLUDES])
821 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
822 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
823 [], [], [UCONTEXT_INCLUDES])],
824 [], [UCONTEXT_INCLUDES])
825 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
826 [], [], [UCONTEXT_INCLUDES])
828 m4_define([FRR_INCLUDES],
832 #include <netinet/in_systm.h>
833 #if HAVE_NETINET_IN_VAR_H
834 # include <netinet/in_var.h>
837 # include <net/if_dl.h>
839 #if HAVE_NET_NETOPT_H
840 # include <net/netopt.h>
842 #include <net/route.h>
844 # include <inet/nd.h>
846 #include <arpa/inet.h>
847 /* Required for IDRP */
848 #if HAVE_NETINET_IP_ICMP_H
849 # include <netinet/ip_icmp.h>
853 dnl V6 headers are checked below, after we check for v6
855 AC_MSG_CHECKING([which operating system interface to use])
858 AC_MSG_RESULT([Solaris])
860 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
861 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
863 AC_CHECK_LIB(socket, main)
864 AC_CHECK_LIB(nsl, main)
865 AC_CHECK_LIB(umem, main)
866 AC_CHECK_FUNCS([printstack], [
867 AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
868 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
874 AC_MSG_RESULT([Linux])
876 AC_DEFINE(GNU_LINUX,,GNU Linux)
877 AC_DEFINE(HAVE_NETLINK,,netlink)
878 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
880 dnl Linux has a compilation problem with mixing
881 dnl netinet/in.h and linux/in6.h they are not
882 dnl compatible. There has been discussion on
883 dnl how to fix it but no real progress on implementation
884 dnl when they fix it, remove this
885 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
887 AC_CHECK_DECLS([IFLA_INFO_SLAVE_KIND], [], [], [#include <linux/if_link.h>])
890 AC_MSG_RESULT([OpenBSD])
892 AC_DEFINE(OPEN_BSD,,OpenBSD)
893 AC_DEFINE(KAME,1,KAME IPv6)
894 AC_DEFINE(BSD_V6_SYSCTL,1,BSD v6 sysctl to turn on and off forwarding)
896 if test "x${enable_pimd}" != "xno"; then
901 AC_MSG_FAILURE([pimd cannot be enabled as PIM support has been removed from OpenBSD 6.1])
909 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
910 AC_DEFINE(KAME,1,KAME IPv6)
911 AC_DEFINE(BSD_V6_SYSCTL,1,BSD v6 sysctl to turn on and off forwarding)
914 AM_CONDITIONAL(SOLARIS, test "${SOLARIS}" = "solaris")
918 dnl ------------------------
919 dnl Integrated REALMS option
920 dnl ------------------------
921 if test "${enable_realms}" = "yes"; then
924 AC_DEFINE(SUPPORT_REALMS,, Realms support)
927 echo "Sorry, only Linux has REALMS support"
932 AM_CONDITIONAL([SUPPORT_REALMS], [test "${enable_realms}" = "yes"])
934 dnl ---------------------
935 dnl Integrated VTY option
936 dnl ---------------------
937 case "${enable_vtysh}" in
940 AC_DEFINE(VTYSH,,VTY shell)
941 dnl Vtysh uses libreadline, which looks for termcap functions at
942 dnl configure time. We follow readlines search order.
943 dnl The required procedures are in libtermcap on NetBSD, in
944 dnl [TODO] on Linux, and in [TODO] on Solaris.
945 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
946 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
947 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
948 [AC_CHECK_LIB(ncurses, tputs,
949 LIBREADLINE="$LIBREADLINE -lncurses")]
953 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
955 if test $ac_cv_lib_readline_main = no; then
956 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
958 AC_CHECK_HEADER(readline/history.h)
959 if test $ac_cv_header_readline_history_h = no;then
960 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
962 AC_CHECK_LIB(readline, rl_completion_matches,
963 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
964 if test $ac_cv_lib_readline_rl_completion_matches = no; then
965 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
969 AC_SUBST(LIBREADLINE)
970 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
975 dnl FRR detects the PAM library it is built against by checking for a
976 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
977 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
978 dnl openpam.h doesn't do that, although depends on the header too. Hence a
979 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
982 if test "$with_libpam" = "yes"; then
983 AC_CHECK_HEADER([security/pam_misc.h],
984 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
985 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
986 pam_conv_func="misc_conv"
989 AC_CHECK_HEADER([security/openpam.h],
990 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
991 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
992 pam_conv_func="openpam_ttyconv"
994 [], FRR_INCLUDES[#include <security/pam_appl.h>])
995 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
996 AC_MSG_WARN([*** pam support will not be built ***])
1001 if test "$with_libpam" = "yes"; then
1002 dnl took this test from proftpds configure.in and suited to our needs
1003 dnl -------------------------------------------------------------------------
1005 dnl This next check looks funky due to a linker problem with some versions
1006 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
1007 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
1008 dnl with RedHat 6.2 and Debian 2.2 or better.
1009 AC_CHECK_LIB(pam, pam_start,
1010 [AC_CHECK_LIB(pam, $pam_conv_func,
1011 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1013 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1014 LIBPAM="-lpam -lpam_misc"]
1018 [AC_CHECK_LIB(pam, pam_end,
1019 [AC_CHECK_LIB(pam, $pam_conv_func,
1020 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1021 LIBPAM="-lpam -ldl"],
1022 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1023 LIBPAM="-lpam -ldl -lpam_misc"]
1025 ],AC_MSG_WARN([*** pam support will not be built ***]),
1032 dnl -------------------------------
1033 dnl Endian-ness check
1034 dnl -------------------------------
1037 dnl -------------------------------
1038 dnl check the size in byte of the C
1039 dnl -------------------------------
1040 dnl AC_CHECK_SIZEOF(char)
1041 dnl AC_CHECK_SIZEOF(int)
1042 dnl AC_CHECK_SIZEOF(short)
1043 dnl AC_CHECK_SIZEOF(long)
1045 dnl ----------------------------
1046 dnl check existance of functions
1047 dnl ----------------------------
1053 dnl -------------------------------
1054 dnl bgpd needs pow() and hence libm
1055 dnl -------------------------------
1057 AC_CHECK_HEADER([math.h],
1058 [AC_CHECK_LIB([m], [pow],
1061 AC_CHECK_FUNCS(pow,[],[LIBM=""])
1064 if test x"$LIBM" = x ; then
1065 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1070 AC_CHECK_FUNCS([ppoll], [
1071 AC_DEFINE([HAVE_PPOLL], 1, [have Linux/BSD ppoll()])
1073 AC_CHECK_FUNCS([pollts], [
1074 AC_DEFINE([HAVE_POLLTS], 1, [have NetBSD pollts()])
1084 AC_CHECK_HEADER([asm-generic/unistd.h],
1085 [AC_CHECK_DECL(__NR_setns,
1086 AC_DEFINE(HAVE_NETNS,, Have netns),,
1087 FRR_INCLUDES [#include <asm-generic/unistd.h>
1089 AC_CHECK_FUNCS(setns)]
1092 dnl --------------------------
1093 dnl Determine IS-IS I/O method
1094 dnl --------------------------
1095 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
1096 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
1097 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
1098 AC_CHECK_HEADER(net/bpf.h)
1099 AC_CHECK_HEADER(sys/dlpi.h)
1100 AC_MSG_CHECKING(zebra IS-IS I/O method)
1104 AC_MSG_RESULT(pfpacket)
1105 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1109 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1112 if test $ac_cv_header_net_bpf_h = no; then
1113 if test $ac_cv_header_sys_dlpi_h = no; then
1115 if test "${enable_isisd}" = yes; then
1116 AC_MSG_FAILURE([IS-IS support requested but no packet backend found])
1118 AC_MSG_WARN([*** IS-IS support will not be built ***])
1123 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1126 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
1130 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
1132 dnl ------------------------------------
1133 dnl check for broken CMSG_FIRSTHDR macro
1134 dnl ------------------------------------
1135 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
1136 AC_RUN_IFELSE([AC_LANG_SOURCE([[
1139 #define __EXTENSIONS__
1142 #include <sys/types.h>
1143 #include <sys/socket.h>
1150 msg.msg_control = buf;
1151 msg.msg_controllen = 0;
1153 if (CMSG_FIRSTHDR(&msg) != NULL)
1156 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
1157 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
1159 dnl ---------------------------------------------------------------
1160 dnl figure out how to specify an interface in multicast sockets API
1161 dnl ---------------------------------------------------------------
1162 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1164 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1165 #include <sys/socket.h>
1166 #include <netinet/in.h>
1167 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1168 #include <linux/types.h>
1171 m4_define([FRR_INCLUDES],
1173 [#if HAVE_LINUX_MROUTE_H
1174 # include <linux/mroute.h>
1178 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1179 #include <sys/socket.h>
1180 #include <sys/types.h>
1181 #include <netinet/in.h>
1182 #include <net/route.h>
1185 m4_define([FRR_INCLUDES],
1187 [#if HAVE_NETINET_IP_MROUTE_H
1188 # include <netinet/ip_mroute.h>
1192 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1193 AC_TRY_COMPILE([#include <sys/param.h>],
1194 [#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)
1197 #error No support for BSD struct ip_mreq hack detected
1198 #endif],[AC_MSG_RESULT(yes)
1199 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1202 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1204 #include <sys/types.h>
1205 #include <netinet/in.h>
1206 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1207 ], [AC_MSG_RESULT(yes)
1208 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1211 dnl ---------------------------------------------------------------
1212 dnl figure out how to check link-state
1213 dnl ---------------------------------------------------------------
1214 AC_CHECK_HEADER( [net/if_media.h],
1215 [m4_define([LINK_DETECT_INCLUDES],
1217 [#include <net/if_media.h>
1219 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1220 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1221 [], LINK_DETECT_INCLUDES)],
1225 dnl ---------------------------------------------------------------
1226 dnl Additional, newer way to check link-state using ifi_link_state.
1227 dnl Not available in all BSD's when ifmediareq available
1228 dnl ---------------------------------------------------------------
1229 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1230 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1233 dnl ------------------------
1234 dnl TCP_MD5SIG socket option
1235 dnl ------------------------
1237 AC_CHECK_HEADER([netinet/tcp.h],
1238 [m4_define([MD5_INCLUDES],
1240 [#include <netinet/tcp.h>
1242 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1245 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1246 AC_CHECK_HEADER([linux/tcp.h],
1247 [m4_define([MD5_INCLUDES],
1249 [#include <linux/tcp.h>
1251 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1254 dnl ----------------------------------------------------------------------------
1255 dnl figure out if domainname is available in the utsname struct (GNU extension).
1256 dnl ----------------------------------------------------------------------------
1257 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1259 dnl ------------------
1260 dnl IPv6 header checks
1261 dnl ------------------
1262 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1263 netinet6/in6_var.h netinet6/nd6.h], [], [],
1266 m4_define([FRR_INCLUDES],dnl
1268 [#if HAVE_NETINET6_IN6_H
1269 #include <netinet6/in6.h>
1271 #if HAVE_NETINET_IN6_VAR_H
1272 #include <netinet/in6_var.h>
1274 #include <netinet/icmp6.h>
1275 #if HAVE_NETINET6_IN6_VAR_H
1276 # include <netinet6/in6_var.h>
1278 #if HAVE_NETINET6_ND6_H
1279 # include <netinet6/nd6.h>
1283 dnl disable doc check
1284 if test "${enable_doc}" = "no";then
1290 dnl --------------------
1291 dnl Daemon disable check
1292 dnl --------------------
1293 AM_CONDITIONAL(ZEBRA, test "${enable_zebra}" != "no")
1295 if test "${enable_bgpd}" = "no";then
1300 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1302 AM_CONDITIONAL(RIPD, test "${enable_ripd}" != "no")
1303 AM_CONDITIONAL(OSPFD, test "${enable_ospfd}" != "no")
1304 AM_CONDITIONAL(LDPD, test "${enable_ldpd}" != "no")
1306 AS_IF([test "${enable_ldpd}" != "no"], [
1307 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1313 if test "${enable_nhrpd}" != "no"; then
1318 if test "${enable_nhrpd}" = "yes"; then
1319 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1323 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1325 AM_CONDITIONAL(EIGRPD, test "${enable_eigrpd}" != "no")
1327 if test "${enable_watchfrr}" = "no";then
1332 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1335 if test "${enable_ospfapi}" != "no";then
1336 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1338 if test "${enable_ospfclient}" != "no";then
1339 OSPFCLIENT="ospfclient"
1343 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1344 AM_CONDITIONAL(RIPNGD, test "${enable_ripngd}" != "no")
1345 AM_CONDITIONAL(BABELD, test "${enable_babeld}" != "no")
1346 AM_CONDITIONAL(OSPF6D, test "${enable_ospf6d}" != "no")
1347 AM_CONDITIONAL(ISISD, test "${enable_isisd}" != "no")
1348 AM_CONDITIONAL(PIMD, test "${enable_pimd}" != "no")
1350 if test "${enable_bgp_announce}" = "no";then
1351 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1353 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1356 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1357 with_rfp_path="bgpd/rfp-example"
1359 if test "${with_rfp_path}" != "no"; then
1360 VNC_RFP_PATH="${with_rfp_path}"
1361 AC_SUBST(VNC_RFP_PATH)
1364 if test "${enable_bgp_vnc}" != "no";then
1365 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1366 RFPTEST="${with_rfp_path}/rfptest"
1367 LIBRFP="${with_rfp_path}/librfp"
1368 RFPINC="${with_rfp_path}/librfp"
1372 RFPINC="bgpd/rfp-example/librfp"
1375 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1385 AC_CHECK_LIB(crypt, crypt, [],
1386 [AC_CHECK_LIB(crypto, DES_crypt)])
1387 AC_CHECK_LIB(resolv, res_init)
1389 dnl ---------------------------
1390 dnl check system has PCRE regexp
1391 dnl ---------------------------
1392 if test "x$enable_pcreposix" = "xyes"; then
1393 AC_CHECK_LIB(pcreposix, regexec, [], [
1394 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1397 AC_SUBST(HAVE_LIBPCREPOSIX)
1399 dnl ------------------
1400 dnl check C-Ares library
1401 dnl ------------------
1402 if test "${NHRPD}" != ""; then
1403 PKG_CHECK_MODULES([CARES], [libcares], , [
1404 AC_MSG_ERROR([trying to build nhrpd, but libcares not found. install c-ares and its -dev headers.])
1409 dnl ------------------
1410 dnl check Net-SNMP library
1411 dnl ------------------
1412 if test "${enable_snmp}" != "" -a "${enable_snmp}" != "no"; then
1413 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1414 if test x"$NETSNMP_CONFIG" = x"no"; then
1415 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1417 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1418 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1419 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1420 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
1428 AC_MSG_ERROR([--enable-snmp given but not usable])])
1429 case "${enable_snmp}" in
1434 SNMP_METHOD="${enable_snmp}"
1437 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1440 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1441 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1442 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1444 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1446 AC_SUBST(SNMP_CFLAGS)
1451 AC_SEARCH_LIBS([sqrt], [m])
1456 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1457 AC_MSG_ERROR([unable to find the dlopen()])
1460 AC_CHECK_HEADERS([link.h])
1462 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1463 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1471 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1474 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1479 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1480 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1487 struct link_map *lm = NULL;
1488 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1491 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1497 AM_CONDITIONAL(SNMP, test "x$SNMP_METHOD" = "xagentx")
1499 dnl ---------------------------
1500 dnl sockaddr and netinet checks
1501 dnl ---------------------------
1504 struct vifctl, struct mfcctl, struct sioc_sg_req,
1505 vifi_t, struct sioc_vif_req, struct igmpmsg,
1506 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1507 struct nd_opt_adv_interval, struct rt_addrinfo,
1508 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1509 [], [], FRR_INCLUDES)
1511 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1512 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1513 struct sockaddr_dl.sdl_len,
1514 struct if6_aliasreq.ifra_lifetime,
1515 struct nd_opt_adv_interval.nd_opt_ai_type],
1516 [], [], FRR_INCLUDES)
1518 dnl ---------------------------
1519 dnl IRDP/pktinfo/icmphdr checks
1520 dnl ---------------------------
1522 AC_CHECK_TYPES([struct in_pktinfo], [
1523 AC_CHECK_TYPES([struct icmphdr], [
1532 case "${enable_irdp}" in
1534 $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1541 AM_CONDITIONAL(IRDP, $IRDP)
1543 dnl -----------------------
1544 dnl checking for IP_PKTINFO
1545 dnl -----------------------
1546 AC_MSG_CHECKING(for IP_PKTINFO)
1547 AC_TRY_COMPILE([#include <netdb.h>], [
1548 int opt = IP_PKTINFO;
1551 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1556 dnl ---------------------------
1557 dnl checking for IP_RECVDSTADDR
1558 dnl ---------------------------
1559 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1560 AC_TRY_COMPILE([#include <netinet/in.h>], [
1561 int opt = IP_RECVDSTADDR;
1564 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1569 dnl ----------------------
1570 dnl checking for IP_RECVIF
1571 dnl ----------------------
1572 AC_MSG_CHECKING(for IP_RECVIF)
1573 AC_TRY_COMPILE([#include <netinet/in.h>], [
1574 int opt = IP_RECVIF;
1577 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1582 dnl ----------------------
1583 dnl checking for SO_BINDANY
1584 dnl ----------------------
1585 AC_MSG_CHECKING(for SO_BINDANY)
1586 AC_TRY_COMPILE([#include <sys/socket.h>], [
1587 int opt = SO_BINDANY;
1590 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1595 dnl ----------------------
1596 dnl checking for IP_FREEBIND
1597 dnl ----------------------
1598 AC_MSG_CHECKING(for IP_FREEBIND)
1599 AC_TRY_COMPILE([#include <netinet/in.h>], [
1600 int opt = IP_FREEBIND;
1603 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1608 dnl --------------------------------------
1609 dnl checking for be32dec existence or not
1610 dnl --------------------------------------
1611 AC_CHECK_DECLS([be32enc, be32dec], [], [],
1612 [#include <sys/endian.h>])
1614 dnl --------------------------------------
1615 dnl checking for clock_time monotonic struct and call
1616 dnl --------------------------------------
1617 AC_CHECK_DECL(CLOCK_MONOTONIC,
1618 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1619 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1620 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1622 dnl --------------------------------------
1623 dnl checking for flex and bison
1624 dnl --------------------------------------
1627 AC_MSG_CHECKING(version of flex)
1628 frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1629 frr_ac_flex_version="${frr_ac_flex_version##* }"
1630 AC_MSG_RESULT([$frr_ac_flex_version])
1631 AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
1632 LEX="$SHELL $missing_dir/missing flex"
1633 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1634 AC_MSG_WARN([using pregenerated flex output files])
1636 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1638 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1639 AC_SUBST([LEXLIB], [''])
1643 dnl thanks GNU bison for this b*llshit...
1644 AC_MSG_CHECKING(version of bison)
1645 frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1646 frr_ac_bison_version="${frr_ac_bison_version##* }"
1647 frr_ac_bison_missing="false"
1648 case "x${frr_ac_bison_version}" in
1651 BISON_CLOSEBRACE='"'
1653 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
1656 AC_MSG_RESULT([$frr_ac_bison_version])
1657 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1658 frr_ac_bison_missing="true"
1661 AC_MSG_RESULT([none])
1662 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1663 frr_ac_bison_missing="true"
1667 BISON_CLOSEBRACE='}'
1668 BISON_VERBOSE='-Dparse.error=verbose'
1669 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 or newer])
1672 AC_SUBST(BISON_OPENBRACE)
1673 AC_SUBST(BISON_CLOSEBRACE)
1674 AC_SUBST(BISON_VERBOSE)
1676 if $frr_ac_bison_missing; then
1677 YACC="$SHELL $missing_dir/missing bison -y"
1678 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1679 AC_MSG_WARN([using pregenerated bison output files])
1681 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1685 dnl -------------------
1686 dnl capabilities checks
1687 dnl -------------------
1688 if test "${enable_capabilities}" != "no"; then
1689 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1690 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1692 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1693 frr_ac_keepcaps="yes"],
1696 if test x"${frr_ac_keepcaps}" = x"yes"; then
1697 AC_CHECK_HEADERS(sys/capability.h)
1699 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1700 AC_CHECK_LIB(cap, cap_init,
1701 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1706 AC_CHECK_HEADERS(priv.h,
1707 [AC_MSG_CHECKING(Solaris style privileges are available)
1708 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1710 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1711 frr_ac_scaps="yes"],
1717 if test x"${frr_ac_scaps}" = x"yes" \
1718 -o x"${frr_ac_lcaps}" = x"yes"; then
1719 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1724 dnl ---------------------------
1725 dnl check for glibc 'backtrace'
1726 dnl ---------------------------
1727 if test x"${enable_backtrace}" != x"no" ; then
1729 AC_CHECK_HEADER([execinfo.h], [
1730 AC_SEARCH_LIBS([backtrace], [execinfo], [
1731 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1732 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1737 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1738 dnl user explicitly requested backtrace but we failed to find support
1739 AC_MSG_FAILURE([failed to find backtrace support])
1743 dnl -----------------------------------------
1744 dnl check for malloc mallinfo struct and call
1745 dnl this must try and link using LIBS, in
1746 dnl order to check no alternative allocator
1747 dnl has been specified, which might not provide
1748 dnl mallinfo, e.g. such as Umem on Solaris.
1749 dnl -----------------------------------------
1750 AC_CHECK_HEADER([malloc.h],
1751 [AC_MSG_CHECKING(whether mallinfo is available)
1752 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1753 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1755 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1758 ], [], FRR_INCLUDES)
1763 if test "x$enable_zeromq" != "xno"; then
1764 PKG_CHECK_MODULES(ZEROMQ, [libzmq >= 4.0.0], [
1765 AC_DEFINE(HAVE_ZEROMQ, 1, [Enable ZeroMQ support])
1768 if test "x$enable_zeromq" = "xyes"; then
1769 AC_MSG_ERROR([configuration specifies --enable-zeromq but libzmq was not found])
1773 AM_CONDITIONAL([ZEROMQ], test "x$ZEROMQ" = "xtrue")
1778 CONFDATE=`date '+%Y%m%d'`
1781 dnl ------------------------------
1782 dnl set paths for state directory
1783 dnl ------------------------------
1784 AC_MSG_CHECKING(directory to use for state file)
1785 if test "${prefix}" = "NONE"; then
1786 frr_statedir_prefix="";
1788 frr_statedir_prefix=${prefix}
1790 if test "${localstatedir}" = '${prefix}/var'; then
1791 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1792 ${frr_statedir_prefix}/var/adm dnl
1793 ${frr_statedir_prefix}/etc dnl
1799 test -d $FRR_STATE_DIR && break
1801 frr_statedir=$FRR_STATE_DIR
1803 frr_statedir=${localstatedir}
1805 if test $frr_statedir = "/dev/null"; then
1806 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1808 AC_MSG_RESULT(${frr_statedir})
1809 AC_SUBST(frr_statedir)
1811 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1812 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1813 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1815 dnl autoconf does this, but it does it too late...
1816 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1817 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1819 dnl get the full path, recursing through variables...
1820 vtysh_bin="$bindir/vtysh"
1821 for I in 1 2 3 4 5 6 7 8 9 10; do
1822 eval vtysh_bin="\"$vtysh_bin\""
1824 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1826 CFG_SYSCONF="$sysconfdir"
1828 CFG_STATE="$frr_statedir"
1829 CFG_MODULE="$moduledir"
1830 for I in 1 2 3 4 5 6 7 8 9 10; do
1831 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1832 eval CFG_SBIN="\"$CFG_SBIN\""
1833 eval CFG_STATE="\"$CFG_STATE\""
1834 eval CFG_MODULE="\"$CFG_MODULE\""
1836 AC_SUBST(CFG_SYSCONF)
1839 AC_SUBST(CFG_MODULE)
1840 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1842 dnl ------------------------------------
1843 dnl Enable RPKI and add librtr to libs
1844 dnl ------------------------------------
1845 if test "${enable_rpki}" = "yes"; then
1846 PKG_CHECK_MODULES(RTRLIB,[rtrlib >= 0.5.0],
1847 [AC_DEFINE(HAVE_RPKI,1,Enable RPKI prefix validation for BGP)
1850 AC_MSG_ERROR([rtrlib was not found on your system or is too old.])]
1853 AM_CONDITIONAL([RPKI], test "x$RPKI" = "xtrue")
1855 dnl ------------------------------------------
1856 dnl Check whether rtrlib was build with ssh support
1857 dnl ------------------------------------------
1858 AC_MSG_CHECKING([whether the RTR Library is compiled with SSH])
1859 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "rtrlib/rtrlib.h"]],
1860 [[struct tr_ssh_config config;]])],
1862 AC_DEFINE(FOUND_SSH,,found_ssh)],
1866 dnl ---------------------------
1867 dnl Check htonl works correctly
1868 dnl ---------------------------
1869 AC_MSG_CHECKING(for working htonl)
1870 AC_CACHE_VAL(ac_cv_htonl_works,
1871 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1872 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1875 AC_MSG_RESULT($ac_cv_htonl_works)
1877 AC_CONFIG_FILES([Makefile
1880 doc/Makefile tests/Makefile
1881 bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile
1886 snapcraft/snapcraft.yaml
1888 tests/lib/cli/test_cli.refout
1889 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1890 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1893 if test "${enable_bgp_vnc}" != "no"; then
1894 if test "${with_rfp_path}" != "bgpd/rfp-example" ; then
1895 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1899 AC_CONFIG_FILES([solaris/Makefile])
1901 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1903 AC_CONFIG_COMMANDS([lib/route_types.h], [
1904 dst="${ac_abs_top_builddir}/lib/route_types.h"
1905 ${PERL} "${ac_abs_top_srcdir}/lib/route_types.pl" \
1906 < "${ac_abs_top_srcdir}/lib/route_types.txt" \
1909 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
1910 && rm "${dst}.tmp" \
1911 || mv "${dst}.tmp" "${dst}"
1916 AS_IF([test "x$with_pkg_git_version" = "xyes"], [
1917 AC_CONFIG_COMMANDS([lib/gitversion.h], [
1918 dst="${ac_abs_top_builddir}/lib/gitversion.h"
1919 ${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
1920 "${ac_abs_top_srcdir}" \
1923 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
1924 && rm "${dst}.tmp" \
1925 || mv "${dst}.tmp" "${dst}"
1931 ## Hack, but working solution to avoid rebuilding of frr.info.
1932 ## It's already in CVS until texinfo 4.7 is more common.
1936 FRRouting configuration
1937 ------------------------------
1938 FRR version : ${PACKAGE_VERSION}
1939 host operating system : ${host_os}
1940 source code location : ${srcdir}
1942 compiler flags : ${CFLAGS}
1944 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1945 state file directory : ${frr_statedir}
1946 config file directory : `eval echo \`echo ${sysconfdir}\``
1947 example directory : `eval echo \`echo ${exampledir}\``
1948 module directory : ${CFG_MODULE}
1949 user to run as : ${enable_user}
1950 group to run as : ${enable_group}
1951 group for vty sockets : ${enable_vty_group}
1952 config file mask : ${enable_configfile_mask}
1953 log file mask : ${enable_logfile_mask}
1954 zebra protobuf enabled : ${have_protobuf:-no}
1956 The above user and group must have read/write access to the state file
1957 directory and to the config files in the config file directory."