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