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