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