]> git.proxmox.com Git - mirror_frr.git/blame_incremental - configure.ac
mgmtd: Add MGMT Backend Interface Framework
[mirror_frr.git] / configure.ac
... / ...
CommitLineData
1##
2## Configure template file for FRRouting.
3## autoconf will generate a configure script.
4##
5## Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
6## Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
7##
8AC_PREREQ([2.69])
9
10AC_INIT([frr], [9.0-dev], [https://github.com/frrouting/frr/issues])
11PACKAGE_URL="https://frrouting.org/"
12AC_SUBST([PACKAGE_URL])
13PACKAGE_FULLNAME="FRRouting"
14AC_SUBST([PACKAGE_FULLNAME])
15
16CONFIG_ARGS="`echo $ac_configure_args | sed -e \"s% '[[A-Z]]*FLAGS=[[^']]\+'%%g\"`"
17AC_SUBST([CONFIG_ARGS])
18
19AC_CONFIG_SRCDIR([lib/zebra.h])
20AC_CONFIG_MACRO_DIR([m4])
21AC_CONFIG_AUX_DIR([m4/ac])
22
23dnl -----------------------------------
24dnl Get hostname and other information.
25dnl -----------------------------------
26AC_CANONICAL_BUILD()
27AC_CANONICAL_HOST()
28
29AC_ARG_VAR([AR],[archiver command])
30AC_ARG_VAR([LD],[linker command])
31AC_ARG_VAR([OBJCOPY],[objcopy command])
32AC_ARG_VAR([OBJDUMP],[objdump command])
33AC_ARG_VAR([RANLIB],[ranlib command])
34AC_ARG_VAR([STRIP],[strip command])
35
36hosttools_clippy="false"
37build_clippy="true"
38
39dnl case 1: external clippy
40if test -n "$with_clippy" -a "$with_clippy" != "no" -a "$with_clippy" != "yes"; then
41 if test "$enable_clippy_only" = "yes"; then
42 AC_MSG_ERROR([--enable-clippy-only does not make sense with --with-clippy])
43 fi
44
45 CLIPPY="$with_clippy"
46 build_clippy="false"
47 if test ! -x "$with_clippy"; then
48 AC_MSG_ERROR([clippy tool ($with_clippy) is not executable])
49 fi
50
51dnl case 2: cross-compiling internal clippy
52elif test "$host" != "$build"; then
53 if test "$srcdir" = "."; then
54 AC_MSG_ERROR([cross-compilation is only possible with builddir separate from srcdir or by building clippy separately and using the --with-clippy option. create a separate directory and run as .../path-to-frr/configure.])
55 fi
56 test -d hosttools || mkdir hosttools
57 abssrc="`cd \"${srcdir}\"; pwd`"
58
59 AC_MSG_NOTICE([...])
60 AC_MSG_NOTICE([... cross-compilation: creating hosttools directory and self-configuring for build platform tools])
61 AC_MSG_NOTICE([... use HOST_CPPFLAGS / HOST_CFLAGS / HOST_LDFLAGS if necessary])
62 AC_MSG_NOTICE([...])
63
64 (
65 for var in $ac_precious_vars; do
66 dnl special cases
67 case "$var" in
68 YACC|YFLAGS) continue;;
69 PYTHON*) retain=true;;
70 *) retain=false;
71 esac
72
73 eval "hostvar=\"\${HOST_$var}\""
74 eval "targetvar=\"\${$var}\""
75 if test -n "$hostvar"; then
76 eval "$var='$hostvar'"
77 _AS_ECHO_LOG([host $var='$hostvar'])
78 elif $retain; then
79 _AS_ECHO_LOG([host retain $var='$targetvar'])
80 else
81 eval "unset $var"
82 _AS_ECHO_LOG([host unset $var])
83 fi
84 done
85 cd hosttools
86 "${abssrc}/configure" "--host=$build" "--build=$build" "--enable-clippy-only" "--disable-nhrpd" "--disable-vtysh"
87 ) || exit 1
88
89 AC_MSG_NOTICE([...])
90 AC_MSG_NOTICE([... cross-compilation: finished self-configuring for build platform tools])
91 AC_MSG_NOTICE([...])
92
93 build_clippy="false"
94 hosttools_clippy="true"
95 CLIPPY="hosttools/lib/clippy"
96
97dnl case 3: normal build internal clippy
98else
99 CLIPPY="lib/clippy\$(EXEEXT)"
100fi
101AC_SUBST([CLIPPY])
102AM_CONDITIONAL([BUILD_CLIPPY], [$build_clippy])
103AM_CONDITIONAL([HOSTTOOLS_CLIPPY], [$hosttools_clippy])
104AM_CONDITIONAL([ONLY_CLIPPY], [test "$enable_clippy_only" = "yes"])
105
106# Disable portability warnings -- our automake code (in particular
107# common.am) uses some constructs specific to gmake.
108AM_INIT_AUTOMAKE([1.12 -Wno-portability foreign])
109m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
110AM_SILENT_RULES([yes])
111AC_CONFIG_HEADERS([config.h])
112
113AC_PATH_PROG([PERL], [perl])
114PKG_PROG_PKG_CONFIG
115
116dnl default is to match previous behavior
117pkgsrcrcdir=""
118AC_ARG_ENABLE([pkgsrcrcdir],
119 AS_HELP_STRING([--enable-pkgsrcrcdir],
120 [specify directory for rc.d scripts]),
121 pkgsrcrcdir="$enableval",)
122dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
123AC_SUBST([pkgsrcrcdir])
124AM_CONDITIONAL([PKGSRC], [test "$pkgsrcrcdir" != ""])
125
126AC_ARG_WITH([moduledir], [AS_HELP_STRING([--with-moduledir=DIR], [module directory (${libdir}/frr/modules)])], [
127 moduledir="$withval"
128], [
129 moduledir="\${libdir}/frr/modules"
130])
131AC_SUBST([moduledir], [$moduledir])
132
133AC_ARG_WITH([scriptdir], [AS_HELP_STRING([--with-scriptdir=DIR], [script directory (${sysconfdir}/scripts)])], [
134 scriptdir="$withval"
135], [
136 scriptdir="\${sysconfdir}/scripts"
137])
138AC_SUBST([scriptdir], [$scriptdir])
139
140AC_ARG_WITH([yangmodelsdir], [AS_HELP_STRING([--with-yangmodelsdir=DIR], [yang models directory (${datarootdir}/yang)])], [
141 yangmodelsdir="$withval"
142], [
143 yangmodelsdir="\${datarootdir}/yang"
144])
145AC_SUBST([yangmodelsdir])
146
147AC_ARG_WITH([vici-socket], [AS_HELP_STRING([--with-vici-socket=PATH], [vici-socket (/var/run/charon.vici)])], [
148 vici_socket="$withval"
149], [
150 vici_socket="/var/run/charon.vici"
151])
152AC_DEFINE_UNQUOTED([VICI_SOCKET], ["$vici_socket"], [StrongSWAN vici socket path])
153
154AC_ARG_ENABLE(tcmalloc,
155 AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
156[case "${enableval}" in
157 yes) tcmalloc_enabled=true
158LIBS="$LIBS -ltcmalloc_minimal"
159 ;;
160 no) tcmalloc_enabled=false ;;
161 *) AC_MSG_ERROR([bad value ${enableval} for --enable-tcmalloc]) ;;
162esac],[tcmalloc_enabled=false])
163
164
165dnl Thanks autoconf, but we don't want a default -g -O2. We have our own
166dnl flag determination logic.
167CFLAGS="${CFLAGS:-}"
168
169dnl --------------------
170dnl Check CC and friends
171dnl --------------------
172dnl note orig_cflags is also used further down
173orig_cflags="$CFLAGS"
174orig_cxxflags="$CXXFLAGS"
175AC_LANG([C])
176AC_PROG_CC
177AC_PROG_CPP
178AC_PROG_CXX
179AM_PROG_CC_C_O
180dnl remove autoconf default "-g -O2"
181CFLAGS="$orig_cflags"
182CXXFLAGS="$orig_cxxflags"
183
184dnl Some special handling for ICC later on
185if test "$CC" = "icc"; then
186 cc_is_icc="yes"
187fi
188
189PKG_PROG_PKG_CONFIG
190
191dnl it's 2019, sed is sed.
192SED=sed
193AC_SUBST([SED])
194
195dnl try and enable CFLAGS that are useful for FRR
196dnl - specifically, options to control warnings
197
198AC_SUBST([AC_CFLAGS])
199AC_USE_SYSTEM_EXTENSIONS
200AC_DEFUN([AC_C_FLAG], [{
201 m4_pushdef([cachename],[m4_translit([frr_cv_$1],[ =-+/{}$],[________])])
202 AC_CACHE_CHECK([[whether $CC supports $1]], cachename, [
203 AC_LANG_PUSH([C])
204 ac_c_flag_save="$CFLAGS"
205 CFLAGS="$CFLAGS $1"
206 AC_COMPILE_IFELSE(
207 [AC_LANG_PROGRAM([[$4]])],
208 [
209 cachename=yes
210 ], [
211 cachename=no
212 ])
213 CFLAGS="$ac_c_flag_save"
214 AC_LANG_POP([C])
215 ])
216 if test "$cachename" = "yes"; then
217 m4_if([$3], [], [AC_CFLAGS="$AC_CFLAGS $1"], [$3])
218 else
219 :
220 $2
221 fi
222 m4_popdef([cachename])
223}])
224
225AC_DEFUN([AC_LINK_IFELSE_FLAGS], [{
226 AC_LANG_PUSH([C])
227 ac_cflags_save="$CFLAGS"
228 ac_libs_save="$LIBS"
229 CFLAGS="$CFLAGS $1"
230 LIBS="$LIBS $2"
231 AC_LINK_IFELSE(
232 [$3],
233 [
234 CFLAGS="$ac_cflags_save"
235 LIBS="$ac_libs_save"
236 m4_default([$5], [
237 AC_MSG_RESULT([yes])
238 ])
239 ], [
240 CFLAGS="$ac_cflags_save"
241 LIBS="$ac_libs_save"
242 m4_default([$4], [
243 AC_MSG_RESULT([no])
244 ])
245 ])
246 AC_LANG_POP([C])
247 }])
248
249dnl ICC won't bail on unknown options without -diag-error 10006
250dnl need to do this first so we get useful results for the other options
251if test "$cc_is_icc" = "yes"; then
252 AC_C_FLAG([-diag-error 10006])
253fi
254
255dnl autoconf 2.69 AC_PROG_CC_C99 is "state of the art"
256dnl autoconf 2.70 AC_PROG_CC_C99 is deprecated and AC_PROC_CC tries to do C11
257m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.70]), [-1], [dnl
258 dnl autoconf < 2.70
259 AC_PROG_CC_C99
260
261 dnl AC_PROG_CC_C99 may change CC to include -std=gnu99 or something
262 ac_cc="$CC"
263 CC="${CC% -std=gnu99}"
264 CC="${CC% -std=c99}"
265
266 AC_C_FLAG([-std=gnu11], [CC="$ac_cc"], [CC="$CC -std=gnu11"])
267], [
268 dnl autoconf >= 2.70
269 if test "$ac_cv_prog_cc_c11" = "no"; then
270 AC_MSG_ERROR([ISO C11 compiler support (with GNU extensions) is required.])
271 fi
272])
273
274dnl if the user has specified any CFLAGS, override our settings
275if test "$enable_gcov" = "yes"; then
276 if test "$orig_cflags" = ""; then
277 AC_C_FLAG([--coverage])
278 AC_C_FLAG([-O0])
279 fi
280
281 AC_LDFLAGS="${AC_LDFLAGS} --coverage"
282fi
283
284if test "$enable_clang_coverage" = "yes"; then
285 AC_C_FLAG([-fprofile-instr-generate], [
286 AC_MSG_ERROR([$CC does not support -fprofile-instr-generate.])
287 ])
288 AC_C_FLAG([-fcoverage-mapping], [
289 AC_MSG_ERROR([$CC does not support -fcoverage-mapping.])
290 ])
291fi
292
293AM_CONDITIONAL([SCRIPTING], [test "$enable_scripting" = "yes"])
294
295if test "$enable_scripting" = "yes"; then
296 AX_PROG_LUA([5.3], [5.4], [], [
297 AC_MSG_ERROR([Lua 5.3 is required to build with Lua support. No other version is supported.])
298 ])
299 AX_LUA_HEADERS([], [
300 AC_MSG_ERROR([Lua 5.3 headers are required to build with Lua support. No other version is supported.])
301 ])
302 AX_LUA_LIBS([
303 AC_DEFINE([HAVE_SCRIPTING], [1], [Have support for scripting])
304 LIBS="$LIBS $LUA_LIB"
305 SCRIPTING=true
306 ], [
307 SCRIPTING=false
308 AC_MSG_ERROR([Lua 5.3 libraries are required to build with Lua support. No other version is supported.])
309 ])
310fi
311
312dnl the following flags go in CFLAGS rather than AC_CFLAGS since they make
313dnl sense to be overridden by the user
314if test "$enable_dev_build" = "yes"; then
315 AC_DEFINE([DEV_BUILD], [1], [Build for development])
316 if test "$orig_cflags" = ""; then
317 AC_C_FLAG([-O0],,[CFLAGS="$CFLAGS -O0"])
318 AC_C_FLAG([-g3],,[CFLAGS="$CFLAGS -g3"])
319 AC_C_FLAG([-ggdb3],,[CFLAGS="$CFLAGS -ggdb3"])
320 fi
321else
322 if test "$orig_cflags" = ""; then
323 AC_C_FLAG([-g],,[CFLAGS="$CFLAGS -g"])
324 AC_C_FLAG([-O2],,[CFLAGS="$CFLAGS -O2"])
325 fi
326fi
327
328dnl just stick -g into LDFLAGS, if we don't have it in CFLAGS it won't do much
329LDFLAGS="$LDFLAGS -g"
330
331AM_CONDITIONAL([DEV_BUILD], [test "$enable_dev_build" = "yes"])
332
333dnl -fms-extensions causes clang to have a built-in __wchar_t on OpenBSD,
334dnl which just straight up breaks compiling any code.
335dnl (2022-04-04 / OpenBSD 7 / clang 11.1.0)
336AH_VERBATIM([OpenBSD], [
337#ifdef __OpenBSD__
338#define __wchar_t __wchar_t_ignore
339#include <stdint.h>
340#undef __wchar_t
341#endif
342])
343
344dnl always want these CFLAGS
345AC_C_FLAG([-fms-extensions], [
346 AC_MSG_ERROR([$CC does not support unnamed struct fields (-fms-extensions)])
347])
348AC_C_FLAG([-fno-omit-frame-pointer])
349AC_C_FLAG([-funwind-tables])
350AC_C_FLAG([-Wall])
351AC_C_FLAG([-Wextra])
352AC_C_FLAG([-Wformat-nonliteral])
353AC_C_FLAG([-Wformat-security])
354AC_C_FLAG([-Wswitch-enum])
355AC_C_FLAG([-Wstrict-prototypes])
356AC_C_FLAG([-Wmissing-prototypes])
357AC_C_FLAG([-Wmissing-declarations])
358AC_C_FLAG([-Wpointer-arith])
359AC_C_FLAG([-Wbad-function-cast])
360AC_C_FLAG([-Wwrite-strings])
361AC_C_FLAG([-Wundef])
362if test "$enable_gcc_ultra_verbose" = "yes" ; then
363 AC_C_FLAG([-Wcast-qual])
364 AC_C_FLAG([-Wmissing-noreturn])
365 AC_C_FLAG([-Wmissing-format-attribute])
366 AC_C_FLAG([-Wunreachable-code])
367 AC_C_FLAG([-Wpacked])
368 AC_C_FLAG([-Wpadded])
369 AC_C_FLAG([-Wshadow])
370else
371 AC_C_FLAG([-Wno-unused-result])
372fi
373AC_C_FLAG([-Wno-unused-parameter])
374AC_C_FLAG([-Wno-missing-field-initializers])
375
376AC_C_FLAG([-Wc++-compat], [], [CXX_COMPAT_CFLAGS="-Wc++-compat"])
377AC_SUBST([CXX_COMPAT_CFLAGS])
378
379dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
380dnl for some reason the string consts get 'promoted' to char *,
381dnl triggering a const to non-const conversion warning.
382if test "$cc_is_icc" = "yes"; then
383 AC_C_FLAG([-diag-disable 3179])
384fi
385
386if test "$enable_werror" = "yes" ; then
387 WERROR="-Werror"
388fi
389AC_SUBST([WERROR])
390
391SAN_FLAGS=""
392if test "$enable_address_sanitizer" = "yes"; then
393 AC_C_FLAG([-fsanitize=address], [
394 AC_MSG_ERROR([$CC does not support Address Sanitizer.])
395 ], [
396 SAN_FLAGS="$SAN_FLAGS -fsanitize=address"
397 ])
398fi
399if test "$enable_thread_sanitizer" = "yes"; then
400 AC_C_FLAG([-fsanitize=thread], [
401 AC_MSG_ERROR([$CC does not support Thread Sanitizer.])
402 ], [
403 SAN_FLAGS="$SAN_FLAGS -fsanitize=thread"
404 ])
405fi
406if test "$enable_memory_sanitizer" = "yes"; then
407 AC_C_FLAG([-fsanitize=memory -fPIE -pie], [
408 AC_MSG_ERROR([$CC does not support Memory Sanitizer.])
409 ], [
410 SAN_FLAGS="$SAN_FLAGS -fsanitize=memory -fPIE -pie"
411 ])
412fi
413if test "$enable_undefined_sanitizer" = "yes"; then
414 AC_C_FLAG([-fsanitize=undefined], [
415 AC_MSG_ERROR([$CC does not support UndefinedBehaviorSanitizer.])
416 ], [
417 SAN_FLAGS="$SAN_FLAGS -fsanitize=undefined"
418 ])
419fi
420AC_SUBST([SAN_FLAGS])
421
422dnl frr-format.so
423if test "$with_frr_format" != "no" -a "$with_frr_format" != "yes" -a -n "$with_frr_format"; then
424 AC_C_FLAG([-fplugin=${with_frr_format}], [
425 AC_MSG_ERROR([specified frr-format plugin ($with_frr_format) does not work])
426 ],,[
427#ifndef _FRR_ATTRIBUTE_PRINTFRR
428#error plugin not loaded
429#endif
430#if _FRR_ATTRIBUTE_PRINTFRR < 0x10000
431#error plugin too old
432#endif
433 ])
434elif test "$with_frr_format" = "no"; then
435 : #nothing
436else
437 AC_C_FLAG([-fplugin=tools/gcc-plugins/frr-format.so],[
438 AC_C_FLAG([-fplugin=frr-format],[
439 if test "$with_frr_format" = "yes"; then
440 AC_MSG_ERROR([frr-format plugin requested but not found])
441 fi
442 ],,[
443#ifndef _FRR_ATTRIBUTE_PRINTFRR
444#error plugin not loaded
445#endif
446#if _FRR_ATTRIBUTE_PRINTFRR < 0x10000
447#error plugin too old
448#endif
449 ])
450 ],,[
451#ifndef _FRR_ATTRIBUTE_PRINTFRR
452#error plugin not loaded
453#endif
454#if _FRR_ATTRIBUTE_PRINTFRR < 0x10000
455#error plugin too old
456#endif
457 ])
458fi
459
460AC_MSG_CHECKING([whether linker supports __start/stop_section symbols])
461AC_LINK_IFELSE([AC_LANG_PROGRAM([[
462#include <stdio.h>
463int __attribute__((section("secttest"))) var = 1;
464extern int __start_secttest, __stop_secttest;
465]], [[
466 void *a = &var, *b = &__start_secttest, *c = &__stop_secttest;
467 printf("%p %p %p\n", a, b, c);
468]])], [
469 AC_MSG_RESULT(yes)
470 AC_DEFINE(HAVE_SECTION_SYMS, 1, [have __start/stop_section symbols])
471], [
472 AC_MSG_RESULT(no)
473])
474
475dnl ----------
476dnl Essentials
477dnl ----------
478
479AX_PTHREAD([
480 CC="$PTHREAD_CC"
481 AC_CFLAGS="$AC_CFLAGS $PTHREAD_CFLAGS"
482 LIBS="$PTHREAD_LIBS $LIBS"
483], [
484 AC_MSG_FAILURE([This FRR version needs pthreads])
485])
486
487orig_cflags="$CFLAGS"
488CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
489
490AC_SEARCH_LIBS([pthread_condattr_setclock], [],
491 [frr_cv_pthread_condattr_setclock=yes],
492 [frr_cv_pthread_condattr_setclock=no])
493if test "$frr_cv_pthread_condattr_setclock" = "yes"; then
494 AC_DEFINE([HAVE_PTHREAD_CONDATTR_SETCLOCK], [1], [Have pthread.h pthread_condattr_setclock])
495fi
496
497AC_CHECK_HEADERS([pthread_np.h],,, [
498#include <pthread.h>
499])
500AC_CHECK_FUNCS([pthread_setname_np pthread_set_name_np pthread_getthreadid_np])
501
502CFLAGS="$orig_cflags"
503
504dnl --------------
505dnl Check programs
506dnl --------------
507AC_PROG_INSTALL
508AC_PROG_LN_S
509AC_CHECK_TOOL([AR], [ar])
510
511dnl -------
512dnl libtool
513dnl -------
514AC_ARG_ENABLE([static-bin],
515 AS_HELP_STRING([--enable-static-bin], [link binaries statically]))
516LT_INIT
517_LT_CONFIG_LIBTOOL([
518 patch -N -i "${srcdir}/m4/libtool-whole-archive.patch" libtool >&AS_MESSAGE_LOG_FD || \
519 AC_MSG_WARN([Could not patch libtool for static linking support. Loading modules into a statically linked daemon will fail.])
520dnl the -i option is not POSIX sed and the BSDs implement it differently
521dnl cat'ing the output back instead of mv/cp keeps permissions on libtool intact
522 sed -e 's%func_warning "relinking%true #\0%' libtool > libtool.sed && cat libtool.sed > libtool
523 sed -e 's%func_warning "remember to run%true #\0%' libtool > libtool.sed && cat libtool.sed > libtool
524 sed -e 's%func_warning ".*has not been installed in%true #\0%' libtool > libtool.sed && cat libtool.sed > libtool
525 test -f libtool.sed && rm libtool.sed
526])
527if test "$enable_static_bin" = "yes"; then
528 AC_LDFLAGS_EXEC="-static"
529 if test "$enable_static" != "yes"; then
530 AC_MSG_ERROR([The --enable-static-bin option must be combined with --enable-static.])
531 fi
532fi
533if test "$enable_shared" != "yes"; then
534 AC_MSG_ERROR([FRR cannot be built with --disable-shared. If you want statically linked daemons, use --enable-shared --enable-static --enable-static-bin])
535fi
536AC_SUBST([AC_LDFLAGS])
537AC_SUBST([AC_LDFLAGS_EXEC])
538AM_CONDITIONAL([STATIC_BIN], [test "$enable_static_bin" = "yes"])
539
540dnl libtool, the repository of all knowledge related linkers, is too stupid to
541dnl correctly tell the linker how to build modules.
542if test -z "$module_cmds"; then
543 module_cmds="`echo \"$archive_cmds\" | sed -e 's%$wl-soname $wl$soname%%'`"
544fi
545if test -z "$module_expsym_cmds"; then
546 module_expsym_cmds="`echo \"$archive_expsym_cmds\" | sed -e 's%$wl-soname $wl$soname%%'`"
547fi
548
549AC_ARG_ENABLE([rpath],
550 [AS_HELP_STRING([--enable-rpath], [set hardcoded rpaths in the executable @<:@default=yes@:>@])],
551 [],
552 [enable_rpath=yes])
553
554dnl $AR and $RANLIB are set by LT_INIT above
555AC_MSG_CHECKING([whether $AR supports D option])
556if $AR crD conftest.a >/dev/null 2>/dev/null; then
557 AC_MSG_RESULT([yes])
558 dnl ARFLAGS is for automake, AR_FLAGS for libtool m-(
559 ARFLAGS="crD"
560 AR_FLAGS="crD"
561else
562 AC_MSG_RESULT([no])
563 ARFLAGS="cru"
564 AR_FLAGS="cru"
565fi
566AC_SUBST([ARFLAGS])
567AC_SUBST([AR_FLAGS])
568
569AC_MSG_CHECKING([whether $RANLIB supports D option])
570if $RANLIB -D conftest.a >conftest.err 2>&1; then
571 if grep -q -- '-D' conftest.err; then
572 AC_MSG_RESULT([no])
573 else
574 AC_MSG_RESULT([yes])
575 RANLIB="$RANLIB -D"
576 fi
577else
578 AC_MSG_RESULT([no])
579fi
580AC_SUBST([RANLIB])
581
582test -f conftest.err && rm conftest.err
583test -f conftest.a && rm conftest.a
584
585dnl ----------------------
586dnl Packages configuration
587dnl ----------------------
588if test -f config.version; then
589 . ./config.version
590elif test -f "${srcdir}/config.version"; then
591 . "${srcdir}/config.version"
592fi
593AC_ARG_WITH([pkg-extra-version],
594 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]), [
595 if test "$withval" = "no"; then
596 EXTRAVERSION=
597 else
598 EXTRAVERSION=$withval
599 fi
600], [])
601AC_ARG_WITH([pkg-git-version],
602 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
603 [ test "$withval" != "no" && with_pkg_git_version="yes" ])
604AC_ARG_WITH([clippy],
605 AS_HELP_STRING([--with-clippy=PATH], [use external clippy helper program]))
606AC_ARG_WITH([vtysh_pager],
607 AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
608 VTYSH_PAGER=$withval, VTYSH_PAGER="more")
609AC_ARG_ENABLE([vtysh],
610 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for FRR]))
611AC_ARG_ENABLE([doc],
612 AS_HELP_STRING([--disable-doc], [do not build docs]))
613AC_ARG_ENABLE([doc-html],
614 AS_HELP_STRING([--enable-doc-html], [build HTML docs]))
615AC_ARG_ENABLE([zebra],
616 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
617AC_ARG_ENABLE([bgpd],
618 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
619AC_ARG_ENABLE([mgmtd],
620 AS_HELP_STRING([--disable-mgmtd], [do not build mgmtd]))
621AC_ARG_ENABLE([ripd],
622 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
623AC_ARG_ENABLE([ripngd],
624 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
625AC_ARG_ENABLE([ospfd],
626 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
627AC_ARG_ENABLE([ospf6d],
628 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
629AC_ARG_ENABLE([ldpd],
630 AS_HELP_STRING([--disable-ldpd], [do not build ldpd]))
631AC_ARG_ENABLE([nhrpd],
632 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
633AC_ARG_ENABLE([eigrpd],
634 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
635AC_ARG_ENABLE([babeld],
636 AS_HELP_STRING([--disable-babeld], [do not build babeld]))
637AC_ARG_ENABLE([watchfrr],
638 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
639AC_ARG_ENABLE([isisd],
640 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
641AC_ARG_ENABLE([pimd],
642 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
643AC_ARG_ENABLE([pim6d],
644 AS_HELP_STRING([--disable-pim6d], [do not build pim6d]))
645AC_ARG_ENABLE([pbrd],
646 AS_HELP_STRING([--disable-pbrd], [do not build pbrd]))
647AC_ARG_ENABLE([sharpd],
648 AS_HELP_STRING([--enable-sharpd], [build sharpd]))
649AC_ARG_ENABLE([staticd],
650 AS_HELP_STRING([--disable-staticd], [do not build staticd]))
651AC_ARG_ENABLE([fabricd],
652 AS_HELP_STRING([--disable-fabricd], [do not build fabricd]))
653AC_ARG_ENABLE([vrrpd],
654 AS_HELP_STRING([--disable-vrrpd], [do not build vrrpd]))
655AC_ARG_ENABLE([pathd],
656 AS_HELP_STRING([--disable-pathd], [do not build pathd]))
657AC_ARG_ENABLE([bgp-announce],
658 AS_HELP_STRING([--disable-bgp-announce], [turn off BGP route announcement]))
659AC_ARG_ENABLE([bgp-vnc],
660 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
661AC_ARG_ENABLE([bgp-bmp],
662 AS_HELP_STRING([--disable-bgp-bmp],[turn off BGP BMP support]))
663AC_ARG_ENABLE([snmp],
664 AS_HELP_STRING([--enable-snmp], [enable SNMP support for agentx]))
665AC_ARG_ENABLE([config_rollbacks],
666 AS_HELP_STRING([--enable-config-rollbacks], [enable configuration rollbacks (requires sqlite3)]))
667AC_ARG_ENABLE([confd],
668 AS_HELP_STRING([--enable-confd=ARG], [enable confd integration]))
669AC_ARG_ENABLE([sysrepo],
670 AS_HELP_STRING([--enable-sysrepo], [enable sysrepo integration]))
671AC_ARG_ENABLE([grpc],
672 AS_HELP_STRING([--enable-grpc], [enable the gRPC northbound plugin]))
673AC_ARG_ENABLE([zeromq],
674 AS_HELP_STRING([--enable-zeromq], [enable ZeroMQ handler (libfrrzmq)]))
675AC_ARG_ENABLE([lttng],
676 AS_HELP_STRING([--enable-lttng], [enable LTTng tracing]))
677AC_ARG_ENABLE([usdt],
678 AS_HELP_STRING([--enable-usdt], [enable USDT probes]))
679AC_ARG_WITH([libpam],
680 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
681AC_ARG_ENABLE([ospfapi],
682 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
683AC_ARG_ENABLE([ospfclient],
684 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
685 (this is the default if --disable-ospfapi is set)]))
686AC_ARG_ENABLE([multipath],
687 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
688AC_ARG_WITH([service_timeout],
689 AS_HELP_STRING([--with-service-timeout=ARG], [set service timeout value (2 minutes by default), ARG must be digit]))
690AC_ARG_ENABLE([user],
691 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
692AC_ARG_ENABLE([group],
693 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
694AC_ARG_ENABLE([vty_group],
695 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
696AC_ARG_ENABLE([configfile_mask],
697 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
698AC_ARG_ENABLE([logfile_mask],
699 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
700AC_ARG_ENABLE([shell_access],
701 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
702AC_ARG_ENABLE([realms],
703 AS_HELP_STRING([--enable-realms], [enable REALMS support under Linux]))
704AC_ARG_ENABLE([rtadv],
705 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
706AC_ARG_ENABLE([irdp],
707 AS_HELP_STRING([--disable-irdp], [disable IRDP server support in zebra (enabled by default if supported)]))
708AC_ARG_ENABLE([capabilities],
709 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
710AC_ARG_ENABLE([gcc_ultra_verbose],
711 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
712AC_ARG_ENABLE([backtrace],
713 AS_HELP_STRING([--disable-backtrace], [disable crash backtraces (default autodetect)]))
714AC_ARG_ENABLE([time-check],
715 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
716AC_ARG_ENABLE([cpu-time],
717 AS_HELP_STRING([--disable-cpu-time], [disable cpu usage data gathering]))
718AC_ARG_ENABLE([pcreposix],
719 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
720AC_ARG_ENABLE([pcre2posix],
721 AS_HELP_STRING([--enable-pcre2posix], [enable using PCRE2 Posix libs for regex functions]))
722AC_ARG_ENABLE([fpm],
723 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
724AC_ARG_ENABLE([werror],
725 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
726AC_ARG_ENABLE([cumulus],
727 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
728AC_ARG_ENABLE([datacenter],
729 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
730AC_ARG_ENABLE([rr-semantics],
731 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
732AC_ARG_ENABLE([protobuf],
733 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
734AC_ARG_ENABLE([oldvpn_commands],
735 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
736AC_ARG_ENABLE([rpki],
737 AS_HELP_STRING([--enable-rpki], [enable RPKI prefix validation support]))
738AC_ARG_ENABLE([clippy-only],
739 AS_HELP_STRING([--enable-clippy-only], [Only build clippy]))
740AC_ARG_ENABLE([numeric_version],
741 AS_HELP_STRING([--enable-numeric-version], [Only numeric digits allowed in version (for Alpine)]))
742AC_ARG_ENABLE([gcov],
743 AS_HELP_STRING([--enable-gcov], [Collect coverage information with gcov]))
744AC_ARG_ENABLE([clang_coverage],
745 AS_HELP_STRING([--enable-clang-coverage], [Collect coverage information with Clang Coverage]))
746AC_ARG_ENABLE([bfdd],
747 AS_HELP_STRING([--disable-bfdd], [do not build bfdd]))
748AC_ARG_ENABLE([address-sanitizer],
749 AS_HELP_STRING([--enable-address-sanitizer], [enable AddressSanitizer support for detecting a wide variety of memory allocation and deallocation errors]))
750AC_ARG_ENABLE([thread-sanitizer],
751 AS_HELP_STRING([--enable-thread-sanitizer], [enable ThreadSanitizer support for detecting data races]))
752AC_ARG_ENABLE([memory-sanitizer],
753 AS_HELP_STRING([--enable-memory-sanitizer], [enable MemorySanitizer support for detecting uninitialized memory reads]))
754AC_ARG_ENABLE([undefined-sanitizer],
755 AS_HELP_STRING([--enable-undefined-sanitizer], [enable UndefinedBehaviorSanitizer support for detecting undefined behavior]))
756AC_ARG_WITH([crypto],
757 AS_HELP_STRING([--with-crypto=<internal|openssl>], [choose between different implementations of cryptographic functions(default value is --with-crypto=internal)]))
758AC_ARG_WITH([frr-format],
759 AS_HELP_STRING([--with-frr-format[=<.../frr-format.so>]], [use frr-format GCC plugin]))
760
761AC_ARG_ENABLE([version-build-config],
762 AS_HELP_STRING([--disable-version-build-config], [do not include build configs in show version command]))
763
764#if openssl, else use the internal
765AS_IF([test "$with_crypto" = "openssl"], [
766AC_CHECK_LIB([crypto], [EVP_DigestInit], [LIBS="$LIBS -lcrypto"], [], [])
767if test "$ac_cv_lib_crypto_EVP_DigestInit" = "no"; then
768 AC_MSG_ERROR([build with openssl has been specified but openssl library was not found on your system])
769else
770 AC_DEFINE([CRYPTO_OPENSSL], [1], [Compile with openssl support])
771fi
772], [test "$with_crypto" = "internal" || test "$with_crypto" = "" ], [AC_DEFINE([CRYPTO_INTERNAL], [1], [Compile with internal cryptographic implementation])
773], [AC_MSG_ERROR([Unknown value for --with-crypto])]
774)
775
776AS_IF([test "$enable_clippy_only" != "yes"], [
777AC_CHECK_HEADERS([json-c/json.h])
778AC_CHECK_LIB([json-c], [json_object_get], [LIBS="$LIBS -ljson-c"], [], [-lm])
779if test "$ac_cv_lib_json_c_json_object_get" = "no"; then
780 AC_CHECK_LIB([json], [json_object_get], [LIBS="$LIBS -ljson"])
781 if test "$ac_cv_lib_json_json_object_get" = "no"; then
782 AC_MSG_ERROR([libjson is needed to compile])
783 fi
784fi
785])
786
787AC_ARG_ENABLE([dev_build],
788 AS_HELP_STRING([--enable-dev-build], [build for development]))
789
790AC_ARG_ENABLE([scripting],
791 AS_HELP_STRING([--enable-scripting], [Build with scripting support]))
792
793AC_ARG_ENABLE([netlink-debug],
794 AS_HELP_STRING([--disable-netlink-debug], [don't pretty print netlink debug messages]))
795
796if test "$enable_netlink_debug" != "no" ; then
797 AC_DEFINE([NETLINK_DEBUG], [1], [Netlink extra debugging code])
798fi
799
800AM_CONDITIONAL([NETLINK_DEBUG], [test "$enable_netlink_debug" != "no"])
801
802if test "$enable_time_check" != "no" ; then
803 if test "$enable_time_check" = "yes" -o "$enable_time_check" = "" ; then
804 AC_DEFINE([CONSUMED_TIME_CHECK], [5000000], [Consumed Time Check])
805 else
806 AC_DEFINE_UNQUOTED([CONSUMED_TIME_CHECK], [$enable_time_check], [Consumed Time Check])
807 fi
808fi
809
810case "${enable_cpu_time}" in
811 "no")
812 AC_DEFINE([EXCLUDE_CPU_TIME], [1], [Exclude getrusage data gathering])
813 ;;
814 "*")
815 ;;
816esac
817
818if test "$enable_rr_semantics" != "no" ; then
819 AC_DEFINE([HAVE_V6_RR_SEMANTICS], [1], [Compile in v6 Route Replacement Semantics])
820fi
821
822if test "$enable_datacenter" = "yes" ; then
823 AC_DEFINE([HAVE_DATACENTER], [1], [Compile extensions for a DataCenter])
824 DFLT_NAME="datacenter"
825else
826 DFLT_NAME="traditional"
827fi
828
829if test "$enable_cumulus" = "yes" ; then
830 AC_DEFINE([HAVE_CUMULUS], [1], [Compile Special Cumulus Code in])
831fi
832
833AC_SUBST([DFLT_NAME])
834AC_DEFINE_UNQUOTED([DFLT_NAME], ["$DFLT_NAME"], [Name of the configuration default set])
835
836if test "$enable_shell_access" = "yes"; then
837 AC_DEFINE([HAVE_SHELL_ACCESS], [1], [Allow user to use ssh/telnet/bash, be aware this is considered insecure])
838fi
839
840#
841# Python for clippy
842#
843
844AS_IF([test "$host" = "$build"], [
845 AM_PATH_PYTHON([3])
846 AC_CHECK_HEADER([gelf.h], [], [
847 AC_MSG_ERROR([libelf headers are required for building clippy. (Host only when cross-compiling.)])
848 ])
849
850 LIBS_save="$LIBS"
851 AC_CHECK_LIB([elf], [elf_memory], [], [
852 AC_MSG_ERROR([libelf is required for building clippy. (Host only when cross-compiling.)])
853 ])
854
855 AC_CHECK_LIB([elf], [elf_getdata_rawchunk], [
856 AC_DEFINE([HAVE_ELF_GETDATA_RAWCHUNK], [1], [Have elf_getdata_rawchunk()])
857 ])
858 AC_CHECK_LIB([elf], [gelf_getnote], [
859 AC_DEFINE([HAVE_GELF_GETNOTE], [1], [Have gelf_getnote()])
860 ])
861 LIBS="$LIBS_save"
862 unset LIBS_save
863
864 FRR_PYTHON_DEV
865], [
866 FRR_PYTHON
867])
868
869FRR_PYTHON_MODULES([pytest])
870
871if test "$enable_doc" != "no"; then
872 FRR_PYTHON_MODULES([sphinx], , [
873 if test "$enable_doc" = "yes"; then
874 AC_MSG_ERROR([Documentation was explicitly requested with --enable-doc but sphinx is not available for $PYTHON. Please disable docs or install sphinx.])
875 fi
876 ])
877fi
878AM_CONDITIONAL([DOC], [test "$enable_doc" != "no" -a "$frr_py_mod_sphinx" != "false"])
879AM_CONDITIONAL([DOC_HTML], [test "$enable_doc_html" = "yes"])
880
881FRR_PYTHON_MOD_EXEC([sphinx], [--version], [
882 PYSPHINX="-m sphinx"
883], [
884 PYSPHINX="-c 'import sys; from sphinx import main; sys.exit(main(sys.argv))'"
885])
886AC_SUBST([PYSPHINX])
887
888#
889# Logic for old vpn commands support.
890#
891if test "$enable_oldvpn_commands" = "yes"; then
892 AC_DEFINE([KEEP_OLD_VPN_COMMANDS], [1], [Define for compiling with old vpn commands])
893fi
894
895AC_MSG_CHECKING([if zebra should be configurable to send Route Advertisements])
896if test "$enable_rtadv" != "no"; then
897 AC_MSG_RESULT([yes])
898 AC_DEFINE([HAVE_RTADV], [1], [Enable IPv6 Routing Advertisement support])
899else
900 AC_MSG_RESULT([no])
901fi
902
903if test "$enable_user" = "no"; then
904 enable_user=""
905else
906 if test "$enable_user" = "yes" || test "$enable_user" = ""; then
907 enable_user="frr"
908 fi
909 AC_DEFINE_UNQUOTED([FRR_USER], ["${enable_user}"], [frr User])
910fi
911
912if test "$enable_group" = "no"; then
913 enable_group=""
914else
915 if test "$enable_group" = "yes" || test "$enable_group" = ""; then
916 enable_group="frr"
917 fi
918 AC_DEFINE_UNQUOTED([FRR_GROUP], ["${enable_group}"], [frr Group])
919fi
920
921if test "$enable_vty_group" = "yes" ; then
922 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
923elif test "$enable_vty_group" != ""; then
924 if test "$enable_vty_group" != "no"; then
925 AC_DEFINE_UNQUOTED([VTY_GROUP], ["${enable_vty_group}"], [VTY Sockets Group])
926 fi
927fi
928AC_SUBST([enable_user])
929AC_SUBST([enable_group])
930AC_SUBST([enable_vty_group])
931
932enable_configfile_mask=${enable_configfile_mask:-0600}
933AC_DEFINE_UNQUOTED([CONFIGFILE_MASK], [${enable_configfile_mask}], [Mask for config files])
934AC_SUBST([enable_configfile_mask])
935
936enable_logfile_mask=${enable_logfile_mask:-0600}
937AC_DEFINE_UNQUOTED([LOGFILE_MASK], [${enable_logfile_mask}], [Mask for log files])
938
939MPATH_NUM=16
940
941case "${enable_multipath}" in
942 0)
943 MPATH_NUM=64
944 ;;
945 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
946 MPATH_NUM="${enable_multipath}"
947 ;;
948 "")
949 ;;
950 *)
951 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
952 ;;
953esac
954
955AC_DEFINE_UNQUOTED([MULTIPATH_NUM], [$MPATH_NUM], [Maximum number of paths for a route])
956
957AC_DEFINE_UNQUOTED([VTYSH_PAGER], ["$VTYSH_PAGER"], [What pager to use])
958
959
960TIMEOUT_MIN=2
961case "${with_service_timeout}" in
962 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
963 TIMEOUT_MIN="${with_service_timeout}"
964 ;;
965 0|"")
966 ;;
967 *)
968 AC_MSG_FAILURE([Please specify digit for timeout ARG])
969 ;;
970esac
971AC_SUBST([TIMEOUT_MIN])
972
973dnl --------------------
974dnl Enable code coverage
975dnl --------------------
976AM_CONDITIONAL([HAVE_GCOV], [test "$enable_gcov" != "no"])
977
978dnl ------------------------------------
979dnl Alpine only accepts numeric versions
980dnl ------------------------------------
981if test "$enable_numeric_version" != "" ; then
982 VERSION="`echo ${VERSION} | tr -c -d '[[.0-9]]'`"
983 PACKAGE_VERSION="`echo ${PACKAGE_VERSION} | tr -c -d '[[.0-9]]'`"
984fi
985
986dnl -----------------------------------
987dnl Add extra version string to package
988dnl name, string and version fields.
989dnl -----------------------------------
990if test "$EXTRAVERSION" != "" ; then
991 VERSION="${VERSION}${EXTRAVERSION}"
992 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
993 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
994 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
995fi
996AC_SUBST([EXTRAVERSION])
997
998if test "$with_pkg_git_version" = "yes"; then
999 if test -e "${srcdir}/.git"; then
1000 AC_DEFINE([GIT_VERSION], [1], [include git version info])
1001 else with_pkg_git_version="no"
1002 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
1003 fi
1004fi
1005AM_CONDITIONAL([GIT_VERSION], [test "$with_pkg_git_version" = "yes"])
1006
1007AC_CHECK_TOOL([OBJCOPY], [objcopy], [:])
1008if test "$OBJCOPY" != ":"; then
1009 AC_CACHE_CHECK([for .interp value to use], [frr_cv_interp], [
1010 frr_cv_interp=""
1011 AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])], [
1012 if $OBJCOPY -j.interp -Obinary conftest conftest.interp; then
1013 frr_cv_interp="`xargs -0 echo < conftest.interp`"
1014 fi
1015 test -f conftest.interp && rm conftest.interp
1016 ])
1017 ])
1018fi
1019if test -n "$frr_cv_interp"; then
1020 AC_DEFINE_UNQUOTED([INTERP], ["$frr_cv_interp"], [.interp value])
1021fi
1022
1023dnl -------------------------
1024dnl Check other header files.
1025dnl -------------------------
1026AC_CHECK_HEADERS([stropts.h sys/ksym.h \
1027 linux/version.h asm/types.h endian.h sys/endian.h])
1028
1029ac_stdatomic_ok=false
1030AC_DEFINE([FRR_AUTOCONF_ATOMIC], [1], [did autoconf checks for atomic funcs])
1031AC_CHECK_HEADER([stdatomic.h],[
1032
1033 AC_MSG_CHECKING([whether _Atomic qualifier works])
1034 AC_LINK_IFELSE([AC_LANG_SOURCE([[
1035#include <stdatomic.h>
1036int main(int argc, char **argv) {
1037 _Atomic int i = 0;
1038 return i;
1039}
1040]])], [
1041 AC_DEFINE([HAVE_STDATOMIC_H], [1], [found stdatomic.h])
1042 AC_MSG_RESULT([yes])
1043 ac_stdatomic_ok=true
1044 ], [
1045 AC_MSG_RESULT([no])
1046 ])
1047])
1048
1049AS_IF([$ac_stdatomic_ok], [true], [
1050 AC_MSG_CHECKING([for __atomic_* builtins])
1051 AC_LINK_IFELSE([AC_LANG_SOURCE([[
1052int main(int argc, char **argv) {
1053 volatile int i = 1;
1054 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
1055 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
1056}
1057]])], [
1058 AC_DEFINE([HAVE___ATOMIC], [1], [found __atomic builtins])
1059 AC_MSG_RESULT([yes])
1060 ], [
1061 AC_MSG_RESULT([no])
1062
1063 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
1064 AC_MSG_CHECKING([for __sync_* builtins])
1065 AC_LINK_IFELSE([AC_LANG_SOURCE([[
1066int main(int argc, char **argv) {
1067 volatile int i = 1;
1068 __sync_fetch_and_sub (&i, 1);
1069 return __sync_val_compare_and_swap (&i, 0, 1);
1070}
1071]])], [
1072 AC_DEFINE([HAVE___SYNC], [1], [found __sync builtins])
1073 AC_MSG_RESULT([yes])
1074
1075 AC_MSG_CHECKING([for __sync_swap builtin])
1076 AC_LINK_IFELSE([AC_LANG_SOURCE([[
1077int main(int argc, char **argv) {
1078 volatile int i = 1;
1079 return __sync_swap (&i, 2);
1080}
1081]])], [
1082 AC_DEFINE([HAVE___SYNC_SWAP], 1, [found __sync_swap builtin])
1083 AC_MSG_RESULT([yes])
1084 ], [
1085 AC_MSG_RESULT([no])
1086 ])
1087
1088 ], [
1089 AC_MSG_RESULT([no])
1090 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
1091 ])
1092 ])
1093])
1094
1095needsync=true
1096
1097AS_IF([$needsync], [
1098 dnl Linux
1099 AC_MSG_CHECKING([for Linux futex() support])
1100 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1101#ifndef _GNU_SOURCE
1102#define _GNU_SOURCE
1103#endif
1104#include <unistd.h>
1105#include <limits.h>
1106#include <sys/time.h>
1107#include <sys/syscall.h>
1108#include <linux/futex.h>
1109
1110int main(void);
1111],
1112[
1113{
1114 return syscall(SYS_futex, NULL, FUTEX_WAIT, 0, NULL, NULL, 0);
1115}
1116])], [
1117 AC_MSG_RESULT([yes])
1118 AC_DEFINE(HAVE_SYNC_LINUX_FUTEX,,Have Linux futex support)
1119 needsync=false
1120 ], [
1121 AC_MSG_RESULT([no])
1122 ])
1123])
1124
1125AS_IF([$needsync], [
1126 dnl FreeBSD
1127 AC_MSG_CHECKING([for FreeBSD _umtx_op() support])
1128 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1129#include <errno.h>
1130#include <stdlib.h>
1131#include <sys/types.h>
1132#include <sys/umtx.h>
1133int main(void);
1134],
1135[
1136{
1137 return _umtx_op(NULL, UMTX_OP_WAIT_UINT, 0, NULL, NULL);
1138}
1139])], [
1140 AC_MSG_RESULT([yes])
1141 AC_DEFINE(HAVE_SYNC_UMTX_OP,,Have FreeBSD _umtx_op() support)
1142 needsync=false
1143 ], [
1144 AC_MSG_RESULT([no])
1145 ])
1146])
1147
1148AS_IF([$needsync], [
1149 dnl OpenBSD patch (not upstream at the time of writing this)
1150 dnl https://marc.info/?l=openbsd-tech&m=147299508409549&w=2
1151 AC_MSG_CHECKING([for OpenBSD futex() support])
1152 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1153#include <sys/futex.h>
1154int main(void);
1155],
1156[
1157{
1158 return futex(NULL, FUTEX_WAIT, 0, NULL, NULL, 0);
1159}
1160])], [
1161 AC_MSG_RESULT([yes])
1162 AC_DEFINE(HAVE_SYNC_OPENBSD_FUTEX,,Have OpenBSD futex support)
1163 needsync=false
1164 ], [
1165 AC_MSG_RESULT([no])
1166 ])
1167])
1168
1169dnl Utility macro to avoid retyping includes all the time
1170m4_define([FRR_INCLUDES],
1171[#ifdef SUNOS_5
1172#define _POSIX_C_SOURCE 200809L
1173#define __EXTENSIONS__
1174#endif
1175#include <stdio.h>
1176#include <stdlib.h>
1177#include <stddef.h>
1178#include <sys/types.h>
1179/* sys/conf.h depends on param.h on FBSD at least */
1180#include <sys/param.h>
1181/* Required for MAXSIG */
1182#include <signal.h>
1183#include <sys/socket.h>
1184#ifdef __APPLE__
1185# define __APPLE_USE_RFC_3542
1186#endif
1187#include <netinet/in.h>
1188#include <sys/time.h>
1189#include <time.h>
1190#include <net/if.h>
1191])dnl
1192
1193dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
1194dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
1195dnl an additional round for it.
1196
1197AC_CHECK_HEADERS([net/if_var.h], [], [], [FRR_INCLUDES])
1198
1199m4_define([FRR_INCLUDES],
1200FRR_INCLUDES
1201[#ifdef HAVE_NET_IF_VAR_H
1202# include <net/if_var.h>
1203#endif
1204])dnl
1205
1206AC_CHECK_HEADERS([netinet/in_var.h \
1207 net/if_dl.h net/netopt.h \
1208 inet/nd.h netinet/ip_icmp.h \
1209 sys/sysctl.h sys/sockio.h sys/conf.h],
1210 [], [], [FRR_INCLUDES])
1211
1212AC_CHECK_HEADERS([ucontext.h], [], [],
1213[#ifndef __USE_GNU
1214#define __USE_GNU
1215#endif /* __USE_GNU */
1216FRR_INCLUDES
1217])
1218
1219m4_define([UCONTEXT_INCLUDES],
1220[#include <ucontext.h>])dnl
1221
1222AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
1223 [], [], [UCONTEXT_INCLUDES])
1224AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
1225 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
1226 [], [], [UCONTEXT_INCLUDES])],
1227 [], [UCONTEXT_INCLUDES])
1228AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
1229 [], [], [UCONTEXT_INCLUDES])
1230
1231m4_define([FRR_INCLUDES],
1232FRR_INCLUDES
1233[
1234#include <sys/un.h>
1235#include <netinet/in_systm.h>
1236#ifdef HAVE_NETINET_IN_VAR_H
1237# include <netinet/in_var.h>
1238#endif
1239#ifdef HAVE_NET_IF_DL_H
1240# include <net/if_dl.h>
1241#endif
1242#ifdef HAVE_NET_NETOPT_H
1243# include <net/netopt.h>
1244#endif
1245#include <net/route.h>
1246#ifdef HAVE_INET_ND_H
1247# include <inet/nd.h>
1248#endif
1249#include <arpa/inet.h>
1250/* Required for IDRP */
1251#ifdef HAVE_NETINET_IP_ICMP_H
1252# include <netinet/ip_icmp.h>
1253#endif
1254])dnl
1255
1256dnl V6 headers are checked below, after we check for v6
1257
1258is_linux=false
1259
1260AC_MSG_CHECKING([which operating system interface to use])
1261case "$host_os" in
1262 sunos* | solaris2*)
1263 AC_MSG_FAILURE([Solaris support has been removed please see versions prior or equal to 7.5])
1264 ;;
1265 linux*)
1266 AC_MSG_RESULT([Linux])
1267
1268 AC_DEFINE([GNU_LINUX], [1], [GNU Linux])
1269 AC_DEFINE([HAVE_NETLINK], [1], [netlink])
1270 AC_DEFINE([LINUX_IPV6], [1], [Linux IPv6 stack])
1271
1272 dnl Linux has a compilation problem with mixing
1273 dnl netinet/in.h and linux/in6.h they are not
1274 dnl compatible. There has been discussion on
1275 dnl how to fix it but no real progress on implementation
1276 dnl when they fix it, remove this
1277 AC_DEFINE([IPV6_MINHOPCOUNT], [73], [Linux ipv6 Min Hop Count])
1278
1279 is_linux=true
1280 ;;
1281 openbsd*)
1282 AC_MSG_RESULT([OpenBSD])
1283
1284 AC_DEFINE([OPEN_BSD], [1], [OpenBSD])
1285 AC_DEFINE([KAME], [1], [KAME IPv6])
1286 AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
1287 ;;
1288 *)
1289 AC_MSG_RESULT([BSD])
1290
1291 AC_DEFINE([HAVE_NET_RT_IFLIST], [1], [NET_RT_IFLIST])
1292 AC_DEFINE([KAME], [1], [KAME IPv6])
1293 AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
1294 ;;
1295esac
1296AM_CONDITIONAL([LINUX], [${is_linux}])
1297
1298AC_SYS_LARGEFILE
1299
1300dnl ------------------------
1301dnl Integrated REALMS option
1302dnl ------------------------
1303if test "$enable_realms" = "yes"; then
1304 case "$host_os" in
1305 linux*)
1306 AC_DEFINE([SUPPORT_REALMS], [1], [Realms support])
1307 ;;
1308 *)
1309 echo "Sorry, only Linux has REALMS support"
1310 exit 1
1311 ;;
1312 esac
1313fi
1314
1315dnl ---------------
1316dnl other functions
1317dnl ---------------
1318AC_CHECK_FUNCS([ \
1319 strlcat strlcpy \
1320 getgrouplist \
1321 openat \
1322 unlinkat \
1323 posix_fallocate \
1324 sendmmsg \
1325 explicit_bzero \
1326 ])
1327
1328AC_CHECK_MEMBERS([struct mmsghdr.msg_hdr], [], [], FRR_INCLUDES)
1329
1330dnl ##########################################################################
1331dnl LARGE if block spans a lot of "configure"!
1332if test "$enable_clippy_only" != "yes"; then
1333dnl ##########################################################################
1334
1335#
1336# Logic for protobuf support.
1337#
1338PROTO3=false
1339# Enable Protobuf by default at all times.
1340# Check for protoc & protoc-c
1341# protoc is not required, it's only for a "be nice" helper target
1342AC_CHECK_PROGS([PROTOC], [protoc], [/bin/false])
1343
1344AC_CHECK_PROGS([PROTOC_C], [protoc-c], [/bin/false])
1345if test "$PROTOC_C" = "/bin/false"; then
1346 AC_MSG_FAILURE([protobuf requested but protoc-c not found. Install protobuf-c.])
1347fi
1348
1349PKG_CHECK_MODULES([PROTOBUF_C], [libprotobuf-c >= 1.1.0],, [
1350 AC_MSG_FAILURE([minimum version (1.1.0) of libprotobuf-c not found. Install minimum required version of protobuf-c.])
1351])
1352
1353if test "$enable_protobuf3" = "yes"; then
1354 PROTO3=true
1355 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h],
1356 [AC_CHECK_DECLS(PROTOBUF_C_LABEL_NONE,
1357 AC_DEFINE([HAVE_PROTOBUF_VERSION_3],
1358 [1], [Have Protobuf version 3]),
1359 [PROTO3=false],
1360 [#include <google/protobuf-c/protobuf-c.h>])],
1361 [PROTO3=false && AC_MSG_FAILURE([protobuf3 requested but protobuf-c.h not found. Install protobuf-c.])])
1362fi
1363
1364AC_DEFINE([HAVE_PROTOBUF], [1], [protobuf])
1365#
1366# End of logic for protobuf support.
1367#
1368
1369
1370dnl ---------------------
1371dnl Integrated VTY option
1372dnl ---------------------
1373case "${enable_vtysh}" in
1374"no")
1375 VTYSH="";;
1376*)
1377 VTYSH="vtysh";
1378 AC_DEFINE([VTYSH], [1], [VTY shell])
1379
1380 prev_libs="$LIBS"
1381 AC_CHECK_LIB([readline], [readline], [
1382 LIBREADLINE="-lreadline"
1383 ], [
1384 dnl readline failed - it might be incorrectly linked and missing its
1385 dnl termcap/tinfo/curses dependency. see if we can fix that...
1386 AC_SEARCH_LIBS([tputs], [termcap tinfo curses ncurses], [
1387 LIBREADLINE="$ac_cv_search_tputs"
1388 ], [
1389 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1390 ])
1391
1392 dnl re-try with the lib we found above
1393 unset ac_cv_lib_readline_main
1394 AC_CHECK_LIB([readline], [main], [
1395 LIBREADLINE="-lreadline $LIBREADLINE"
1396 ], [
1397 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1398 ], [$LIBREADLINE])
1399 ], [])
1400 LIBS="$LIBS -lreadline"
1401 AC_CHECK_FUNCS([rl_clear_visible_line])
1402 LIBS="$prev_libs"
1403
1404 AC_CHECK_HEADER([readline/history.h])
1405 if test "$ac_cv_header_readline_history_h" = "no"; then
1406 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
1407 fi
1408 AC_CHECK_LIB([readline], [rl_completion_matches], [true], [], [$LIBREADLINE])
1409 if test "$ac_cv_lib_readline_rl_completion_matches" = "no"; then
1410 AC_DEFINE([rl_completion_matches], [completion_matches], [Old readline])
1411 fi
1412 AC_CHECK_LIB([readline], [append_history], [frr_cv_append_history=yes], [frr_cv_append_history=no], [$LIBREADLINE])
1413 if test "$frr_cv_append_history" = "yes"; then
1414 AC_DEFINE([HAVE_APPEND_HISTORY], [1], [Have history.h append_history])
1415 fi
1416 ;;
1417esac
1418AC_SUBST([LIBREADLINE])
1419
1420dnl ----------
1421dnl PAM module
1422dnl
1423dnl FRR detects the PAM library it is built against by checking for a
1424dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
1425dnl is known to #include pam_appl.h, the standard header of a PAM library, and
1426dnl openpam.h doesn't do that, although depends on the header too. Hence a
1427dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
1428dnl of OpenPAM.
1429dnl ----------
1430if test "$with_libpam" = "yes"; then
1431 AC_CHECK_HEADER([security/pam_misc.h],
1432 [AC_DEFINE([HAVE_PAM_MISC_H], [1], [Have pam_misc.h])
1433 AC_DEFINE([PAM_CONV_FUNC], [misc_conv], [Have misc_conv])
1434 pam_conv_func="misc_conv"
1435 ],
1436 [], FRR_INCLUDES)
1437 AC_CHECK_HEADER([security/openpam.h],
1438 [AC_DEFINE([HAVE_OPENPAM_H], [1], [Have openpam.h])
1439 AC_DEFINE([PAM_CONV_FUNC], [openpam_ttyconv], [Have openpam_ttyconv])
1440 pam_conv_func="openpam_ttyconv"
1441 ],
1442 [], FRR_INCLUDES[#include <security/pam_appl.h>])
1443 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
1444 AC_MSG_WARN([*** pam support will not be built ***])
1445 with_libpam="no"
1446 fi
1447fi
1448
1449if test "$with_libpam" = "yes"; then
1450dnl took this test from proftpds configure.in and suited to our needs
1451dnl -------------------------------------------------------------------------
1452dnl
1453dnl This next check looks funky due to a linker problem with some versions
1454dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
1455dnl omitted requiring libdl linking information. PAM-0.72 or better ships
1456dnl with RedHat 6.2 and Debian 2.2 or better.
1457AC_CHECK_LIB([pam], [pam_start],
1458 [AC_CHECK_LIB([pam], [$pam_conv_func],
1459 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1460 LIBPAM="-lpam"],
1461 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1462 LIBPAM="-lpam -lpam_misc"]
1463 )
1464 ],
1465
1466 [AC_CHECK_LIB([pam], [pam_end],
1467 [AC_CHECK_LIB([pam], [$pam_conv_func],
1468 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1469 LIBPAM="-lpam -ldl"],
1470 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1471 LIBPAM="-lpam -ldl -lpam_misc"]
1472 )
1473 ],AC_MSG_WARN([*** pam support will not be built ***]),
1474 [-ldl])
1475 ]
1476)
1477fi
1478AC_SUBST([LIBPAM])
1479
1480dnl -------------------------------
1481dnl bgpd needs pow() and hence libm
1482dnl -------------------------------
1483TMPLIBS="$LIBS"
1484LIBS=""
1485AC_SEARCH_LIBS([pow], [m], [
1486 LIBM="$LIBS"
1487], [
1488 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1489])
1490LIBS="$TMPLIBS"
1491AC_SUBST([LIBM])
1492
1493AC_CHECK_FUNCS([ppoll], [
1494 AC_DEFINE([HAVE_PPOLL], [1], [have Linux/BSD ppoll()])
1495])
1496AC_CHECK_FUNCS([pollts], [
1497 AC_DEFINE([HAVE_POLLTS], [1], [have NetBSD pollts()])
1498])
1499
1500AC_CHECK_HEADER([asm-generic/unistd.h],
1501 [AC_CHECK_DECL(__NR_setns,
1502 AC_DEFINE([HAVE_NETNS], [1], [Have netns]),,
1503 FRR_INCLUDES [#include <asm-generic/unistd.h>
1504 ])
1505 AC_CHECK_FUNCS([setns])]
1506 )
1507
1508dnl --------------------------
1509dnl Determine IS-IS I/O method
1510dnl --------------------------
1511AC_DEFINE([ISIS_METHOD_PFPACKET], [1], [constant value for isis method pfpacket])
1512AC_DEFINE([ISIS_METHOD_DLPI], [2], [constant value for isis method dlpi])
1513AC_DEFINE([ISIS_METHOD_BPF], [3], [constant value for isis method bpf])
1514AC_CHECK_HEADER([net/bpf.h])
1515AC_CHECK_HEADER([sys/dlpi.h])
1516AC_MSG_CHECKING([zebra IS-IS I/O method])
1517
1518case "$host_os" in
1519 linux*)
1520 AC_MSG_RESULT([pfpacket])
1521 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1522 ;;
1523 *)
1524 if test "$ac_cv_header_net_bpf_h" = "no"; then
1525 if test "$ac_cv_header_sys_dlpi_h" = "no"; then
1526 AC_MSG_RESULT([none])
1527 if test "$enable_isisd" = "yes" -o "$enable_fabricd" = "yes"; then
1528 AC_MSG_FAILURE([IS-IS support requested but no packet backend found])
1529 fi
1530 AC_MSG_WARN([*** IS-IS support will not be built ***])
1531 enable_isisd="no"
1532 enable_fabricd="no"
1533 else
1534 AC_MSG_RESULT([DLPI])
1535 fi
1536 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1537 else
1538 AC_MSG_RESULT([BPF])
1539 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
1540 fi
1541 ;;
1542esac
1543AC_DEFINE_UNQUOTED([ISIS_METHOD], [$ISIS_METHOD_MACRO], [selected method for isis, == one of the constants])
1544
1545dnl ---------------------------------------------------------------
1546dnl figure out how to specify an interface in multicast sockets API
1547dnl ---------------------------------------------------------------
1548AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1549
1550AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1551 #include <sys/socket.h>
1552 #include <netinet/in.h>
1553 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1554 #include <linux/types.h>
1555])
1556
1557AC_CHECK_HEADERS([linux/mroute6.h], [], [],[
1558 #include <sys/socket.h>
1559 #include <netinet/in.h>
1560 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1561 #include <linux/types.h>
1562])
1563
1564m4_define([FRR_INCLUDES],
1565FRR_INCLUDES
1566[#ifdef HAVE_LINUX_MROUTE_H
1567# include <linux/mroute.h>
1568#endif
1569])dnl
1570
1571AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1572 #include <sys/socket.h>
1573 #include <sys/types.h>
1574 #include <netinet/in.h>
1575 #include <net/route.h>
1576])
1577
1578m4_define([FRR_INCLUDES],
1579FRR_INCLUDES
1580[#ifdef HAVE_NETINET_IP_MROUTE_H
1581# include <netinet/ip_mroute.h>
1582#endif
1583])dnl
1584
1585AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1586AC_COMPILE_IFELSE(
1587[ AC_LANG_PROGRAM([[
1588 #include <sys/types.h>
1589 #include <netinet/in.h>
1590 ]], [[
1591 struct group_req gr;
1592 int sock;
1593 setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1594 ]])
1595],[
1596 AC_MSG_RESULT([yes])
1597 AC_DEFINE([HAVE_RFC3678], [1], [Have RFC3678 protocol-independed API])
1598],[
1599 AC_MSG_RESULT(no)
1600])
1601
1602dnl ---------------------------------------------------------------
1603dnl figure out how to check link-state
1604dnl ---------------------------------------------------------------
1605AC_CHECK_HEADER([net/if_media.h],
1606 [m4_define([LINK_DETECT_INCLUDES],
1607 FRR_INCLUDES
1608 [#include <net/if_media.h>
1609 ])
1610 AC_CHECK_MEMBERS([struct ifmediareq.ifm_status],
1611 AC_DEFINE([HAVE_BSD_LINK_DETECT], [1], [BSD link-detect]),
1612 [], LINK_DETECT_INCLUDES)],
1613 [],
1614 FRR_INCLUDES)
1615
1616dnl ---------------------------------------------------------------
1617dnl Additional, newer way to check link-state using ifi_link_state.
1618dnl Not available in all BSD's when ifmediareq available
1619dnl ---------------------------------------------------------------
1620AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1621 AC_DEFINE([HAVE_BSD_IFI_LINK_STATE], [1], [BSD ifi_link_state available]),
1622 [], FRR_INCLUDES)
1623
1624dnl ------------------------
1625dnl TCP_MD5SIG socket option
1626dnl ------------------------
1627
1628AC_CHECK_HEADER([netinet/tcp.h],
1629 [m4_define([MD5_INCLUDES],
1630 FRR_INCLUDES
1631 [#include <netinet/tcp.h>
1632 ])
1633 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1634 [],
1635 FRR_INCLUDES)
1636if test "$ac_cv_have_decl_TCP_MD5SIG" = "no"; then
1637 AC_CHECK_HEADER([linux/tcp.h],
1638 [m4_define([MD5_INCLUDES],
1639 FRR_INCLUDES
1640 [#include <linux/tcp.h>
1641 ])
1642 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1643fi
1644
1645LIBS_save="$LIBS"
1646AC_CHECK_LIB([crypt], [crypt], [], [
1647 AC_CHECK_LIB([crypto], [DES_crypt])
1648])
1649LIBCRYPT="$LIBS"
1650LIBCRYPT="${LIBCRYPT%$LIBS_save}"
1651LIBCRYPT="${LIBCRYPT#$LIBS_save}"
1652AC_SUBST([LIBCRYPT])
1653LIBS="$LIBS_save"
1654unset LIBS_save
1655
1656AC_CHECK_LIB([resolv], [res_init])
1657
1658dnl ---------------------------
1659dnl check system has PCRE regexp
1660dnl ---------------------------
1661if test "$enable_pcreposix" = "yes"; then
1662 AC_CHECK_LIB([pcreposix], [regexec], [], [
1663 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1664 ])
1665fi
1666AC_SUBST([HAVE_LIBPCREPOSIX])
1667
1668dnl ---------------------------
1669dnl check system has PCRE2 regexp
1670dnl ---------------------------
1671if test "$enable_pcre2posix" = "yes"; then
1672 AC_CHECK_LIB([pcre2-posix], [regexec], [], [
1673 AC_MSG_ERROR([--enable-pcre2posix given but unable to find libpcre2-posix])
1674 ])
1675fi
1676AC_SUBST([HAVE_LIBPCRE2_POSIX])
1677
1678dnl ##########################################################################
1679dnl test "$enable_clippy_only" != "yes"
1680fi
1681dnl END OF LARGE if block
1682dnl ##########################################################################
1683
1684dnl ------------------
1685dnl check C-Ares library
1686dnl ------------------
1687PKG_CHECK_MODULES([CARES], [libcares], [
1688 c_ares_found=true
1689],[
1690 c_ares_found=false
1691])
1692AM_CONDITIONAL([CARES], [$c_ares_found])
1693
1694
1695dnl ----------------------------------------------------------------------------
1696dnl figure out if domainname is available in the utsname struct (GNU extension).
1697dnl ----------------------------------------------------------------------------
1698AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1699
1700dnl ------------------
1701dnl IPv6 header checks
1702dnl ------------------
1703AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1704 netinet6/in6_var.h netinet6/nd6.h], [], [],
1705 FRR_INCLUDES)
1706
1707m4_define([FRR_INCLUDES],dnl
1708FRR_INCLUDES
1709[#ifdef HAVE_NETINET6_IN6_H
1710#include <netinet6/in6.h>
1711#endif
1712#ifdef HAVE_NETINET_IN6_VAR_H
1713#include <netinet/in6_var.h>
1714#endif
1715#include <netinet/icmp6.h>
1716#ifdef HAVE_NETINET6_IN6_VAR_H
1717# include <netinet6/in6_var.h>
1718#endif
1719#ifdef HAVE_NETINET6_ND6_H
1720# include <netinet6/nd6.h>
1721#endif
1722])dnl
1723
1724dnl --------------------
1725dnl Daemon disable check
1726dnl --------------------
1727
1728AS_IF([test "$enable_bgpd" != "no"], [
1729 AC_DEFINE([HAVE_BGPD], [1], [bgpd])
1730])
1731
1732AS_IF([test "$enable_mgmtd" != "no"], [
1733
1734 AC_DEFINE([HAVE_MGMTD], [1], [mgmtd])
1735])
1736
1737AS_IF([test "$enable_ripd" != "no"], [
1738 AC_DEFINE([HAVE_RIPD], [1], [ripd])
1739])
1740
1741AS_IF([test "$enable_ripngd" != "no"], [
1742 AC_DEFINE([HAVE_RIPNGD], [1], [ripngd])
1743])
1744
1745AS_IF([test "$enable_ospfd" != "no"], [
1746 AC_DEFINE([HAVE_OSPFD], [1], [ospfd])
1747])
1748
1749AS_IF([test "$enable_ospf6d" != "no"], [
1750 AC_DEFINE([HAVE_OSPF6D], [1], [ospf6d])
1751])
1752
1753AS_IF([test "$enable_ldpd" != "no"], [
1754 AC_DEFINE([HAVE_LDPD], [1], [ldpd])
1755])
1756
1757AS_IF([test "$enable_nhrpd" != "no"], [
1758 AC_DEFINE([HAVE_NHRPD], [1], [nhrpd])
1759])
1760
1761AS_IF([test "$enable_eigrpd" != "no"], [
1762 AC_DEFINE([HAVE_EIGRPD], [1], [eigrpd])
1763])
1764
1765AS_IF([test "$enable_babeld" != "no"], [
1766 AC_DEFINE([HAVE_BABELD], [1], [babeld])
1767])
1768
1769AS_IF([test "$enable_isisd" != "no"], [
1770 AC_DEFINE([HAVE_ISISD], [1], [isisd])
1771])
1772
1773AS_IF([test "$enable_pimd" != "no"], [
1774 AC_DEFINE([HAVE_PIMD], [1], [pimd])
1775])
1776
1777AS_IF([test "$enable_pim6d" != "no"], [
1778 AC_DEFINE([HAVE_PIM6D], [1], [pim6d])
1779])
1780
1781AS_IF([test "$enable_pbrd" != "no"], [
1782 AC_DEFINE([HAVE_PBRD], [1], [pbrd])
1783])
1784
1785AS_IF([test "$enable_sharpd" = "yes"], [
1786 AC_DEFINE([HAVE_SHARPD], [1], [sharpd])
1787])
1788
1789AS_IF([test "$enable_staticd" != "no"], [
1790 AC_DEFINE([HAVE_STATICD], [1], [staticd])
1791])
1792
1793AS_IF([test "$enable_fabricd" != "no"], [
1794 AC_DEFINE([HAVE_FABRICD], [1], [fabricd])
1795])
1796
1797AS_IF([test "$enable_vrrpd" != "no"], [
1798 AC_DEFINE([HAVE_VRRPD], [1], [vrrpd])
1799])
1800
1801if test "$enable_bfdd" = "no"; then
1802 AC_DEFINE([HAVE_BFDD], [0], [bfdd])
1803 BFDD=""
1804else
1805 AC_DEFINE([HAVE_BFDD], [1], [bfdd])
1806 BFDD="bfdd"
1807
1808 case $host_os in
1809 linux*)
1810 AC_DEFINE([BFD_LINUX], [1], [bfdd])
1811 ;;
1812
1813 *)
1814 AC_DEFINE([BFD_BSD], [1], [bfdd])
1815 ;;
1816 esac
1817fi
1818
1819AS_IF([test "$enable_pathd" != "no"], [
1820 AC_DEFINE([HAVE_PATHD], [1], [pathd])
1821])
1822
1823if test "$ac_cv_lib_json_c_json_object_get" = "no" -a "$BFDD" = "bfdd"; then
1824 AC_MSG_ERROR(["you must use json-c library to use bfdd"])
1825fi
1826
1827NHRPD=""
1828case "$host_os" in
1829 linux*)
1830 case "${enable_nhrpd}" in
1831 no)
1832 ;;
1833 yes)
1834 if test "$enable_clippy_only" != "yes"; then
1835 if test "$c_ares_found" != "true" ; then
1836 AC_MSG_ERROR([nhrpd requires libcares. Please install c-ares and its -dev headers.])
1837 fi
1838 fi
1839 NHRPD="nhrpd"
1840 ;;
1841 *)
1842 if test "$c_ares_found" = "true" ; then
1843 NHRPD="nhrpd"
1844 fi
1845 ;;
1846 esac
1847 ;;
1848 *)
1849 if test "$enable_nhrpd" = "yes"; then
1850 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1851 fi
1852 ;;
1853esac
1854
1855if test "$enable_watchfrr" = "no";then
1856 WATCHFRR=""
1857else
1858 WATCHFRR="watchfrr"
1859fi
1860
1861OSPFCLIENT=""
1862if test "$enable_ospfapi" != "no";then
1863 AC_DEFINE([SUPPORT_OSPF_API], [1], [OSPFAPI])
1864
1865 if test "$enable_ospfclient" != "no";then
1866 OSPFCLIENT="ospfclient"
1867 fi
1868fi
1869
1870if test "$enable_bgp_announce" = "no";then
1871 AC_DEFINE([DISABLE_BGP_ANNOUNCE], [1], [Disable BGP installation to zebra])
1872else
1873 AC_DEFINE([DISABLE_BGP_ANNOUNCE], [0], [Disable BGP installation to zebra])
1874fi
1875
1876if test "$enable_bgp_vnc" != "no";then
1877 AC_DEFINE([ENABLE_BGP_VNC], [1], [Enable BGP VNC support])
1878fi
1879
1880bgpd_bmp=false
1881case "${enable_bgp_bmp}" in
1882 no)
1883 ;;
1884 yes)
1885 if test "$c_ares_found" != "true" ; then
1886 AC_MSG_ERROR([BMP support requires libcares. Please install c-ares and its -dev headers.])
1887 fi
1888 bgpd_bmp=true
1889 ;;
1890 *)
1891 if test "$c_ares_found" = "true" ; then
1892 bgpd_bmp=true
1893 fi
1894 ;;
1895esac
1896
1897if test "$enable_version_build_config" != "no";then
1898 AC_DEFINE([ENABLE_VERSION_BUILD_CONFIG], [1], [Report build configs in show version])
1899fi
1900
1901dnl ##########################################################################
1902dnl LARGE if block
1903if test "$enable_clippy_only" != "yes"; then
1904dnl ##########################################################################
1905
1906dnl ------------------
1907dnl check Net-SNMP library
1908dnl ------------------
1909if test "$enable_snmp" != "" -a "$enable_snmp" != "no"; then
1910 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1911 if test "$NETSNMP_CONFIG" = "no"; then
1912 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1913 fi
1914 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1915 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1916 # net-snmp lists all of its own dependencies. we absolutely do not want that
1917 # among other things we avoid a GPL vs. OpenSSL license conflict here
1918 for removelib in crypto ssl sensors pci wrap; do
1919 SNMP_LIBS="`echo $SNMP_LIBS | sed -e 's/\(^\|\s\)-l'$removelib'\b/ /g' -e 's/\(^\|\s\)\([^\s]*\/\)\?lib'$removelib'\.[^\s]\+\b/ /g'`"
1920 done
1921 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1922 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
1923int main(void);
1924],
1925[
1926{
1927 return 0;
1928}
1929])], [
1930 AC_MSG_RESULT([no])
1931 AC_MSG_ERROR([--enable-snmp given but not usable])])
1932 case "${enable_snmp}" in
1933 yes)
1934 SNMP_METHOD=agentx
1935 ;;
1936 agentx)
1937 SNMP_METHOD="${enable_snmp}"
1938 ;;
1939 *)
1940 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use yes or agentx])
1941 ;;
1942 esac
1943 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1944 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,[SNMP method to interface with snmpd])
1945fi
1946AC_SUBST([SNMP_LIBS])
1947AC_SUBST([SNMP_CFLAGS])
1948
1949dnl ---------------
1950dnl libyang
1951dnl ---------------
1952PKG_CHECK_MODULES([LIBYANG], [libyang >= 2.0.0], , [
1953 AC_MSG_ERROR([libyang (>= 2.0.0) was not found on your system.])
1954])
1955ac_cflags_save="$CFLAGS"
1956CFLAGS="$CFLAGS $LIBYANG_CFLAGS"
1957AC_CHECK_MEMBER([struct lyd_node.priv], [], [
1958 AC_MSG_ERROR([m4_normalize([
1959 libyang needs to be compiled with ENABLE_LYD_PRIV=ON.
1960 Instructions for this are included in the build documentation for your platform at http://docs.frrouting.org/projects/dev-guide/en/latest/building.html])
1961 ])
1962], [[#include <libyang/libyang.h>]])
1963CFLAGS="$ac_cflags_save"
1964
1965dnl ---------------
1966dnl configuration rollbacks
1967dnl ---------------
1968SQLITE3=false
1969if test "$enable_config_rollbacks" = "yes"; then
1970 PKG_CHECK_MODULES([SQLITE3], [sqlite3], [
1971 AC_DEFINE([HAVE_CONFIG_ROLLBACKS], [1], [Enable configuration rollbacks])
1972 AC_DEFINE([HAVE_SQLITE3], [1], [Enable sqlite3 database])
1973 SQLITE3=true
1974 ], [
1975 AC_MSG_ERROR([--enable-config-rollbacks given but sqlite3 was not found on your system.])
1976 ])
1977fi
1978
1979dnl ---------------
1980dnl confd
1981dnl ---------------
1982if test "$enable_confd" != "" -a "$enable_confd" != "no"; then
1983 AC_CHECK_PROG([CONFD], [confd], [confd], [/bin/false], "${enable_confd}/bin")
1984 if test "$CONFD" = "/bin/false"; then
1985 AC_MSG_ERROR([confd was not found on your system.])]
1986 fi
1987 AC_CHECK_PROG([CONFDC], [confdc], [confdc], [/bin/false], "${enable_confd}/bin")
1988 CONFD_CFLAGS="-I${enable_confd}/include -L${enable_confd}/lib"
1989 AC_SUBST([CONFD_CFLAGS])
1990 CONFD_LIBS="-lconfd"
1991 AC_SUBST([CONFD_LIBS])
1992 AC_DEFINE([HAVE_CONFD], [1], [Enable confd integration])
1993fi
1994
1995dnl ---------------
1996dnl sysrepo
1997dnl ---------------
1998if test "$enable_sysrepo" = "yes"; then
1999 PKG_CHECK_MODULES([SYSREPO], [sysrepo >= 2.1.42],
2000 [AC_DEFINE([HAVE_SYSREPO], [1], [Enable sysrepo integration])
2001 SYSREPO=true],
2002 [SYSREPO=false
2003 AC_MSG_ERROR([sysrepo was not found on your system.])]
2004 )
2005fi
2006
2007dnl ---------------
2008dnl gRPC
2009dnl ---------------
2010if test "$enable_grpc" = "yes"; then
2011 AC_LANG_PUSH([C++])
2012 AX_CXX_COMPILE_STDCXX([11], [ext])
2013 PKG_CHECK_MODULES([GRPC], [grpc >= 6.0.0 grpc++ >= 1.16.1 protobuf >= 3.6.1 ], [
2014 AC_CHECK_PROGS([PROTOC], [protoc], [/bin/false])
2015 if test "$PROTOC" = "/bin/false"; then
2016 AC_MSG_FAILURE([grpc requested but protoc not found.])
2017 fi
2018
2019 AC_DEFINE([HAVE_GRPC], [1], [Enable the gRPC northbound plugin])
2020 GRPC=true
2021 ], [
2022 GRPC=false
2023 AC_MSG_ERROR([grpc/grpc++ were not found on your system.])
2024 ])
2025 AC_LANG_POP([C++])
2026fi
2027
2028dnl ---------
2029dnl DPDK
2030dnl ---------
2031if test "$enable_dp_dpdk" = "yes"; then
2032 PKG_CHECK_MODULES([DPDK], [libdpdk], [
2033 AC_DEFINE([HAVE_DPDK], [1], [Enable DPDK backend])
2034 DPDK=true
2035 ], [
2036 AC_MSG_ERROR([configuration specifies --enable-dp-dpdk but DPDK libs were not found])
2037 ])
2038fi
2039
2040dnl -----
2041dnl LTTng
2042dnl -----
2043if test "$enable_lttng" = "yes"; then
2044 PKG_CHECK_MODULES([UST], [lttng-ust >= 2.9.0], [
2045 AC_DEFINE([HAVE_LTTNG], [1], [Enable LTTng support])
2046 LTTNG=true
2047 ], [
2048 AC_MSG_ERROR([configuration specifies --enable-lttng but lttng-ust was not found])
2049 ])
2050fi
2051
2052dnl ----
2053dnl USDT
2054dnl ----
2055if test "$enable_usdt" = "yes"; then
2056 AC_CHECK_HEADERS([sys/sdt.h], [
2057 AC_DEFINE([HAVE_USDT], [1], [Enable USDT probes])
2058 USDT=true
2059 ], [
2060 AC_MSG_ERROR([configuration specifies --enable-usdt but no USDT kernel headers (sys/sdt.h) found])
2061 ])
2062fi
2063
2064dnl ------
2065dnl ZeroMQ
2066dnl ------
2067if test "$enable_zeromq" != "no"; then
2068 PKG_CHECK_MODULES([ZEROMQ], [libzmq >= 4.0.0], [
2069 AC_DEFINE([HAVE_ZEROMQ], [1], [Enable ZeroMQ support])
2070 ZEROMQ=true
2071 ], [
2072 if test "$enable_zeromq" = "yes"; then
2073 AC_MSG_ERROR([configuration specifies --enable-zeromq but libzmq was not found])
2074 fi
2075 ])
2076fi
2077
2078dnl ------------------------------------
2079dnl Enable RPKI and add librtr to libs
2080dnl ------------------------------------
2081if test "$enable_rpki" = "yes"; then
2082 PKG_CHECK_MODULES([RTRLIB], [rtrlib >= 0.8.0],
2083 [RPKI=true],
2084 [RPKI=false
2085 AC_MSG_ERROR([rtrlib was not found on your system or is too old.])]
2086 )
2087fi
2088
2089dnl ------------------------------------
2090dnl pimd and pim6d not supported on OpenBSD and MacOS
2091dnl ------------------------------------
2092if test "$enable_pimd" != "no"; then
2093AC_MSG_CHECKING([for pimd OS support])
2094case "$host_os" in
2095 darwin*)
2096 AC_MSG_RESULT([no])
2097 enable_pimd="no"
2098 ;;
2099 openbsd*)
2100 AC_MSG_RESULT([no])
2101 enable_pimd="no"
2102 ;;
2103 *)
2104 AC_MSG_RESULT([yes])
2105 ;;
2106esac
2107fi
2108
2109if test "$enable_pim6d" != "no"; then
2110AC_MSG_CHECKING([for pim6d OS support])
2111case "$host_os" in
2112 linux*)
2113 AC_MSG_RESULT([yes])
2114 ;;
2115 *)
2116 AC_MSG_RESULT([no])
2117 enable_pim6d="no"
2118 ;;
2119esac
2120fi
2121
2122dnl -------------------------------------
2123dnl VRRP is only supported on linux
2124dnl -------------------------------------
2125if test "$enable_vrrpd" != "no"; then
2126AC_MSG_CHECKING([for VRRP OS support])
2127case "$host_os" in
2128 linux*)
2129 AC_MSG_RESULT([yes])
2130 ;;
2131 *)
2132 AC_MSG_RESULT([no])
2133 enable_vrrpd="no"
2134 ;;
2135esac
2136fi
2137
2138dnl ------------------------------------------
2139dnl Check whether rtrlib was build with ssh support
2140dnl ------------------------------------------
2141AC_MSG_CHECKING([whether the RTR Library is compiled with SSH])
2142AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "rtrlib/rtrlib.h"]],
2143 [[struct tr_ssh_config config;]])],
2144 [AC_MSG_RESULT([yes])
2145 AC_DEFINE([FOUND_SSH], [1], [found_ssh])],
2146 AC_MSG_RESULT([no])
2147)
2148
2149dnl ---------------
2150dnl dlopen & dlinfo
2151dnl ---------------
2152LIBS_save="$LIBS"
2153AC_SEARCH_LIBS([dlopen], [dl dld], [], [
2154 AC_MSG_ERROR([unable to find the dlopen()])
2155])
2156
2157AC_CHECK_HEADERS([link.h])
2158
2159AC_CACHE_CHECK([for dlinfo(RTLD_DI_ORIGIN)], [frr_cv_rtld_di_origin], [
2160 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
2161#include <stdlib.h>
2162#ifdef HAVE_LINK_H
2163#include <link.h>
2164#endif
2165#include <dlfcn.h>
2166]], [[
2167 char origin[1];
2168 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
2169]])], [
2170 frr_cv_rtld_di_origin=yes
2171 ], [
2172 frr_cv_rtld_di_origin=no
2173 ])
2174])
2175if test "$frr_cv_rtld_di_origin" = "yes"; then
2176 AC_DEFINE([HAVE_DLINFO_ORIGIN], [1], [Have dlinfo RTLD_DI_ORIGIN])
2177fi
2178
2179AC_CACHE_CHECK([for dlinfo(RTLD_DI_LINKMAP)], [frr_cv_rtld_di_linkmap], [
2180 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
2181#include <stdlib.h>
2182#ifdef HAVE_LINK_H
2183#include <link.h>
2184#endif
2185#include <dlfcn.h>
2186]], [[
2187 struct link_map *lm = NULL;
2188 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
2189]])], [
2190 frr_cv_rtld_di_linkmap=yes
2191 ], [
2192 frr_cv_rtld_di_linkmap=no
2193 ])
2194])
2195if test "$frr_cv_rtld_di_linkmap" = "yes"; then
2196 AC_DEFINE([HAVE_DLINFO_LINKMAP], [1], [Have dlinfo RTLD_DI_LINKMAP])
2197fi
2198
2199LIBDL="$LIBS"
2200LIBDL="${LIBDL%$LIBS_save}"
2201LIBDL="${LIBDL#$LIBS_save}"
2202AC_SUBST([LIBDL])
2203LIBS="$LIBS_save"
2204unset LIBS_save
2205
2206dnl ##########################################################################
2207dnl test "$enable_clippy_only" != "yes"
2208fi
2209dnl END OF LARGE if block
2210dnl ##########################################################################
2211
2212dnl ---------------------------
2213dnl sockaddr and netinet checks
2214dnl ---------------------------
2215AC_CHECK_TYPES([
2216 struct sockaddr_dl,
2217 struct vifctl, struct mfcctl, struct sioc_sg_req,
2218 vifi_t, struct sioc_vif_req, struct igmpmsg,
2219 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
2220 struct nd_opt_adv_interval,
2221 struct nd_opt_homeagent_info, struct nd_opt_adv_interval,
2222 struct nd_opt_rdnss, struct nd_opt_dnssl],
2223 [], [], FRR_INCLUDES)
2224
2225AC_CHECK_MEMBERS([struct sockaddr.sa_len,
2226 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
2227 struct sockaddr_dl.sdl_len,
2228 struct if6_aliasreq.ifra_lifetime,
2229 struct nd_opt_adv_interval.nd_opt_ai_type],
2230 [], [], FRR_INCLUDES)
2231
2232dnl ---------------------------
2233dnl IRDP/pktinfo/icmphdr checks
2234dnl ---------------------------
2235
2236AC_CHECK_TYPES([struct in_pktinfo], [
2237 AC_CHECK_TYPES([struct icmphdr], [
2238 IRDP=true
2239 ], [
2240 IRDP=false
2241 ], [FRR_INCLUDES])
2242], [
2243 IRDP=false
2244], [FRR_INCLUDES])
2245
2246case "${enable_irdp}" in
2247yes)
2248 $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
2249 ;;
2250no)
2251 IRDP=false
2252 ;;
2253esac
2254
2255
2256dnl -----------------------
2257dnl checking for IP_PKTINFO
2258dnl -----------------------
2259AC_MSG_CHECKING([for IP_PKTINFO])
2260AC_COMPILE_IFELSE(
2261[ AC_LANG_PROGRAM([[
2262 #include <netdb.h>
2263 ]], [[
2264 int opt = IP_PKTINFO;
2265 ]])
2266],[
2267 AC_MSG_RESULT([yes])
2268 AC_DEFINE([HAVE_IP_PKTINFO], [1], [Have IP_PKTINFO])
2269],[
2270 AC_MSG_RESULT([no])
2271])
2272
2273dnl ---------------------------
2274dnl checking for IP_RECVDSTADDR
2275dnl ---------------------------
2276AC_MSG_CHECKING([for IP_RECVDSTADDR])
2277AC_COMPILE_IFELSE(
2278[ AC_LANG_PROGRAM([[
2279 #include <netinet/in.h>
2280 ]], [[
2281 int opt = IP_RECVDSTADDR;
2282 ]])
2283],[
2284 AC_MSG_RESULT([yes])
2285 AC_DEFINE([HAVE_IP_RECVDSTADDR], [1], [Have IP_RECVDSTADDR])
2286],[
2287 AC_MSG_RESULT([no])
2288])
2289
2290dnl ----------------------
2291dnl checking for IP_RECVIF
2292dnl ----------------------
2293AC_MSG_CHECKING([for IP_RECVIF])
2294AC_COMPILE_IFELSE(
2295[ AC_LANG_PROGRAM([[
2296 #include <netinet/in.h>
2297 ]], [[
2298 int opt = IP_RECVIF;
2299 ]])
2300],[
2301 AC_MSG_RESULT([yes])
2302 AC_DEFINE([HAVE_IP_RECVIF], [1], [Have IP_RECVIF])
2303],[
2304 AC_MSG_RESULT([no])
2305])
2306
2307dnl ----------------------
2308dnl checking for SO_BINDANY
2309dnl ----------------------
2310AC_MSG_CHECKING([for SO_BINDANY])
2311AC_COMPILE_IFELSE(
2312[ AC_LANG_PROGRAM([[
2313 #include <sys/socket.h>
2314 ]], [[
2315 int opt = SO_BINDANY;
2316 ]])
2317],[
2318 AC_MSG_RESULT([yes])
2319 AC_DEFINE([HAVE_SO_BINDANY], [1], [Have SO_BINDANY])
2320],[
2321 AC_MSG_RESULT([no])
2322])
2323
2324dnl ----------------------
2325dnl checking for IP_FREEBIND
2326dnl ----------------------
2327AC_MSG_CHECKING([for IP_FREEBIND])
2328AC_COMPILE_IFELSE(
2329[ AC_LANG_PROGRAM([[
2330 #include <netinet/in.h>
2331 ]], [[
2332 int opt = IP_FREEBIND;
2333 ]])
2334],[
2335 AC_MSG_RESULT([yes])
2336 AC_DEFINE([HAVE_IP_FREEBIND], [1], [Have IP_FREEBIND])
2337],[
2338 AC_MSG_RESULT([no])
2339])
2340
2341dnl --------------------------------------
2342dnl checking for be32dec existence or not
2343dnl --------------------------------------
2344AC_CHECK_DECLS([be32enc, be32dec], [], [], [
2345 #ifdef HAVE_SYS_ENDIAN_H
2346 #include <sys/endian.h>
2347 #endif
2348 #ifdef HAVE_ENDIAN_H
2349 #include <endian.h>
2350 #endif
2351])
2352
2353dnl --------------------------------------
2354dnl checking for clock_time monotonic struct and call
2355dnl --------------------------------------
2356AC_CHECK_DECL([CLOCK_MONOTONIC],
2357 [AC_CHECK_LIB([rt], [clock_gettime], [LIBS="$LIBS -lrt"])
2358 AC_DEFINE([HAVE_CLOCK_MONOTONIC], [1], [Have monotonic clock])
2359], [AC_MSG_RESULT([no])], [FRR_INCLUDES])
2360
2361AC_CHECK_DECL([CLOCK_THREAD_CPUTIME_ID], [
2362 AC_DEFINE([HAVE_CLOCK_THREAD_CPUTIME_ID], [1], [Have cpu-time clock])
2363], [AC_MSG_RESULT([no])], [FRR_INCLUDES])
2364
2365AC_SEARCH_LIBS([clock_nanosleep], [rt], [
2366 AC_DEFINE([HAVE_CLOCK_NANOSLEEP], [1], [Have clock_nanosleep()])
2367])
2368
2369dnl --------------------------------------
2370dnl checking for flex and bison
2371dnl --------------------------------------
2372
2373dnl autoconf 2.69 AC_PROG_LEX has no parameters
2374dnl autoconf 2.70 AC_PROG_LEX prints a deprecation warning without params
2375m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.70]), [-1], [dnl
2376 dnl autoconf < 2.70
2377 AC_PROG_LEX
2378], [
2379 dnl autoconf >= 2.70
2380 AC_PROG_LEX([noyywrap])
2381])
2382
2383AC_MSG_CHECKING([version of flex])
2384frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
2385frr_ac_flex_version="${frr_ac_flex_version##* }"
2386AC_MSG_RESULT([$frr_ac_flex_version])
2387AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
2388 LEX="$SHELL $missing_dir/missing flex"
2389 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
2390 AC_MSG_WARN([using pregenerated flex output files])
2391 else
2392 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
2393 fi
2394 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
2395 AC_SUBST([LEXLIB], [''])
2396])
2397
2398AC_PROG_YACC
2399dnl thanks GNU bison for this b*llshit...
2400AC_MSG_CHECKING([version of bison])
2401frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
2402frr_ac_bison_version="${frr_ac_bison_version##* }"
2403frr_ac_bison_missing="false"
2404case "x${frr_ac_bison_version}x" in
2405 x2.7*)
2406 BISON_OPENBRACE='"'
2407 BISON_CLOSEBRACE='"'
2408 BISON_VERBOSE=''
2409 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
2410 ;;
2411 x2.*|x1.*)
2412 AC_MSG_RESULT([$frr_ac_bison_version])
2413 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
2414 frr_ac_bison_missing="true"
2415 ;;
2416 x)
2417 AC_MSG_RESULT([none])
2418 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
2419 frr_ac_bison_missing="true"
2420 ;;
2421 x3.[012][^0-9]*)
2422 BISON_OPENBRACE='{'
2423 BISON_CLOSEBRACE='}'
2424 BISON_VERBOSE='-Dparse.error=verbose'
2425 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 to 3.2])
2426 ;;
2427 *)
2428 BISON_OPENBRACE='{'
2429 BISON_CLOSEBRACE='}'
2430 BISON_VERBOSE='-Dparse.error=verbose -Wno-yacc'
2431 AC_MSG_RESULT([$frr_ac_bison_version - 3.3 or newer])
2432 ;;
2433esac
2434AC_SUBST([BISON_OPENBRACE])
2435AC_SUBST([BISON_CLOSEBRACE])
2436AC_SUBST([BISON_VERBOSE])
2437
2438if $frr_ac_bison_missing; then
2439 YACC="$SHELL $missing_dir/missing bison -y"
2440 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
2441 AC_MSG_WARN([using pregenerated bison output files])
2442 else
2443 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
2444 fi
2445fi
2446
2447dnl -------------------
2448dnl capabilities checks
2449dnl -------------------
2450if test "$enable_capabilities" != "no"; then
2451 AC_MSG_CHECKING([whether prctl PR_SET_KEEPCAPS is available])
2452 AC_COMPILE_IFELSE(
2453 [ AC_LANG_PROGRAM([[
2454 #include <sys/prctl.h>
2455 ]], [[
2456 prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
2457 ]])
2458 ],[AC_MSG_RESULT([yes])
2459 AC_DEFINE([HAVE_PR_SET_KEEPCAPS], [1], [prctl])
2460 frr_ac_keepcaps="yes"
2461 ],[AC_MSG_RESULT(no)
2462 ])
2463 if test "$frr_ac_keepcaps" = "yes"; then
2464 AC_CHECK_HEADERS([sys/capability.h])
2465 fi
2466 if test "$ac_cv_header_sys_capability_h" = "yes"; then
2467 AC_CHECK_LIB([cap], [cap_init],
2468 [AC_DEFINE([HAVE_LCAPS], [1], [Capabilities])
2469 LIBCAP="-lcap"
2470 frr_ac_lcaps="yes"]
2471 )
2472 fi
2473 if test "$frr_ac_scaps" = "yes" \
2474 -o "$frr_ac_lcaps" = "yes"; then
2475 AC_DEFINE([HAVE_CAPABILITIES], [1], [capabilities])
2476 fi
2477
2478 case "$host_os" in
2479 linux*)
2480 if test "$enable_clippy_only" != "yes"; then
2481 if test "$frr_ac_lcaps" != "yes"; then
2482 AC_MSG_ERROR([libcap and/or its headers were not found. Running FRR without libcap support built in causes a huge performance penalty.])
2483 fi
2484 fi
2485 ;;
2486 esac
2487else
2488 case "$host_os" in
2489 linux*)
2490 AC_MSG_WARN([Running FRR without libcap support built in causes a huge performance penalty.])
2491 ;;
2492 esac
2493fi
2494AC_SUBST([LIBCAP])
2495
2496dnl ---------------------------
2497dnl check for glibc 'backtrace'
2498dnl ---------------------------
2499if test "$enable_backtrace" != "no" ; then
2500 backtrace_ok=no
2501 PKG_CHECK_MODULES([UNWIND], [libunwind], [
2502 AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
2503 backtrace_ok=yes
2504 ], [
2505 true
2506 ])
2507
2508 if test "$backtrace_ok" = "no"; then
2509 AC_CHECK_HEADER([unwind.h], [
2510 AC_SEARCH_LIBS([unw_getcontext], [unwind], [
2511 AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
2512 backtrace_ok=yes
2513 ])
2514 ])
2515 fi
2516
2517 if test "$backtrace_ok" = "no"; then
2518 AC_CHECK_HEADER([execinfo.h], [
2519 AC_SEARCH_LIBS([backtrace], [execinfo], [
2520 AC_DEFINE([HAVE_GLIBC_BACKTRACE], [1], [Glibc backtrace])
2521 backtrace_ok=yes
2522 ],, [-lm])
2523 ])
2524 fi
2525
2526 if test "$enable_backtrace" = "yes" -a "$backtrace_ok" = "no"; then
2527 dnl user explicitly requested backtrace but we failed to find support
2528 AC_MSG_FAILURE([failed to find backtrace or libunwind support])
2529 fi
2530fi
2531
2532dnl -----------------------------------------
2533dnl check for malloc mallinfo struct and call
2534dnl this must try and link using LIBS, in
2535dnl order to check no alternative allocator
2536dnl has been specified, which might not provide
2537dnl mallinfo
2538dnl -----------------------------------------
2539AC_CHECK_HEADERS([malloc.h malloc_np.h malloc/malloc.h],,, [FRR_INCLUDES])
2540
2541AC_CACHE_CHECK([whether mallinfo is available], [frr_cv_mallinfo], [
2542 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2543#ifdef HAVE_MALLOC_H
2544#include <malloc.h>
2545#endif
2546#ifdef HAVE_MALLOC_NP_H
2547#include <malloc_np.h>
2548#endif
2549#ifdef HAVE_MALLOC_MALLOC_H
2550#include <malloc/malloc.h>
2551#endif
2552]], [[
2553struct mallinfo ac_x; ac_x = mallinfo ();
2554]])], [
2555 frr_cv_mallinfo=yes
2556 ], [
2557 frr_cv_mallinfo=no
2558 ])
2559])
2560if test "$frr_cv_mallinfo" = "yes"; then
2561 AC_DEFINE([HAVE_MALLINFO], [1], [mallinfo])
2562fi
2563
2564AC_CACHE_CHECK([whether mallinfo2 is available], [frr_cv_mallinfo2], [
2565 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2566#ifdef HAVE_MALLOC_H
2567#include <malloc.h>
2568#endif
2569#ifdef HAVE_MALLOC_NP_H
2570#include <malloc_np.h>
2571#endif
2572#ifdef HAVE_MALLOC_MALLOC_H
2573#include <malloc/malloc.h>
2574#endif
2575]], [[
2576struct mallinfo2 ac_x; ac_x = mallinfo2 ();
2577]])], [
2578 frr_cv_mallinfo2=yes
2579 ], [
2580 frr_cv_mallinfo2=no
2581 ])
2582])
2583if test "$frr_cv_mallinfo2" = "yes"; then
2584 AC_DEFINE([HAVE_MALLINFO2], [1], [mallinfo2])
2585fi
2586
2587AC_MSG_CHECKING([whether malloc_usable_size is available])
2588AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2589#ifdef HAVE_MALLOC_H
2590#include <malloc.h>
2591#endif
2592#ifdef HAVE_MALLOC_MALLOC_H
2593#include <malloc/malloc.h>
2594#endif
2595]], [[
2596size_t ac_x; ac_x = malloc_usable_size(NULL);
2597]])], [
2598 AC_MSG_RESULT([yes])
2599 AC_DEFINE([HAVE_MALLOC_USABLE_SIZE], [1], [malloc_usable_size])
2600], [
2601 AC_MSG_RESULT([no])
2602
2603 AC_MSG_CHECKING([whether malloc_size is available])
2604 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
2605#ifdef HAVE_MALLOC_H
2606#include <malloc.h>
2607#endif
2608#ifdef HAVE_MALLOC_MALLOC_H
2609#include <malloc/malloc.h>
2610#endif
2611]], [[
2612size_t ac_x; ac_x = malloc_size(NULL);
2613]])], [
2614 AC_MSG_RESULT([yes])
2615 AC_DEFINE([HAVE_MALLOC_SIZE], [1], [malloc_size])
2616 ], [
2617 AC_MSG_RESULT([no])
2618 ])
2619])
2620
2621dnl ----------
2622dnl configure date
2623dnl ----------
2624dev_version=`echo $VERSION | grep dev`
2625#don't expire deprecated code in non 'dev' branch
2626if test "$dev_version" = ""; then
2627 CONFDATE=0
2628else
2629 CONFDATE=`date '+%Y%m%d'`
2630fi
2631AC_SUBST([CONFDATE])
2632
2633dnl ------------------------------
2634dnl set paths for state directory
2635dnl ------------------------------
2636AC_MSG_CHECKING([directory to use for state file])
2637if test "$prefix" = "NONE"; then
2638 frr_statedir_prefix="";
2639else
2640 frr_statedir_prefix=${prefix}
2641fi
2642if test "$localstatedir" = '${prefix}/var'; then
2643 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
2644 ${frr_statedir_prefix}/var/adm dnl
2645 ${frr_statedir_prefix}/etc dnl
2646 /var/run dnl
2647 /var/adm dnl
2648 /etc dnl
2649 /dev/null;
2650 do
2651 test -d $FRR_STATE_DIR && break
2652 done
2653 frr_statedir=$FRR_STATE_DIR
2654else
2655 frr_statedir=${localstatedir}
2656fi
2657if test "$frr_statedir" = "/dev/null"; then
2658 AC_MSG_ERROR([STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!])
2659fi
2660AC_MSG_RESULT([${frr_statedir}])
2661AC_SUBST([frr_statedir])
2662
2663AC_DEFINE_UNQUOTED([LDPD_SOCKET], ["$frr_statedir%s%s/ldpd.sock"], [ldpd control socket])
2664AC_DEFINE_UNQUOTED([ZEBRA_SERV_PATH], ["$frr_statedir%s%s/zserv.api"], [zebra api socket])
2665AC_DEFINE_UNQUOTED([BFDD_CONTROL_SOCKET], ["$frr_statedir%s%s/bfdd.sock"], [bfdd control socket])
2666AC_DEFINE_UNQUOTED([OSPFD_GR_STATE], ["$frr_statedir%s/ospfd-gr.json"], [ospfd GR state information])
2667AC_DEFINE_UNQUOTED([MGMTD_FE_SERVER_PATH], ["$frr_statedir/mgmtd_fe.sock"], [mgmtd frontend server socket])
2668AC_DEFINE_UNQUOTED([MGMTD_BE_SERVER_PATH], ["$frr_statedir/mgmtd_be.sock"], [mgmtd backend server socket])
2669AC_DEFINE_UNQUOTED([OSPF6D_GR_STATE], ["$frr_statedir/ospf6d-gr.json"], [ospf6d GR state information])
2670AC_DEFINE_UNQUOTED([ISISD_RESTART], ["$frr_statedir%s/isid-restart.json"], [isisd restart information])
2671AC_DEFINE_UNQUOTED([OSPF6_AUTH_SEQ_NUM_FILE], ["$frr_statedir/ospf6d-at-seq-no.dat"], [ospf6d AT Sequence number information])
2672AC_DEFINE_UNQUOTED([DAEMON_VTY_DIR], ["$frr_statedir%s%s"], [daemon vty directory])
2673AC_DEFINE_UNQUOTED([DAEMON_DB_DIR], ["$frr_statedir"], [daemon database directory])
2674
2675dnl autoconf does this, but it does it too late...
2676test "$prefix" = "NONE" && prefix=$ac_default_prefix
2677test "$exec_prefix" = "NONE" && exec_prefix='${prefix}'
2678
2679dnl get the full path, recursing through variables...
2680vtysh_bin="$bindir/vtysh"
2681for I in 1 2 3 4 5 6 7 8 9 10; do
2682 eval vtysh_bin="\"$vtysh_bin\""
2683done
2684AC_DEFINE_UNQUOTED([VTYSH_BIN_PATH], ["$vtysh_bin"], [path to vtysh binary])
2685AC_SUBST([vtysh_bin])
2686
2687CFG_SYSCONF="$sysconfdir"
2688CFG_SBIN="$sbindir"
2689CFG_STATE="$frr_statedir"
2690CFG_MODULE="$moduledir"
2691CFG_YANGMODELS="$yangmodelsdir"
2692CFG_SCRIPT="$scriptdir"
2693for I in 1 2 3 4 5 6 7 8 9 10; do
2694 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
2695 eval CFG_SBIN="\"$CFG_SBIN\""
2696 eval CFG_STATE="\"$CFG_STATE\""
2697 eval CFG_MODULE="\"$CFG_MODULE\""
2698 eval CFG_YANGMODELS="\"$CFG_YANGMODELS\""
2699 eval CFG_SCRIPT="\"$CFG_SCRIPT\""
2700done
2701AC_SUBST([CFG_SYSCONF])
2702AC_SUBST([CFG_SBIN])
2703AC_SUBST([CFG_STATE])
2704AC_SUBST([CFG_MODULE])
2705AC_SUBST([CFG_SCRIPT])
2706AC_SUBST([CFG_YANGMODELS])
2707AC_DEFINE_UNQUOTED([MODULE_PATH], ["$CFG_MODULE"], [path to modules])
2708AC_DEFINE_UNQUOTED([SCRIPT_PATH], ["$CFG_SCRIPT"], [path to scripts])
2709AC_DEFINE_UNQUOTED([YANG_MODELS_PATH], ["$CFG_YANGMODELS"], [path to YANG data models])
2710AC_DEFINE_UNQUOTED([WATCHFRR_SH_PATH], ["${CFG_SBIN%/}/watchfrr.sh"], [path to watchfrr.sh])
2711
2712dnl various features
2713AM_CONDITIONAL([SUPPORT_REALMS], [test "$enable_realms" = "yes"])
2714AM_CONDITIONAL([ENABLE_BGP_VNC], [test "$enable_bgp_vnc" != "no"])
2715AM_CONDITIONAL([BGP_BMP], [$bgpd_bmp])
2716dnl northbound
2717AM_CONDITIONAL([SQLITE3], [$SQLITE3])
2718AM_CONDITIONAL([CONFD], [test "$enable_confd" != ""])
2719AM_CONDITIONAL([SYSREPO], [test "$enable_sysrepo" = "yes"])
2720AM_CONDITIONAL([GRPC], [test "$enable_grpc" = "yes"])
2721AM_CONDITIONAL([ZEROMQ], [test "$ZEROMQ" = "true"])
2722dnl plugins
2723AM_CONDITIONAL([RPKI], [test "$RPKI" = "true"])
2724AM_CONDITIONAL([SNMP], [test "$SNMP_METHOD" = "agentx"])
2725AM_CONDITIONAL([IRDP], [$IRDP])
2726AM_CONDITIONAL([FPM], [test "$enable_fpm" = "yes"])
2727AM_CONDITIONAL([HAVE_PROTOBUF], [test "$enable_protobuf" != "no"])
2728AM_CONDITIONAL([HAVE_PROTOBUF3], [$PROTO3])
2729
2730dnl PCEP plugin
2731AS_IF([test "$enable_pathd" != "no"], [
2732 AC_SUBST([PATHD_PCEP_LIBS], ["pceplib/libpcep_pcc.la"])
2733 AC_SUBST([PATHD_PCEP_INCL], ["-I./pceplib "])
2734 ])
2735AC_CHECK_LIB([cunit], [CU_initialize_registry], [pcep_cunit=yes],[pcep_cunit=no])
2736AM_CONDITIONAL([PATHD_PCEP_TEST], [test "x${pcep_cunit}" = xyes])
2737AC_CHECK_PROG(VALGRIND_CHECK, valgrind, yes)
2738AM_CONDITIONAL([HAVE_VALGRIND_PCEP], [test "$VALGRIND_CHECK" = "yes"])
2739
2740dnl daemons
2741AM_CONDITIONAL([VTYSH], [test "$VTYSH" = "vtysh"])
2742AM_CONDITIONAL([ZEBRA], [test "$enable_zebra" != "no"])
2743AM_CONDITIONAL([BGPD], [test "$enable_bgpd" != "no"])
2744AM_CONDITIONAL([MGMTD], [test "$enable_mgmtd" != "no"])
2745AM_CONDITIONAL([RIPD], [test "$enable_ripd" != "no"])
2746AM_CONDITIONAL([OSPFD], [test "$enable_ospfd" != "no"])
2747AM_CONDITIONAL([LDPD], [test "$enable_ldpd" != "no"])
2748AM_CONDITIONAL([BFDD], [test "$BFDD" = "bfdd"])
2749AM_CONDITIONAL([NHRPD], [test "$NHRPD" = "nhrpd"])
2750AM_CONDITIONAL([EIGRPD], [test "$enable_eigrpd" != "no"])
2751AM_CONDITIONAL([WATCHFRR], [test "$WATCHFRR" = "watchfrr"])
2752AM_CONDITIONAL([OSPFCLIENT], [test "$OSPFCLIENT" = "ospfclient"])
2753AM_CONDITIONAL([RIPNGD], [test "$enable_ripngd" != "no"])
2754AM_CONDITIONAL([BABELD], [test "$enable_babeld" != "no"])
2755AM_CONDITIONAL([OSPF6D], [test "$enable_ospf6d" != "no"])
2756AM_CONDITIONAL([ISISD], [test "$enable_isisd" != "no"])
2757AM_CONDITIONAL([PIMD], [test "$enable_pimd" != "no"])
2758AM_CONDITIONAL([PIM6D], [test "$enable_pim6d" != "no"])
2759AM_CONDITIONAL([PBRD], [test "$enable_pbrd" != "no"])
2760AM_CONDITIONAL([SHARPD], [test "$enable_sharpd" = "yes"])
2761AM_CONDITIONAL([STATICD], [test "$enable_staticd" != "no"])
2762AM_CONDITIONAL([FABRICD], [test "$enable_fabricd" != "no"])
2763AM_CONDITIONAL([VRRPD], [test "$enable_vrrpd" != "no"])
2764AM_CONDITIONAL([PATHD], [test "$enable_pathd" != "no"])
2765AM_CONDITIONAL([PATHD_PCEP], [test "$enable_pathd" != "no"])
2766AM_CONDITIONAL([DP_DPDK], [test "$enable_dp_dpdk" = "yes"])
2767
2768AC_CONFIG_FILES([Makefile],[
2769 test "$enable_dev_build" = "yes" && makefile_devbuild="--dev-build"
2770 ${PYTHON} "${ac_abs_top_srcdir}/python/makefile.py" ${makefile_devbuild} || exit 1
2771], [
2772 PYTHON="$PYTHON"
2773 enable_dev_build="$enable_dev_build"
2774])
2775
2776AC_CONFIG_FILES([
2777 config.version
2778 redhat/frr.spec
2779 alpine/APKBUILD
2780 snapcraft/snapcraft.yaml
2781 lib/version.h
2782 tests/lib/cli/test_cli.refout pkgsrc/mgmtd.sh
2783 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
2784 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
2785 pkgsrc/eigrpd.sh])
2786
2787AC_CONFIG_FILES([tools/frr], [chmod +x tools/frr])
2788AC_CONFIG_FILES([tools/watchfrr.sh], [chmod +x tools/watchfrr.sh])
2789AC_CONFIG_FILES([tools/frrinit.sh], [chmod +x tools/frrinit.sh])
2790AC_CONFIG_FILES([tools/frrcommon.sh])
2791AC_CONFIG_FILES([tools/frr.service])
2792AC_CONFIG_FILES([tools/frr@.service])
2793
2794AS_IF([test "$with_pkg_git_version" = "yes"], [
2795 AC_CONFIG_COMMANDS([lib/gitversion.h], [
2796 dst="${ac_abs_top_builddir}/lib/gitversion.h"
2797 ${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
2798 "${ac_abs_top_srcdir}" \
2799 > "${dst}.tmp"
2800 test -f "$dst" \
2801 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2802 && rm "${dst}.tmp" \
2803 || mv "${dst}.tmp" "${dst}"
2804 ], [
2805 PERL="$PERL"
2806 ])
2807])
2808
2809## Hack, but working solution to avoid rebuilding of frr.info.
2810## It's already in CVS until texinfo 4.7 is more common.
2811AC_OUTPUT
2812
2813if test "$enable_rpath" = "yes" ; then
2814 true
2815else
2816 # See https://old-en.opensuse.org/openSUSE:Packaging_Guidelines#Removing_Rpath
2817 sed -e 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool > libtool.sed && cat libtool.sed > libtool
2818 sed -e 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool > libtool.sed && cat libtool.sed > libtool
2819 test -f libtool.sed && rm libtool.sed
2820fi
2821
2822echo "
2823FRRouting configuration
2824------------------------------
2825FRR version : ${PACKAGE_VERSION}
2826host operating system : ${host_os}
2827source code location : ${srcdir}
2828compiler : ${CC}
2829compiler flags : ${CFLAGS} ${WERROR} ${AC_CFLAGS} ${SAN_FLAGS}
2830make : ${MAKE-make}
2831linker flags : ${LDFLAGS} ${SAN_FLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
2832state file directory : ${frr_statedir}
2833config file directory : `eval echo \`echo ${sysconfdir}\``
2834module directory : ${CFG_MODULE}
2835script directory : ${CFG_SCRIPT}
2836user to run as : ${enable_user}
2837group to run as : ${enable_group}
2838group for vty sockets : ${enable_vty_group}
2839config file mask : ${enable_configfile_mask}
2840log file mask : ${enable_logfile_mask}
2841zebra protobuf enabled : ${enable_protobuf:-no}
2842vici socket path : ${vici_socket}
2843
2844The above user and group must have read/write access to the state file
2845directory and to the config files in the config file directory."
2846
2847if test -n "$enable_datacenter"; then
2848 AC_MSG_WARN([The --enable-datacenter compile time option is deprecated. Please modify the init script to pass -F datacenter to the daemons instead.])
2849fi
2850if test -n "$enable_time_check"; then
2851 AC_MSG_WARN([The --enable-time-check compile time option is deprecated. Please use the service cputime-stats configuration option instead.])
2852fi
2853if test -n "$enable_cpu_time"; then
2854 AC_MSG_WARN([The --enable-cpu-time compile time option is deprecated. Please use the service cputime-warning NNN configuration option instead.])
2855fi
2856
2857if test "$enable_doc" != "no" -a "$frr_py_mod_sphinx" = "false"; then
2858 AC_MSG_WARN([sphinx is missing but required to build documentation])
2859fi
2860if test "$frr_py_mod_pytest" = "false"; then
2861 AC_MSG_WARN([pytest is missing, unit tests cannot be performed])
2862fi