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