]> git.proxmox.com Git - mirror_frr.git/blame - configure.ac
build: work around AC_PROG_LEX deprecation warning
[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
6ea3c091 10AC_INIT([frr], [8.2-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"], [
7f39a26c 800 AM_PATH_PYTHON([3])
5609b3af
DL
801 AC_CHECK_HEADER([gelf.h], [], [
802 AC_MSG_ERROR([libelf headers are required for building clippy. (Host only when cross-compiling.)])
803 ])
804 AC_CHECK_LIB([elf], [elf_memory], [], [
805 AC_MSG_ERROR([libelf is required for building clippy. (Host only when cross-compiling.)])
806 ])
807
808 AC_CHECK_LIB([elf], [elf_getdata_rawchunk], [
809 AC_DEFINE([HAVE_ELF_GETDATA_RAWCHUNK], [1], [Have elf_getdata_rawchunk()])
810 ])
811 AC_CHECK_LIB([elf], [gelf_getnote], [
812 AC_DEFINE([HAVE_GELF_GETNOTE], [1], [Have gelf_getnote()])
813 ])
814
45da32d7
DL
815 FRR_PYTHON_DEV
816], [
817 FRR_PYTHON
818])
0fca9cee 819
45da32d7 820FRR_PYTHON_MODULES([pytest])
0fca9cee 821
f616c954 822if test "$enable_doc" != "no"; then
45da32d7 823 FRR_PYTHON_MODULES([sphinx], , [
f616c954 824 if test "$enable_doc" = "yes"; then
45da32d7
DL
825 AC_MSG_ERROR([Documentation was explicitly requested with --enable-doc but sphinx is not available for $PYTHON. Please disable docs or install sphinx.])
826 fi
827 ])
828fi
f616c954
RK
829AM_CONDITIONAL([DOC], [test "$enable_doc" != "no" -a "$frr_py_mod_sphinx" != "false"])
830AM_CONDITIONAL([DOC_HTML], [test "$enable_doc_html" = "yes"])
0fca9cee 831
45da32d7
DL
832FRR_PYTHON_MOD_EXEC([sphinx], [--version], [
833 PYSPHINX="-m sphinx"
834], [
835 PYSPHINX="-c 'import sys; from sphinx import main; sys.exit(main(sys.argv))'"
29ad6f68 836])
45da32d7 837AC_SUBST([PYSPHINX])
29ad6f68 838
28436d6d 839#
99e9f424 840# Logic for old vpn commands support.
28436d6d 841#
fcc65b0f 842if test "$enable_oldvpn_commands" = "yes"; then
99e9f424 843 AC_DEFINE([KEEP_OLD_VPN_COMMANDS], [1], [Define for compiling with old vpn commands])
28436d6d
PG
844fi
845
dad253b4
AS
846#
847# End of logic for protobuf support.
848#
849
99e9f424 850AC_MSG_CHECKING([if zebra should be configurable to send Route Advertisements])
f616c954 851if test "$enable_rtadv" != "no"; then
99e9f424
RK
852 AC_MSG_RESULT([yes])
853 AC_DEFINE([HAVE_RTADV], [1], [Enable IPv6 Routing Advertisement support])
2487bea1 854else
99e9f424 855 AC_MSG_RESULT([no])
71c0fb50 856fi
7ea487bc 857
f616c954 858if test "$enable_user" = "no"; then
0b02a1b4
JAG
859 enable_user=""
860else
f616c954 861 if test "$enable_user" = "yes" || test "$enable_user" = ""; then
b2f36157 862 enable_user="frr"
0b02a1b4 863 fi
99e9f424 864 AC_DEFINE_UNQUOTED([FRR_USER], ["${enable_user}"], [frr User])
edd7c245 865fi
edd7c245 866
f616c954 867if test "$enable_group" = "no"; then
0b02a1b4
JAG
868 enable_group=""
869else
f616c954 870 if test "$enable_group" = "yes" || test "$enable_group" = ""; then
b2f36157 871 enable_group="frr"
0b02a1b4 872 fi
99e9f424 873 AC_DEFINE_UNQUOTED([FRR_GROUP], ["${enable_group}"], [frr Group])
edd7c245 874fi
edd7c245 875
f616c954 876if test "$enable_vty_group" = "yes" ; then
8d4aee5d 877 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
f616c954
RK
878elif test "$enable_vty_group" != ""; then
879 if test "$enable_vty_group" != "no"; then
99e9f424 880 AC_DEFINE_UNQUOTED([VTY_GROUP], ["${enable_vty_group}"], [VTY Sockets Group])
edd7c245 881 fi
882fi
26275b05 883AC_SUBST([enable_user])
884AC_SUBST([enable_group])
885AC_SUBST([enable_vty_group])
edd7c245 886
aa593d5e 887enable_configfile_mask=${enable_configfile_mask:-0600}
99e9f424 888AC_DEFINE_UNQUOTED([CONFIGFILE_MASK], [${enable_configfile_mask}], [Mask for config files])
5c906377 889AC_SUBST([enable_configfile_mask])
aa593d5e 890
891enable_logfile_mask=${enable_logfile_mask:-0600}
99e9f424 892AC_DEFINE_UNQUOTED([LOGFILE_MASK], [${enable_logfile_mask}], [Mask for log files])
aa593d5e 893
47e0a3b4 894MPATH_NUM=16
7ea487bc 895
896case "${enable_multipath}" in
7c5d2b76 897 0)
7a6da5ba 898 MPATH_NUM=64
7c5d2b76 899 ;;
90fb3e13 900 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
7a6da5ba 901 MPATH_NUM="${enable_multipath}"
7ea487bc 902 ;;
903 "")
904 ;;
31d7b6da 905 *)
6f0e3f6e 906 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
7ea487bc 907 ;;
908esac
909
99e9f424 910AC_DEFINE_UNQUOTED([MULTIPATH_NUM], [$MPATH_NUM], [Maximum number of paths for a route])
7ea487bc 911
99e9f424 912AC_DEFINE_UNQUOTED([VTYSH_PAGER], ["$VTYSH_PAGER"], [What pager to use])
08c369bd 913
83284209
AJ
914dnl --------------------
915dnl Enable code coverage
916dnl --------------------
31d7b6da 917AM_CONDITIONAL([HAVE_GCOV], [test "$enable_gcov" != "no"])
83284209 918
c737c7ba
AJ
919dnl ------------------------------------
920dnl Alpine only accepts numeric versions
921dnl ------------------------------------
f616c954 922if test "$enable_numeric_version" != "" ; then
c737c7ba
AJ
923 VERSION="`echo ${VERSION} | tr -c -d '[[.0-9]]'`"
924 PACKAGE_VERSION="`echo ${PACKAGE_VERSION} | tr -c -d '[[.0-9]]'`"
925fi
926
1080c13f
JN
927dnl -----------------------------------
928dnl Add extra version string to package
929dnl name, string and version fields.
930dnl -----------------------------------
f616c954 931if test "$EXTRAVERSION" != "" ; then
0be793e6
DL
932 VERSION="${VERSION}${EXTRAVERSION}"
933 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
3ab11ecc 934 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
0be793e6 935 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
1080c13f 936fi
99e9f424 937AC_SUBST([EXTRAVERSION])
1080c13f 938
31d7b6da 939if test "$with_pkg_git_version" = "yes"; then
4c015942 940 if test -e "${srcdir}/.git"; then
99e9f424 941 AC_DEFINE([GIT_VERSION], [1], [include git version info])
a16dcf7c
DL
942 else with_pkg_git_version="no"
943 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
944 fi
945fi
31d7b6da 946AM_CONDITIONAL([GIT_VERSION], [test "$with_pkg_git_version" = "yes"])
0be793e6 947
42efb0d4 948AC_CHECK_TOOL([OBJCOPY], [objcopy], [:])
f616c954 949if test "$OBJCOPY" != ":"; then
1b68b1cd
RK
950 AC_CACHE_CHECK([for .interp value to use], [frr_cv_interp], [
951 frr_cv_interp=""
952 AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])], [
953 if $OBJCOPY -j.interp -Obinary conftest conftest.interp; then
954 frr_cv_interp="`xargs -0 echo < conftest.interp`"
955 fi
956 test -f conftest.interp && rm conftest.interp
957 ])
42efb0d4 958 ])
1b68b1cd 959fi
42efb0d4 960if test -n "$frr_cv_interp"; then
99e9f424 961 AC_DEFINE_UNQUOTED([INTERP], ["$frr_cv_interp"], [.interp value])
42efb0d4
DL
962fi
963
6f0e3f6e
PJ
964dnl -------------------------
965dnl Check other header files.
966dnl -------------------------
24f5e2fc 967AC_CHECK_HEADERS([stropts.h sys/ksym.h \
19083e4f 968 linux/version.h asm/types.h endian.h sys/endian.h])
6f0e3f6e 969
899a4fd2 970ac_stdatomic_ok=false
99e9f424 971AC_DEFINE([FRR_AUTOCONF_ATOMIC], [1], [did autoconf checks for atomic funcs])
899a4fd2
DL
972AC_CHECK_HEADER([stdatomic.h],[
973
974 AC_MSG_CHECKING([whether _Atomic qualifier works])
975 AC_LINK_IFELSE([AC_LANG_SOURCE([[
976#include <stdatomic.h>
977int main(int argc, char **argv) {
978 _Atomic int i = 0;
979 return i;
980}
981]])], [
99e9f424 982 AC_DEFINE([HAVE_STDATOMIC_H], [1], [found stdatomic.h])
899a4fd2
DL
983 AC_MSG_RESULT([yes])
984 ac_stdatomic_ok=true
985 ], [
986 AC_MSG_RESULT([no])
987 ])
988])
989
990AS_IF([$ac_stdatomic_ok], [true], [
991 AC_MSG_CHECKING([for __atomic_* builtins])
992 AC_LINK_IFELSE([AC_LANG_SOURCE([[
993int main(int argc, char **argv) {
994 volatile int i = 1;
995 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
996 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
997}
998]])], [
99e9f424 999 AC_DEFINE([HAVE___ATOMIC], [1], [found __atomic builtins])
899a4fd2
DL
1000 AC_MSG_RESULT([yes])
1001 ], [
1002 AC_MSG_RESULT([no])
1003
1004 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
1005 AC_MSG_CHECKING([for __sync_* builtins])
1006 AC_LINK_IFELSE([AC_LANG_SOURCE([[
1007int main(int argc, char **argv) {
1008 volatile int i = 1;
1009 __sync_fetch_and_sub (&i, 1);
1010 return __sync_val_compare_and_swap (&i, 0, 1);
1011}
1012]])], [
99e9f424 1013 AC_DEFINE([HAVE___SYNC], [1], [found __sync builtins])
899a4fd2
DL
1014 AC_MSG_RESULT([yes])
1015
1016 AC_MSG_CHECKING([for __sync_swap builtin])
1017 AC_LINK_IFELSE([AC_LANG_SOURCE([[
1018int main(int argc, char **argv) {
1019 volatile int i = 1;
1020 return __sync_swap (&i, 2);
1021}
1022]])], [
99e9f424 1023 AC_DEFINE([HAVE___SYNC_SWAP], 1, [found __sync_swap builtin])
899a4fd2
DL
1024 AC_MSG_RESULT([yes])
1025 ], [
1026 AC_MSG_RESULT([no])
1027 ])
1028
1029 ], [
1030 AC_MSG_RESULT([no])
1031 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
1032 ])
1033 ])
1034])
1035
440d5faa
DL
1036needsync=true
1037
1038AS_IF([$needsync], [
1039 dnl Linux
1040 AC_MSG_CHECKING([for Linux futex() support])
1041 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1042#ifndef _GNU_SOURCE
1043#define _GNU_SOURCE
1044#endif
1045#include <unistd.h>
1046#include <limits.h>
1047#include <sys/time.h>
1048#include <sys/syscall.h>
1049#include <linux/futex.h>
1050
1051int main(void);
1052],
1053[
1054{
1055 return syscall(SYS_futex, NULL, FUTEX_WAIT, 0, NULL, NULL, 0);
1056}
1057])], [
1058 AC_MSG_RESULT([yes])
1059 AC_DEFINE(HAVE_SYNC_LINUX_FUTEX,,Have Linux futex support)
1060 needsync=false
1061 ], [
1062 AC_MSG_RESULT([no])
1063 ])
1064])
1065
1066AS_IF([$needsync], [
1067 dnl FreeBSD
1068 AC_MSG_CHECKING([for FreeBSD _umtx_op() support])
1069 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1070#include <errno.h>
1071#include <stdlib.h>
1072#include <sys/types.h>
1073#include <sys/umtx.h>
1074int main(void);
1075],
1076[
1077{
1078 return _umtx_op(NULL, UMTX_OP_WAIT_UINT, 0, NULL, NULL);
1079}
1080])], [
1081 AC_MSG_RESULT([yes])
1082 AC_DEFINE(HAVE_SYNC_UMTX_OP,,Have FreeBSD _umtx_op() support)
1083 needsync=false
1084 ], [
1085 AC_MSG_RESULT([no])
1086 ])
1087])
1088
1089AS_IF([$needsync], [
1090 dnl OpenBSD patch (not upstream at the time of writing this)
1091 dnl https://marc.info/?l=openbsd-tech&m=147299508409549&w=2
1092 AC_MSG_CHECKING([for OpenBSD futex() support])
1093 AC_LINK_IFELSE([AC_LANG_PROGRAM([
1094#include <sys/futex.h>
1095int main(void);
1096],
1097[
1098{
1099 return futex(NULL, FUTEX_WAIT, 0, NULL, NULL, 0);
1100}
1101])], [
1102 AC_MSG_RESULT([yes])
1103 AC_DEFINE(HAVE_SYNC_OPENBSD_FUTEX,,Have OpenBSD futex support)
1104 needsync=false
1105 ], [
1106 AC_MSG_RESULT([no])
1107 ])
1108])
1109
6f0e3f6e 1110dnl Utility macro to avoid retyping includes all the time
8e4da10b 1111m4_define([FRR_INCLUDES],
6f0e3f6e 1112[#ifdef SUNOS_5
0718b562 1113#define _POSIX_C_SOURCE 200809L
6f0e3f6e
PJ
1114#define __EXTENSIONS__
1115#endif
1116#include <stdio.h>
24f5e2fc
DL
1117#include <stdlib.h>
1118#include <stddef.h>
1119#include <sys/types.h>
6f0e3f6e 1120/* sys/conf.h depends on param.h on FBSD at least */
24f5e2fc 1121#include <sys/param.h>
6f0e3f6e 1122/* Required for MAXSIG */
24f5e2fc
DL
1123#include <signal.h>
1124#include <sys/socket.h>
ea057677
HT
1125#ifdef __APPLE__
1126# define __APPLE_USE_RFC_3542
1127#endif
24f5e2fc
DL
1128#include <netinet/in.h>
1129#include <sys/time.h>
1130#include <time.h>
1131#include <net/if.h>
2b43bf23
DO
1132])dnl
1133
1134dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
1135dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
1136dnl an additional round for it.
1137
99e9f424 1138AC_CHECK_HEADERS([net/if_var.h], [], [], [FRR_INCLUDES])
2b43bf23 1139
8e4da10b
DL
1140m4_define([FRR_INCLUDES],
1141FRR_INCLUDES
7cda3a87 1142[#ifdef HAVE_NET_IF_VAR_H
2b43bf23
DO
1143# include <net/if_var.h>
1144#endif
1145])dnl
1146
24f5e2fc
DL
1147AC_CHECK_HEADERS([netinet/in_var.h \
1148 net/if_dl.h net/netopt.h \
1149 inet/nd.h netinet/ip_icmp.h \
2655e41f 1150 sys/sysctl.h sys/sockio.h sys/conf.h],
99e9f424 1151 [], [], [FRR_INCLUDES])
6f0e3f6e
PJ
1152
1153AC_CHECK_HEADERS([ucontext.h], [], [],
1154[#ifndef __USE_GNU
1155#define __USE_GNU
1156#endif /* __USE_GNU */
8e4da10b 1157FRR_INCLUDES
6f0e3f6e
PJ
1158])
1159
bccbd141
JT
1160m4_define([UCONTEXT_INCLUDES],
1161[#include <ucontext.h>])dnl
1162
1163AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
1164 [], [], [UCONTEXT_INCLUDES])
1165AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
1166 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
1167 [], [], [UCONTEXT_INCLUDES])],
1168 [], [UCONTEXT_INCLUDES])
1169AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
1170 [], [], [UCONTEXT_INCLUDES])
1171
8e4da10b
DL
1172m4_define([FRR_INCLUDES],
1173FRR_INCLUDES
24f5e2fc
DL
1174[
1175#include <sys/un.h>
1176#include <netinet/in_systm.h>
7cda3a87 1177#ifdef HAVE_NETINET_IN_VAR_H
6f0e3f6e
PJ
1178# include <netinet/in_var.h>
1179#endif
7cda3a87 1180#ifdef HAVE_NET_IF_DL_H
6f0e3f6e
PJ
1181# include <net/if_dl.h>
1182#endif
7cda3a87 1183#ifdef HAVE_NET_NETOPT_H
6f0e3f6e
PJ
1184# include <net/netopt.h>
1185#endif
24f5e2fc 1186#include <net/route.h>
7cda3a87 1187#ifdef HAVE_INET_ND_H
6f0e3f6e
PJ
1188# include <inet/nd.h>
1189#endif
24f5e2fc 1190#include <arpa/inet.h>
11770e10 1191/* Required for IDRP */
7cda3a87 1192#ifdef HAVE_NETINET_IP_ICMP_H
11770e10
PJ
1193# include <netinet/ip_icmp.h>
1194#endif
6f0e3f6e 1195])dnl
dc7a2bf1 1196
fa3232e1 1197dnl V6 headers are checked below, after we check for v6
7ea487bc 1198
d621815a
DL
1199is_linux=false
1200
ddfeb486
DL
1201AC_MSG_CHECKING([which operating system interface to use])
1202case "$host_os" in
1203 sunos* | solaris2*)
32d9e333 1204 AC_MSG_FAILURE([Solaris support has been removed please see versions prior or equal to 7.5])
ddfeb486
DL
1205 ;;
1206 linux*)
1207 AC_MSG_RESULT([Linux])
1208
99e9f424
RK
1209 AC_DEFINE([GNU_LINUX], [1], [GNU Linux])
1210 AC_DEFINE([HAVE_NETLINK], [1], [netlink])
1211 AC_DEFINE([LINUX_IPV6], [1], [Linux IPv6 stack])
ddfeb486
DL
1212
1213 dnl Linux has a compilation problem with mixing
1214 dnl netinet/in.h and linux/in6.h they are not
1215 dnl compatible. There has been discussion on
1216 dnl how to fix it but no real progress on implementation
1217 dnl when they fix it, remove this
99e9f424 1218 AC_DEFINE([IPV6_MINHOPCOUNT], [73], [Linux ipv6 Min Hop Count])
d621815a
DL
1219
1220 is_linux=true
ddfeb486
DL
1221 ;;
1222 openbsd*)
1223 AC_MSG_RESULT([OpenBSD])
1224
99e9f424
RK
1225 AC_DEFINE([OPEN_BSD], [1], [OpenBSD])
1226 AC_DEFINE([KAME], [1], [KAME IPv6])
1227 AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
ddfeb486
DL
1228 ;;
1229 *)
1230 AC_MSG_RESULT([BSD])
1231
99e9f424
RK
1232 AC_DEFINE([HAVE_NET_RT_IFLIST], [1], [NET_RT_IFLIST])
1233 AC_DEFINE([KAME], [1], [KAME IPv6])
1234 AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
ddfeb486 1235 ;;
7ea487bc 1236esac
d621815a 1237AM_CONDITIONAL([LINUX], [${is_linux}])
7ea487bc 1238
62c9f504
PJ
1239AC_SYS_LARGEFILE
1240
4e40b6d6
KK
1241dnl ------------------------
1242dnl Integrated REALMS option
1243dnl ------------------------
f616c954 1244if test "$enable_realms" = "yes"; then
4e40b6d6
KK
1245 case "$host_os" in
1246 linux*)
99e9f424 1247 AC_DEFINE([SUPPORT_REALMS], [1], [Realms support])
4e40b6d6
KK
1248 ;;
1249 *)
1250 echo "Sorry, only Linux has REALMS support"
1251 exit 1
1252 ;;
1253 esac
1254fi
a71c5039 1255
a71c5039
DL
1256dnl ---------------
1257dnl other functions
1258dnl ---------------
1259AC_CHECK_FUNCS([ \
1260 strlcat strlcpy \
0bdeb5e5
DL
1261 getgrouplist \
1262 openat \
1263 unlinkat \
1264 posix_fallocate \
1265 ])
a71c5039
DL
1266
1267dnl ##########################################################################
1268dnl LARGE if block spans a lot of "configure"!
f616c954 1269if test "$enable_clippy_only" != "yes"; then
a71c5039
DL
1270dnl ##########################################################################
1271
1272#
1273# Logic for protobuf support.
1274#
fd193241 1275PROTO3=false
a71c5039
DL
1276if test "$enable_protobuf" = "yes"; then
1277 # Check for protoc & protoc-c
1278
1279 # protoc is not required, it's only for a "be nice" helper target
1280 AC_CHECK_PROGS([PROTOC], [protoc], [/bin/false])
1281
1282 AC_CHECK_PROGS([PROTOC_C], [protoc-c], [/bin/false])
1283 if test "$PROTOC_C" = "/bin/false"; then
1284 AC_MSG_FAILURE([protobuf requested but protoc-c not found. Install protobuf-c.])
1285 fi
1286
1287 PKG_CHECK_MODULES([PROTOBUF_C], [libprotobuf-c >= 0.14],, [
1288 AC_MSG_FAILURE([protobuf requested but libprotobuf-c not found. Install protobuf-c.])
1289 ])
fd193241
DS
1290
1291 PROTO3=true
1292 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h],
1293 [AC_CHECK_DECLS(PROTOBUF_C_LABEL_NONE,
1294 AC_DEFINE([HAVE_PROTOBUF_VERSION_3],
1295 [1], [Have Protobuf version 3]),
1296 [PROTO3=false],
1297 [#include <google/protobuf-c/protobuf-c.h>])],
1298 [PROTO3=false && AC_MSG_FAILURE([protobuf requested but protobuf-c.h not found. Install protobuf-c.])])
a71c5039
DL
1299
1300 AC_DEFINE([HAVE_PROTOBUF], [1], [protobuf])
1301fi
1302
4e40b6d6 1303
7ea487bc 1304dnl ---------------------
1305dnl Integrated VTY option
1306dnl ---------------------
1307case "${enable_vtysh}" in
64537bc4
DL
1308"no")
1309 VTYSH="";;
1310*)
1311 VTYSH="vtysh";
99e9f424 1312 AC_DEFINE([VTYSH], [1], [VTY shell])
64537bc4
DL
1313
1314 prev_libs="$LIBS"
99e9f424 1315 AC_CHECK_LIB([readline], [main], [
64537bc4
DL
1316 LIBREADLINE="-lreadline"
1317 ], [
1318 dnl readline failed - it might be incorrectly linked and missing its
1319 dnl termcap/tinfo/curses dependency. see if we can fix that...
99e9f424 1320 AC_SEARCH_LIBS([tputs], [termcap tinfo curses ncurses], [
64537bc4
DL
1321 LIBREADLINE="$ac_cv_search_tputs"
1322 ], [
1323 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1324 ])
1325
1326 dnl re-try with the lib we found above
1327 unset ac_cv_lib_readline_main
99e9f424 1328 AC_CHECK_LIB([readline], [main], [
64537bc4
DL
1329 LIBREADLINE="-lreadline $LIBREADLINE"
1330 ], [
1331 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1332 ], [$LIBREADLINE])
1333 ], [])
1334 LIBS="$prev_libs"
1335
99e9f424 1336 AC_CHECK_HEADER([readline/history.h])
9377fc4f 1337 if test "$ac_cv_header_readline_history_h" = "no"; then
64537bc4
DL
1338 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
1339 fi
99e9f424 1340 AC_CHECK_LIB([readline], [rl_completion_matches], [true], [], [$LIBREADLINE])
9377fc4f 1341 if test "$ac_cv_lib_readline_rl_completion_matches" = "no"; then
99e9f424 1342 AC_DEFINE([rl_completion_matches], [completion_matches], [Old readline])
64537bc4 1343 fi
99e9f424 1344 AC_CHECK_LIB([readline], [append_history], [frr_cv_append_history=yes], [frr_cv_append_history=no], [$LIBREADLINE])
7075f6a0 1345 if test "$frr_cv_append_history" = "yes"; then
99e9f424 1346 AC_DEFINE([HAVE_APPEND_HISTORY], [1], [Have history.h append_history])
64537bc4
DL
1347 fi
1348 ;;
7ea487bc 1349esac
99e9f424 1350AC_SUBST([LIBREADLINE])
7ea487bc 1351
1352dnl ----------
1353dnl PAM module
6159928d 1354dnl
1689cf7e 1355dnl FRR detects the PAM library it is built against by checking for a
6159928d
DO
1356dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
1357dnl is known to #include pam_appl.h, the standard header of a PAM library, and
1358dnl openpam.h doesn't do that, although depends on the header too. Hence a
1359dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
1360dnl of OpenPAM.
7ea487bc 1361dnl ----------
24cd435b 1362if test "$with_libpam" = "yes"; then
6f0e3f6e 1363 AC_CHECK_HEADER([security/pam_misc.h],
99e9f424
RK
1364 [AC_DEFINE([HAVE_PAM_MISC_H], [1], [Have pam_misc.h])
1365 AC_DEFINE([PAM_CONV_FUNC], [misc_conv], [Have misc_conv])
6f0e3f6e
PJ
1366 pam_conv_func="misc_conv"
1367 ],
8e4da10b 1368 [], FRR_INCLUDES)
6f0e3f6e 1369 AC_CHECK_HEADER([security/openpam.h],
99e9f424
RK
1370 [AC_DEFINE([HAVE_OPENPAM_H], [1], [Have openpam.h])
1371 AC_DEFINE([PAM_CONV_FUNC], [openpam_ttyconv], [Have openpam_ttyconv])
6f0e3f6e
PJ
1372 pam_conv_func="openpam_ttyconv"
1373 ],
8e4da10b 1374 [], FRR_INCLUDES[#include <security/pam_appl.h>])
24cd435b 1375 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
1376 AC_MSG_WARN([*** pam support will not be built ***])
1377 with_libpam="no"
1378 fi
1379fi
1380
7ea487bc 1381if test "$with_libpam" = "yes"; then
6f0e3f6e 1382dnl took this test from proftpds configure.in and suited to our needs
7ea487bc 1383dnl -------------------------------------------------------------------------
1384dnl
1385dnl This next check looks funky due to a linker problem with some versions
1386dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
1387dnl omitted requiring libdl linking information. PAM-0.72 or better ships
1388dnl with RedHat 6.2 and Debian 2.2 or better.
99e9f424
RK
1389AC_CHECK_LIB([pam], [pam_start],
1390 [AC_CHECK_LIB([pam], [$pam_conv_func],
1391 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
7ea487bc 1392 LIBPAM="-lpam"],
99e9f424 1393 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
7ea487bc 1394 LIBPAM="-lpam -lpam_misc"]
1395 )
1396 ],
1397
99e9f424
RK
1398 [AC_CHECK_LIB([pam], [pam_end],
1399 [AC_CHECK_LIB([pam], [$pam_conv_func],
1400 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
7ea487bc 1401 LIBPAM="-lpam -ldl"],
99e9f424 1402 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
7ea487bc 1403 LIBPAM="-lpam -ldl -lpam_misc"]
1404 )
1405 ],AC_MSG_WARN([*** pam support will not be built ***]),
1406 [-ldl])
1407 ]
1408)
1409fi
99e9f424 1410AC_SUBST([LIBPAM])
7ea487bc 1411
6f0e3f6e
PJ
1412dnl -------------------------------
1413dnl bgpd needs pow() and hence libm
1414dnl -------------------------------
1415TMPLIBS="$LIBS"
2655e41f
DL
1416LIBS=""
1417AC_SEARCH_LIBS([pow], [m], [
1418 LIBM="$LIBS"
1419], [
6f0e3f6e 1420 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
2655e41f 1421])
6f0e3f6e 1422LIBS="$TMPLIBS"
99e9f424 1423AC_SUBST([LIBM])
6f0e3f6e 1424
154b9e8f 1425AC_CHECK_FUNCS([ppoll], [
99e9f424 1426 AC_DEFINE([HAVE_PPOLL], [1], [have Linux/BSD ppoll()])
154b9e8f
DL
1427])
1428AC_CHECK_FUNCS([pollts], [
99e9f424 1429 AC_DEFINE([HAVE_POLLTS], [1], [have NetBSD pollts()])
154b9e8f
DL
1430])
1431
13460c44
FL
1432AC_CHECK_HEADER([asm-generic/unistd.h],
1433 [AC_CHECK_DECL(__NR_setns,
99e9f424 1434 AC_DEFINE([HAVE_NETNS], [1], [Have netns]),,
8e4da10b 1435 FRR_INCLUDES [#include <asm-generic/unistd.h>
13460c44 1436 ])
99e9f424 1437 AC_CHECK_FUNCS([setns])]
13460c44
FL
1438 )
1439
238497fc
PJ
1440dnl --------------------------
1441dnl Determine IS-IS I/O method
1442dnl --------------------------
99e9f424
RK
1443AC_DEFINE([ISIS_METHOD_PFPACKET], [1], [constant value for isis method pfpacket])
1444AC_DEFINE([ISIS_METHOD_DLPI], [2], [constant value for isis method dlpi])
1445AC_DEFINE([ISIS_METHOD_BPF], [3], [constant value for isis method bpf])
1446AC_CHECK_HEADER([net/bpf.h])
1447AC_CHECK_HEADER([sys/dlpi.h])
1448AC_MSG_CHECKING([zebra IS-IS I/O method])
ddfeb486
DL
1449
1450case "$host_os" in
1451 linux*)
99e9f424 1452 AC_MSG_RESULT([pfpacket])
ddfeb486
DL
1453 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1454 ;;
ddfeb486 1455 *)
7075f6a0
RK
1456 if test "$ac_cv_header_net_bpf_h" = "no"; then
1457 if test "$ac_cv_header_sys_dlpi_h" = "no"; then
99e9f424 1458 AC_MSG_RESULT([none])
f616c954 1459 if test "$enable_isisd" = "yes" -o "$enable_fabricd" = "yes"; then
86e463cf
DL
1460 AC_MSG_FAILURE([IS-IS support requested but no packet backend found])
1461 fi
ddfeb486 1462 AC_MSG_WARN([*** IS-IS support will not be built ***])
86e463cf 1463 enable_isisd="no"
7c0cbd0e 1464 enable_fabricd="no"
ddfeb486 1465 else
99e9f424 1466 AC_MSG_RESULT([DLPI])
ddfeb486
DL
1467 fi
1468 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
238497fc 1469 else
99e9f424 1470 AC_MSG_RESULT([BPF])
ddfeb486 1471 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
238497fc 1472 fi
ddfeb486
DL
1473 ;;
1474esac
99e9f424 1475AC_DEFINE_UNQUOTED([ISIS_METHOD], [$ISIS_METHOD_MACRO], [selected method for isis, == one of the constants])
238497fc 1476
42c98199 1477dnl ---------------------------------------------------------------
1478dnl figure out how to specify an interface in multicast sockets API
1479dnl ---------------------------------------------------------------
8e4da10b 1480AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
42c98199 1481
b3f2bf7c 1482AC_CHECK_HEADERS([linux/mroute.h], [], [],[
24f5e2fc
DL
1483 #include <sys/socket.h>
1484 #include <netinet/in.h>
b3f2bf7c
RW
1485 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1486 #include <linux/types.h>
1487])
1488
8e4da10b
DL
1489m4_define([FRR_INCLUDES],
1490FRR_INCLUDES
7cda3a87 1491[#ifdef HAVE_LINUX_MROUTE_H
b3f2bf7c
RW
1492# include <linux/mroute.h>
1493#endif
1494])dnl
1495
1496AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
24f5e2fc
DL
1497 #include <sys/socket.h>
1498 #include <sys/types.h>
1499 #include <netinet/in.h>
1500 #include <net/route.h>
b3f2bf7c
RW
1501])
1502
8e4da10b
DL
1503m4_define([FRR_INCLUDES],
1504FRR_INCLUDES
7cda3a87 1505[#ifdef HAVE_NETINET_IP_MROUTE_H
b3f2bf7c
RW
1506# include <netinet/ip_mroute.h>
1507#endif
1508])dnl
1509
10d04cdb 1510AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1b636c0a
DL
1511AC_COMPILE_IFELSE(
1512[ AC_LANG_PROGRAM([[
1513 #include <sys/types.h>
1514 #include <netinet/in.h>
1515 ]], [[
1516 struct group_req gr;
1517 int sock;
1518 setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1519 ]])
1520],[
1521 AC_MSG_RESULT([yes])
1522 AC_DEFINE([HAVE_RFC3678], [1], [Have RFC3678 protocol-independed API])
1523],[
1524 AC_MSG_RESULT(no)
1525])
10d04cdb 1526
c543a173
AS
1527dnl ---------------------------------------------------------------
1528dnl figure out how to check link-state
1529dnl ---------------------------------------------------------------
99e9f424 1530AC_CHECK_HEADER([net/if_media.h],
24f5e2fc 1531 [m4_define([LINK_DETECT_INCLUDES],
8e4da10b 1532 FRR_INCLUDES
24f5e2fc
DL
1533 [#include <net/if_media.h>
1534 ])
99e9f424
RK
1535 AC_CHECK_MEMBERS([struct ifmediareq.ifm_status],
1536 AC_DEFINE([HAVE_BSD_LINK_DETECT], [1], [BSD link-detect]),
24f5e2fc
DL
1537 [], LINK_DETECT_INCLUDES)],
1538 [],
8e4da10b 1539 FRR_INCLUDES)
c543a173 1540
9234b382
DV
1541dnl ---------------------------------------------------------------
1542dnl Additional, newer way to check link-state using ifi_link_state.
1543dnl Not available in all BSD's when ifmediareq available
1544dnl ---------------------------------------------------------------
24f5e2fc 1545AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
99e9f424 1546 AC_DEFINE([HAVE_BSD_IFI_LINK_STATE], [1], [BSD ifi_link_state available]),
8e4da10b 1547 [], FRR_INCLUDES)
9234b382 1548
0df7c91f
PJ
1549dnl ------------------------
1550dnl TCP_MD5SIG socket option
1551dnl ------------------------
1552
1553AC_CHECK_HEADER([netinet/tcp.h],
1554 [m4_define([MD5_INCLUDES],
8e4da10b 1555 FRR_INCLUDES
0df7c91f
PJ
1556 [#include <netinet/tcp.h>
1557 ])
1558 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1559 [],
8e4da10b 1560 FRR_INCLUDES)
7075f6a0 1561if test "$ac_cv_have_decl_TCP_MD5SIG" = "no"; then
0df7c91f
PJ
1562 AC_CHECK_HEADER([linux/tcp.h],
1563 [m4_define([MD5_INCLUDES],
8e4da10b 1564 FRR_INCLUDES
0df7c91f
PJ
1565 [#include <linux/tcp.h>
1566 ])
1567 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1568fi
1569
a71c5039
DL
1570AC_CHECK_LIB([crypt], [crypt], [],
1571 [AC_CHECK_LIB([crypto], [DES_crypt])])
1572AC_CHECK_LIB([resolv], [res_init])
1573
1574dnl ---------------------------
1575dnl check system has PCRE regexp
1576dnl ---------------------------
31d7b6da 1577if test "$enable_pcreposix" = "yes"; then
a71c5039
DL
1578 AC_CHECK_LIB([pcreposix], [regexec], [], [
1579 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1580 ])
1581fi
1582AC_SUBST([HAVE_LIBPCREPOSIX])
1583
2163a630 1584dnl ##########################################################################
f616c954 1585dnl test "$enable_clippy_only" != "yes"
2163a630
LC
1586fi
1587dnl END OF LARGE if block
1588dnl ##########################################################################
1589
83c64a7d
DL
1590dnl ------------------
1591dnl check C-Ares library
1592dnl ------------------
1593PKG_CHECK_MODULES([CARES], [libcares], [
1594 c_ares_found=true
1595],[
1596 c_ares_found=false
1597])
1598AM_CONDITIONAL([CARES], [$c_ares_found])
1599
a71c5039 1600
60060acc
RW
1601dnl ----------------------------------------------------------------------------
1602dnl figure out if domainname is available in the utsname struct (GNU extension).
1603dnl ----------------------------------------------------------------------------
1604AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1605
fa3232e1 1606dnl ------------------
1607dnl IPv6 header checks
1608dnl ------------------
24f5e2fc 1609AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
6f0e3f6e 1610 netinet6/in6_var.h netinet6/nd6.h], [], [],
8e4da10b 1611 FRR_INCLUDES)
fa3232e1 1612
8e4da10b
DL
1613m4_define([FRR_INCLUDES],dnl
1614FRR_INCLUDES
7cda3a87 1615[#ifdef HAVE_NETINET6_IN6_H
6f0e3f6e
PJ
1616#include <netinet6/in6.h>
1617#endif
7cda3a87 1618#ifdef HAVE_NETINET_IN6_VAR_H
6f0e3f6e
PJ
1619#include <netinet/in6_var.h>
1620#endif
24f5e2fc 1621#include <netinet/icmp6.h>
7cda3a87 1622#ifdef HAVE_NETINET6_IN6_VAR_H
6f0e3f6e
PJ
1623# include <netinet6/in6_var.h>
1624#endif
7cda3a87 1625#ifdef HAVE_NETINET6_ND6_H
fbf24544 1626# include <netinet6/nd6.h>
6f0e3f6e
PJ
1627#endif
1628])dnl
1629
7ea487bc 1630dnl --------------------
1631dnl Daemon disable check
1632dnl --------------------
7ea487bc 1633
0eb5751d
IR
1634AS_IF([test "$enable_bgpd" != "no"], [
1635 AC_DEFINE([HAVE_BGPD], [1], [bgpd])
1636])
1637
1638AS_IF([test "$enable_ripd" != "no"], [
1639 AC_DEFINE([HAVE_RIPD], [1], [ripd])
1640])
1641
1642AS_IF([test "$enable_ripngd" != "no"], [
1643 AC_DEFINE([HAVE_RIPNGD], [1], [ripngd])
1644])
1645
1646AS_IF([test "$enable_ospfd" != "no"], [
1647 AC_DEFINE([HAVE_OSPFD], [1], [ospfd])
1648])
1649
1650AS_IF([test "$enable_ospf6d" != "no"], [
1651 AC_DEFINE([HAVE_OSPF6D], [1], [ospf6d])
1652])
1653
f616c954 1654AS_IF([test "$enable_ldpd" != "no"], [
99e9f424 1655 AC_DEFINE([HAVE_LDPD], [1], [ldpd])
30237d29 1656])
eac6e3f0 1657
0eb5751d
IR
1658AS_IF([test "$enable_nhrpd" != "no"], [
1659 AC_DEFINE([HAVE_NHRPD], [1], [nhrpd])
1660])
1661
1662AS_IF([test "$enable_eigrpd" != "no"], [
1663 AC_DEFINE([HAVE_EIGRPD], [1], [eigrpd])
1664])
1665
1666AS_IF([test "$enable_babeld" != "no"], [
1667 AC_DEFINE([HAVE_BABELD], [1], [babeld])
1668])
1669
1670AS_IF([test "$enable_isisd" != "no"], [
1671 AC_DEFINE([HAVE_ISISD], [1], [isisd])
1672])
1673
1674AS_IF([test "$enable_pimd" != "no"], [
1675 AC_DEFINE([HAVE_PIMD], [1], [pimd])
1676])
1677
1678AS_IF([test "$enable_pbrd" != "no"], [
1679 AC_DEFINE([HAVE_PBRD], [1], [pbrd])
1680])
1681
1682AS_IF([test "$enable_sharpd" = "yes"], [
1683 AC_DEFINE([HAVE_SHARPD], [1], [sharpd])
1684])
1685
1686AS_IF([test "$enable_staticd" != "no"], [
1687 AC_DEFINE([HAVE_STATICD], [1], [staticd])
1688])
1689
1690AS_IF([test "$enable_fabricd" != "no"], [
1691 AC_DEFINE([HAVE_FABRICD], [1], [fabricd])
1692])
1693
1694AS_IF([test "$enable_vrrpd" != "no"], [
1695 AC_DEFINE([HAVE_VRRPD], [1], [vrrpd])
1696])
1697
7134904b 1698if test "$enable_bfdd" = "no"; then
99e9f424 1699 AC_DEFINE([HAVE_BFDD], [0], [bfdd])
7134904b
RZ
1700 BFDD=""
1701else
99e9f424 1702 AC_DEFINE([HAVE_BFDD], [1], [bfdd])
7134904b
RZ
1703 BFDD="bfdd"
1704
1705 case $host_os in
1706 linux*)
99e9f424 1707 AC_DEFINE([BFD_LINUX], [1], [bfdd])
7134904b
RZ
1708 ;;
1709
1710 *)
99e9f424 1711 AC_DEFINE([BFD_BSD], [1], [bfdd])
7134904b
RZ
1712 ;;
1713 esac
1714fi
1715
4d7b695d
SM
1716AS_IF([test "$enable_pathd" != "no"], [
1717 AC_DEFINE([HAVE_PATHD], [1], [pathd])
efba0985
SM
1718 AC_DEFINE([HAVE_PATHD_PCEP], [1], [pathd-pcep])
1719])
1720
74971473 1721
31d7b6da 1722if test "$ac_cv_lib_json_c_json_object_get" = "no" -a "$BFDD" = "bfdd"; then
7134904b
RZ
1723 AC_MSG_ERROR(["you must use json-c library to use bfdd"])
1724fi
1725
42350cfc 1726NHRPD=""
ddfeb486
DL
1727case "$host_os" in
1728 linux*)
83c64a7d
DL
1729 case "${enable_nhrpd}" in
1730 no)
1731 ;;
1732 yes)
f616c954 1733 if test "$enable_clippy_only" != "yes"; then
2d82431a 1734 if test "$c_ares_found" != "true" ; then
83c64a7d
DL
1735 AC_MSG_ERROR([nhrpd requires libcares. Please install c-ares and its -dev headers.])
1736 fi
2163a630 1737 fi
83c64a7d
DL
1738 NHRPD="nhrpd"
1739 ;;
1740 *)
2d82431a 1741 if test "$c_ares_found" = "true" ; then
83c64a7d
DL
1742 NHRPD="nhrpd"
1743 fi
1744 ;;
1745 esac
ddfeb486
DL
1746 ;;
1747 *)
f616c954 1748 if test "$enable_nhrpd" = "yes"; then
ddfeb486
DL
1749 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1750 fi
1751 ;;
1752esac
7f57883e 1753
f616c954 1754if test "$enable_watchfrr" = "no";then
9473e340 1755 WATCHFRR=""
d0199430 1756else
9473e340 1757 WATCHFRR="watchfrr"
d0199430 1758fi
1759
1ef74ef7 1760OSPFCLIENT=""
f616c954 1761if test "$enable_ospfapi" != "no";then
99e9f424 1762 AC_DEFINE([SUPPORT_OSPF_API], [1], [OSPFAPI])
1ef74ef7 1763
f616c954 1764 if test "$enable_ospfclient" != "no";then
1ef74ef7 1765 OSPFCLIENT="ospfclient"
1ef74ef7 1766 fi
7ea487bc 1767fi
cd66cd4c 1768
f616c954 1769if test "$enable_bgp_announce" = "no";then
99e9f424 1770 AC_DEFINE([DISABLE_BGP_ANNOUNCE], [1], [Disable BGP installation to zebra])
750e8146 1771else
99e9f424 1772 AC_DEFINE([DISABLE_BGP_ANNOUNCE], [0], [Disable BGP installation to zebra])
7ea487bc 1773fi
1774
f616c954 1775if test "$enable_bgp_vnc" != "no";then
99e9f424 1776 AC_DEFINE([ENABLE_BGP_VNC], [1], [Enable BGP VNC support])
65efcfce 1777fi
7ea487bc 1778
83c64a7d
DL
1779bgpd_bmp=false
1780case "${enable_bmp}" in
1781 no)
1782 ;;
1783 yes)
2d82431a 1784 if test "$c_ares_found" != "true" ; then
83c64a7d
DL
1785 AC_MSG_ERROR([BMP support requires libcares. Please install c-ares and its -dev headers.])
1786 fi
1787 bgpd_bmp=true
1788 ;;
1789 *)
2d82431a 1790 if test "$c_ares_found" = "true" ; then
83c64a7d
DL
1791 bgpd_bmp=true
1792 fi
1793 ;;
1794esac
1795
e063f271
JAG
1796if test "$enable_version_build_config" != "no";then
1797 AC_DEFINE([ENABLE_VERSION_BUILD_CONFIG], [1], [Report build configs in show version])
1798fi
1799
a71c5039
DL
1800dnl ##########################################################################
1801dnl LARGE if block
f616c954 1802if test "$enable_clippy_only" != "yes"; then
a71c5039 1803dnl ##########################################################################
7ea487bc 1804
1805dnl ------------------
b1fc9acb 1806dnl check Net-SNMP library
7ea487bc 1807dnl ------------------
f616c954 1808if test "$enable_snmp" != "" -a "$enable_snmp" != "no"; then
08d7f653 1809 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
31d7b6da 1810 if test "$NETSNMP_CONFIG" = "no"; then
08d7f653
VB
1811 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1812 fi
46081234
DL
1813 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1814 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
e5563f87
DL
1815 # net-snmp lists all of its own dependencies. we absolutely do not want that
1816 # among other things we avoid a GPL vs. OpenSSL license conflict here
1817 for removelib in crypto ssl sensors pci wrap; do
1818 SNMP_LIBS="`echo $SNMP_LIBS | sed -e 's/\(^\|\s\)-l'$removelib'\b/ /g' -e 's/\(^\|\s\)\([^\s]*\/\)\?lib'$removelib'\.[^\s]\+\b/ /g'`"
1819 done
08d7f653 1820 AC_MSG_CHECKING([whether we can link to Net-SNMP])
92e50261 1821 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
08d7f653
VB
1822int main(void);
1823],
1824[
1825{
1826 return 0;
1827}
92e50261 1828])], [
45da32d7 1829 AC_MSG_RESULT([no])
08d7f653 1830 AC_MSG_ERROR([--enable-snmp given but not usable])])
d6be5fb9
VB
1831 case "${enable_snmp}" in
1832 yes)
1833 SNMP_METHOD=agentx
1834 ;;
807ed4e9 1835 agentx)
d6be5fb9
VB
1836 SNMP_METHOD="${enable_snmp}"
1837 ;;
1838 *)
807ed4e9 1839 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use yes or agentx])
d6be5fb9
VB
1840 ;;
1841 esac
d6be5fb9 1842 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
99e9f424 1843 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,[SNMP method to interface with snmpd])
6cf9df08 1844fi
99e9f424
RK
1845AC_SUBST([SNMP_LIBS])
1846AC_SUBST([SNMP_CFLAGS])
6cf9df08 1847
1c2facd1
RW
1848dnl ---------------
1849dnl libyang
1850dnl ---------------
3bb513c3
CH
1851PKG_CHECK_MODULES([LIBYANG], [libyang >= 2.0.0], , [
1852 AC_MSG_ERROR([libyang (>= 2.0.0) was not found on your system.])
1c2facd1 1853])
fdbd8086
DL
1854ac_cflags_save="$CFLAGS"
1855CFLAGS="$CFLAGS $LIBYANG_CFLAGS"
397b1dff
CF
1856AC_CHECK_MEMBER([struct lyd_node.priv], [], [
1857 AC_MSG_ERROR([m4_normalize([
1858 libyang needs to be compiled with ENABLE_LYD_PRIV=ON.
18f7f767 1859 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
1860 ])
1861], [[#include <libyang/libyang.h>]])
fdbd8086 1862CFLAGS="$ac_cflags_save"
1c2facd1
RW
1863
1864dnl ---------------
1865dnl configuration rollbacks
1866dnl ---------------
1867SQLITE3=false
1868if test "$enable_config_rollbacks" = "yes"; then
fdbd8086 1869 PKG_CHECK_MODULES([SQLITE3], [sqlite3], [
99e9f424
RK
1870 AC_DEFINE([HAVE_CONFIG_ROLLBACKS], [1], [Enable configuration rollbacks])
1871 AC_DEFINE([HAVE_SQLITE3], [1], [Enable sqlite3 database])
1c2facd1
RW
1872 SQLITE3=true
1873 ], [
1874 AC_MSG_ERROR([--enable-config-rollbacks given but sqlite3 was not found on your system.])
1875 ])
1876fi
1c2facd1 1877
5bce33b3
RW
1878dnl ---------------
1879dnl confd
1880dnl ---------------
1881if test "$enable_confd" != "" -a "$enable_confd" != "no"; then
76ca5356 1882 AC_CHECK_PROG([CONFD], [confd], [confd], [/bin/false], "${enable_confd}/bin")
31d7b6da 1883 if test "$CONFD" = "/bin/false"; then
5bce33b3
RW
1884 AC_MSG_ERROR([confd was not found on your system.])]
1885 fi
1886 CONFD_CFLAGS="-I${enable_confd}/include -L${enable_confd}/lib"
99e9f424 1887 AC_SUBST([CONFD_CFLAGS])
0619d86e
RW
1888 CONFD_LIBS="-lconfd"
1889 AC_SUBST([CONFD_LIBS])
99e9f424 1890 AC_DEFINE([HAVE_CONFD], [1], [Enable confd integration])
5bce33b3 1891fi
5bce33b3 1892
a7ca2199
RW
1893dnl ---------------
1894dnl sysrepo
1895dnl ---------------
1896if test "$enable_sysrepo" = "yes"; then
9a3b4141 1897 PKG_CHECK_MODULES([SYSREPO], [sysrepo],
99e9f424 1898 [AC_DEFINE([HAVE_SYSREPO], [1], [Enable sysrepo integration])
a7ca2199
RW
1899 SYSREPO=true],
1900 [SYSREPO=false
1901 AC_MSG_ERROR([sysrepo was not found on your system.])]
1902 )
1903fi
a7ca2199 1904
ec2ac5f2
RW
1905dnl ---------------
1906dnl gRPC
1907dnl ---------------
1908if test "$enable_grpc" = "yes"; then
b256a06b 1909 AC_LANG_PUSH([C++])
41b7a989
CH
1910 AX_CXX_COMPILE_STDCXX([11], [ext])
1911 PKG_CHECK_MODULES([GRPC], [grpc >= 6.0.0 grpc++ >= 1.16.1 protobuf >= 3.6.1 ], [
ec2ac5f2
RW
1912 AC_CHECK_PROGS([PROTOC], [protoc], [/bin/false])
1913 if test "$PROTOC" = "/bin/false"; then
1914 AC_MSG_FAILURE([grpc requested but protoc not found.])
1915 fi
1916
1917 AC_DEFINE([HAVE_GRPC], [1], [Enable the gRPC northbound plugin])
1918 GRPC=true
1919 ], [
1920 GRPC=false
1921 AC_MSG_ERROR([grpc/grpc++ were not found on your system.])
1922 ])
b256a06b 1923 AC_LANG_POP([C++])
ec2ac5f2 1924fi
ec2ac5f2 1925
0cbcadcc
QY
1926dnl -----
1927dnl LTTng
1928dnl -----
1929if test "$enable_lttng" = "yes"; then
d03c8a8e 1930 PKG_CHECK_MODULES([UST], [lttng-ust >= 2.9.0], [
0cbcadcc
QY
1931 AC_DEFINE([HAVE_LTTNG], [1], [Enable LTTng support])
1932 LTTNG=true
1933 ], [
1934 AC_MSG_ERROR([configuration specifies --enable-lttng but lttng-ust was not found])
1935 ])
1936fi
1937
552e2a30
QY
1938dnl ----
1939dnl USDT
1940dnl ----
1941if test "$enable_usdt" = "yes"; then
1942 AC_CHECK_HEADERS([sys/sdt.h], [
1943 AC_DEFINE([HAVE_USDT], [1], [Enable USDT probes])
1944 USDT=true
1945 ], [
1946 AC_MSG_ERROR([configuration specifies --enable-usdt but no USDT kernel headers (sys/sdt.h) found])
1947 ])
1948fi
1949
a71c5039
DL
1950dnl ------
1951dnl ZeroMQ
1952dnl ------
31d7b6da 1953if test "$enable_zeromq" != "no"; then
a71c5039
DL
1954 PKG_CHECK_MODULES([ZEROMQ], [libzmq >= 4.0.0], [
1955 AC_DEFINE([HAVE_ZEROMQ], [1], [Enable ZeroMQ support])
1956 ZEROMQ=true
1957 ], [
31d7b6da 1958 if test "$enable_zeromq" = "yes"; then
a71c5039
DL
1959 AC_MSG_ERROR([configuration specifies --enable-zeromq but libzmq was not found])
1960 fi
1961 ])
1962fi
1963
1964dnl ------------------------------------
1965dnl Enable RPKI and add librtr to libs
1966dnl ------------------------------------
f616c954 1967if test "$enable_rpki" = "yes"; then
a71c5039
DL
1968 PKG_CHECK_MODULES([RTRLIB], [rtrlib >= 0.5.0],
1969 [RPKI=true],
1970 [RPKI=false
1971 AC_MSG_ERROR([rtrlib was not found on your system or is too old.])]
1972 )
1973fi
1974
0476fdad 1975dnl ------------------------------------
87559aa4 1976dnl pimd is not supported on OpenBSD and MacOS
0476fdad
RK
1977dnl ------------------------------------
1978if test "$enable_pimd" != "no"; then
1979AC_MSG_CHECKING([for pimd OS support])
1980case "$host_os" in
87559aa4
RK
1981 darwin*)
1982 AC_MSG_RESULT([no])
1983 enable_pimd="no"
1984 ;;
0476fdad
RK
1985 openbsd*)
1986 AC_MSG_RESULT([no])
1987 enable_pimd="no"
1988 ;;
1989 *)
1990 AC_MSG_RESULT([yes])
1991 ;;
1992esac
1993fi
1994
3fa94379
MS
1995dnl -------------------------------------
1996dnl VRRP is only supported on linux
1997dnl -------------------------------------
1998if test "$enable_vrrpd" != "no"; then
1999AC_MSG_CHECKING([for VRRP OS support])
2000case "$host_os" in
2001 linux*)
2002 AC_MSG_RESULT([yes])
2003 ;;
2004 *)
2005 AC_MSG_RESULT([no])
2006 enable_vrrpd="no"
2007 ;;
2008esac
2009fi
2010
a71c5039
DL
2011dnl ------------------------------------------
2012dnl Check whether rtrlib was build with ssh support
2013dnl ------------------------------------------
2014AC_MSG_CHECKING([whether the RTR Library is compiled with SSH])
2015AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "rtrlib/rtrlib.h"]],
2016 [[struct tr_ssh_config config;]])],
2017 [AC_MSG_RESULT([yes])
2018 AC_DEFINE([FOUND_SSH], [1], [found_ssh])],
2019 AC_MSG_RESULT([no])
2020)
4db0cff1 2021
b249c083
DL
2022dnl ---------------
2023dnl dlopen & dlinfo
2024dnl ---------------
99e9f424 2025AC_SEARCH_LIBS([dlopen], [dl dld], [], [
30771d65
DL
2026 AC_MSG_ERROR([unable to find the dlopen()])
2027])
2028
b249c083
DL
2029AC_CHECK_HEADERS([link.h])
2030
2a636b43
DL
2031AC_CACHE_CHECK([for dlinfo(RTLD_DI_ORIGIN)], [frr_cv_rtld_di_origin], [
2032 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
b249c083
DL
2033#include <stdlib.h>
2034#ifdef HAVE_LINK_H
2035#include <link.h>
2036#endif
2037#include <dlfcn.h>
2038]], [[
2039 char origin[1];
2040 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
2041]])], [
2a636b43
DL
2042 frr_cv_rtld_di_origin=yes
2043 ], [
2044 frr_cv_rtld_di_origin=no
2045 ])
b249c083 2046])
7075f6a0 2047if test "$frr_cv_rtld_di_origin" = "yes"; then
99e9f424 2048 AC_DEFINE([HAVE_DLINFO_ORIGIN], [1], [Have dlinfo RTLD_DI_ORIGIN])
2a636b43 2049fi
b249c083 2050
2a636b43
DL
2051AC_CACHE_CHECK([for dlinfo(RTLD_DI_LINKMAP)], [frr_cv_rtld_di_linkmap], [
2052 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
b249c083
DL
2053#include <stdlib.h>
2054#ifdef HAVE_LINK_H
2055#include <link.h>
2056#endif
2057#include <dlfcn.h>
2058]], [[
2059 struct link_map *lm = NULL;
2060 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
2061]])], [
2a636b43
DL
2062 frr_cv_rtld_di_linkmap=yes
2063 ], [
2064 frr_cv_rtld_di_linkmap=no
2065 ])
b249c083 2066])
7075f6a0 2067if test "$frr_cv_rtld_di_linkmap" = "yes"; then
99e9f424 2068 AC_DEFINE([HAVE_DLINFO_LINKMAP], [1], [Have dlinfo RTLD_DI_LINKMAP])
2a636b43 2069fi
6cf9df08 2070
a71c5039 2071dnl ##########################################################################
f616c954 2072dnl test "$enable_clippy_only" != "yes"
a71c5039
DL
2073fi
2074dnl END OF LARGE if block
2075dnl ##########################################################################
62ff928b 2076
7ea487bc 2077dnl ---------------------------
6f0e3f6e 2078dnl sockaddr and netinet checks
7ea487bc 2079dnl ---------------------------
24f5e2fc
DL
2080AC_CHECK_TYPES([
2081 struct sockaddr_dl,
2082 struct vifctl, struct mfcctl, struct sioc_sg_req,
12e41d03 2083 vifi_t, struct sioc_vif_req, struct igmpmsg,
6f0e3f6e 2084 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
2655e41f 2085 struct nd_opt_adv_interval,
3eb4fbb0
LS
2086 struct nd_opt_homeagent_info, struct nd_opt_adv_interval,
2087 struct nd_opt_rdnss, struct nd_opt_dnssl],
8e4da10b 2088 [], [], FRR_INCLUDES)
6f0e3f6e
PJ
2089
2090AC_CHECK_MEMBERS([struct sockaddr.sa_len,
2091 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
ca3ccd87 2092 struct sockaddr_dl.sdl_len,
6f0e3f6e
PJ
2093 struct if6_aliasreq.ifra_lifetime,
2094 struct nd_opt_adv_interval.nd_opt_ai_type],
8e4da10b 2095 [], [], FRR_INCLUDES)
29c4c9bd 2096
6f0e3f6e 2097dnl ---------------------------
11770e10 2098dnl IRDP/pktinfo/icmphdr checks
6f0e3f6e 2099dnl ---------------------------
8dc1f7fc
DL
2100
2101AC_CHECK_TYPES([struct in_pktinfo], [
2102 AC_CHECK_TYPES([struct icmphdr], [
2103 IRDP=true
2104 ], [
2105 IRDP=false
2106 ], [FRR_INCLUDES])
2107], [
2108 IRDP=false
2109], [FRR_INCLUDES])
2110
2111case "${enable_irdp}" in
2112yes)
2113 $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
2114 ;;
2115no)
2116 IRDP=false
2117 ;;
2118esac
2119
29c4c9bd 2120
12e41d03
DL
2121dnl -----------------------
2122dnl checking for IP_PKTINFO
2123dnl -----------------------
99e9f424 2124AC_MSG_CHECKING([for IP_PKTINFO])
1b636c0a
DL
2125AC_COMPILE_IFELSE(
2126[ AC_LANG_PROGRAM([[
2127 #include <netdb.h>
2128 ]], [[
2129 int opt = IP_PKTINFO;
2130 ]])
2131],[
99e9f424
RK
2132 AC_MSG_RESULT([yes])
2133 AC_DEFINE([HAVE_IP_PKTINFO], [1], [Have IP_PKTINFO])
1b636c0a 2134],[
99e9f424 2135 AC_MSG_RESULT([no])
12e41d03
DL
2136])
2137
2138dnl ---------------------------
2139dnl checking for IP_RECVDSTADDR
2140dnl ---------------------------
99e9f424 2141AC_MSG_CHECKING([for IP_RECVDSTADDR])
1b636c0a
DL
2142AC_COMPILE_IFELSE(
2143[ AC_LANG_PROGRAM([[
2144 #include <netinet/in.h>
2145 ]], [[
2146 int opt = IP_RECVDSTADDR;
2147 ]])
2148],[
99e9f424
RK
2149 AC_MSG_RESULT([yes])
2150 AC_DEFINE([HAVE_IP_RECVDSTADDR], [1], [Have IP_RECVDSTADDR])
1b636c0a 2151],[
99e9f424 2152 AC_MSG_RESULT([no])
12e41d03
DL
2153])
2154
2155dnl ----------------------
2156dnl checking for IP_RECVIF
2157dnl ----------------------
99e9f424 2158AC_MSG_CHECKING([for IP_RECVIF])
1b636c0a
DL
2159AC_COMPILE_IFELSE(
2160[ AC_LANG_PROGRAM([[
2161 #include <netinet/in.h>
2162 ]], [[
2163 int opt = IP_RECVIF;
2164 ]])
2165],[
99e9f424
RK
2166 AC_MSG_RESULT([yes])
2167 AC_DEFINE([HAVE_IP_RECVIF], [1], [Have IP_RECVIF])
1b636c0a 2168],[
99e9f424 2169 AC_MSG_RESULT([no])
12e41d03
DL
2170])
2171
eac6e3f0
RW
2172dnl ----------------------
2173dnl checking for SO_BINDANY
2174dnl ----------------------
99e9f424 2175AC_MSG_CHECKING([for SO_BINDANY])
1b636c0a
DL
2176AC_COMPILE_IFELSE(
2177[ AC_LANG_PROGRAM([[
2178 #include <sys/socket.h>
2179 ]], [[
2180 int opt = SO_BINDANY;
2181 ]])
2182],[
99e9f424
RK
2183 AC_MSG_RESULT([yes])
2184 AC_DEFINE([HAVE_SO_BINDANY], [1], [Have SO_BINDANY])
1b636c0a 2185],[
99e9f424 2186 AC_MSG_RESULT([no])
eac6e3f0
RW
2187])
2188
2189dnl ----------------------
2190dnl checking for IP_FREEBIND
2191dnl ----------------------
99e9f424 2192AC_MSG_CHECKING([for IP_FREEBIND])
1b636c0a
DL
2193AC_COMPILE_IFELSE(
2194[ AC_LANG_PROGRAM([[
2195 #include <netinet/in.h>
2196 ]], [[
2197 int opt = IP_FREEBIND;
2198 ]])
2199],[
99e9f424
RK
2200 AC_MSG_RESULT([yes])
2201 AC_DEFINE([HAVE_IP_FREEBIND], [1], [Have IP_FREEBIND])
1b636c0a 2202],[
99e9f424 2203 AC_MSG_RESULT([no])
eac6e3f0
RW
2204])
2205
ba0cb3fe
DS
2206dnl --------------------------------------
2207dnl checking for be32dec existence or not
2208dnl --------------------------------------
19083e4f
DL
2209AC_CHECK_DECLS([be32enc, be32dec], [], [], [
2210 #ifdef HAVE_SYS_ENDIAN_H
2211 #include <sys/endian.h>
2212 #endif
2213 #ifdef HAVE_ENDIAN_H
2214 #include <endian.h>
2215 #endif
2216])
ba0cb3fe 2217
c4376c9d
SH
2218dnl --------------------------------------
2219dnl checking for clock_time monotonic struct and call
2220dnl --------------------------------------
99e9f424
RK
2221AC_CHECK_DECL([CLOCK_MONOTONIC],
2222 [AC_CHECK_LIB([rt], [clock_gettime], [LIBS="$LIBS -lrt"])
2223 AC_DEFINE([HAVE_CLOCK_MONOTONIC], [1], [Have monotonic clock])
2224], [AC_MSG_RESULT([no])], [FRR_INCLUDES])
c4376c9d 2225
6418e2d3
DL
2226AC_CHECK_DECL([CLOCK_THREAD_CPUTIME_ID], [
2227 AC_DEFINE([HAVE_CLOCK_THREAD_CPUTIME_ID], [1], [Have cpu-time clock])
2228], [AC_MSG_RESULT([no])], [FRR_INCLUDES])
2229
aef4a13f
DL
2230AC_SEARCH_LIBS([clock_nanosleep], [rt], [
2231 AC_DEFINE([HAVE_CLOCK_NANOSLEEP], [1], [Have clock_nanosleep()])
2232])
2233
bbf5ffa0
QY
2234dnl --------------------------------------
2235dnl checking for flex and bison
2236dnl --------------------------------------
4a06690f 2237
6125c10c
DL
2238dnl autoconf 2.69 AC_PROG_LEX has no parameters
2239dnl autoconf 2.70 AC_PROG_LEX prints a deprecation warning without params
2240m4_if(m4_version_compare(m4_defn([AC_AUTOCONF_VERSION]), [2.70]), [-1], [dnl
2241 dnl autoconf < 2.70
2242 AC_PROG_LEX
2243], [
2244 dnl autoconf >= 2.70
2245 AC_PROG_LEX([noyywrap])
2246])
2247
99e9f424 2248AC_MSG_CHECKING([version of flex])
1689cf7e
JAG
2249frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
2250frr_ac_flex_version="${frr_ac_flex_version##* }"
2251AC_MSG_RESULT([$frr_ac_flex_version])
2252AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
4a06690f
DL
2253 LEX="$SHELL $missing_dir/missing flex"
2254 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
2255 AC_MSG_WARN([using pregenerated flex output files])
2256 else
2257 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
2258 fi
2259 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
2260 AC_SUBST([LEXLIB], [''])
2261])
0d37f9f3 2262
bbf5ffa0 2263AC_PROG_YACC
0d37f9f3 2264dnl thanks GNU bison for this b*llshit...
99e9f424 2265AC_MSG_CHECKING([version of bison])
1689cf7e
JAG
2266frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
2267frr_ac_bison_version="${frr_ac_bison_version##* }"
2268frr_ac_bison_missing="false"
1af5b6d9 2269case "x${frr_ac_bison_version}x" in
0d37f9f3
DL
2270 x2.7*)
2271 BISON_OPENBRACE='"'
2272 BISON_CLOSEBRACE='"'
05dbb7df 2273 BISON_VERBOSE=''
1689cf7e 2274 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
0d37f9f3
DL
2275 ;;
2276 x2.*|x1.*)
1689cf7e 2277 AC_MSG_RESULT([$frr_ac_bison_version])
0d37f9f3 2278 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1689cf7e 2279 frr_ac_bison_missing="true"
0d37f9f3
DL
2280 ;;
2281 x)
2282 AC_MSG_RESULT([none])
2283 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1689cf7e 2284 frr_ac_bison_missing="true"
0d37f9f3 2285 ;;
1af5b6d9 2286 x3.[012][^0-9]*)
0d37f9f3
DL
2287 BISON_OPENBRACE='{'
2288 BISON_CLOSEBRACE='}'
05dbb7df 2289 BISON_VERBOSE='-Dparse.error=verbose'
1af5b6d9
DL
2290 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 to 3.2])
2291 ;;
2292 *)
2293 BISON_OPENBRACE='{'
2294 BISON_CLOSEBRACE='}'
2295 BISON_VERBOSE='-Dparse.error=verbose -Wno-yacc'
2296 AC_MSG_RESULT([$frr_ac_bison_version - 3.3 or newer])
0d37f9f3
DL
2297 ;;
2298esac
99e9f424
RK
2299AC_SUBST([BISON_OPENBRACE])
2300AC_SUBST([BISON_CLOSEBRACE])
2301AC_SUBST([BISON_VERBOSE])
0d37f9f3 2302
1689cf7e 2303if $frr_ac_bison_missing; then
0d37f9f3
DL
2304 YACC="$SHELL $missing_dir/missing bison -y"
2305 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
2306 AC_MSG_WARN([using pregenerated bison output files])
2307 else
2308 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
2309 fi
2310fi
bbf5ffa0 2311
edd7c245 2312dnl -------------------
2313dnl capabilities checks
2314dnl -------------------
f616c954 2315if test "$enable_capabilities" != "no"; then
99e9f424 2316 AC_MSG_CHECKING([whether prctl PR_SET_KEEPCAPS is available])
1b636c0a
DL
2317 AC_COMPILE_IFELSE(
2318 [ AC_LANG_PROGRAM([[
2319 #include <sys/prctl.h>
2320 ]], [[
2321 prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
2322 ]])
2323 ],[AC_MSG_RESULT([yes])
99e9f424 2324 AC_DEFINE([HAVE_PR_SET_KEEPCAPS], [1], [prctl])
1b636c0a
DL
2325 frr_ac_keepcaps="yes"
2326 ],[AC_MSG_RESULT(no)
2327 ])
f616c954 2328 if test "$frr_ac_keepcaps" = "yes"; then
99e9f424 2329 AC_CHECK_HEADERS([sys/capability.h])
41d3fc96 2330 fi
f616c954 2331 if test "$ac_cv_header_sys_capability_h" = "yes"; then
31d7b6da 2332 AC_CHECK_LIB([cap], [cap_init],
99e9f424 2333 [AC_DEFINE([HAVE_LCAPS], [1], [Capabilities])
41d3fc96 2334 LIBCAP="-lcap"
8e4da10b 2335 frr_ac_lcaps="yes"]
41d3fc96 2336 )
ceacedba 2337 fi
f616c954
RK
2338 if test "$frr_ac_scaps" = "yes" \
2339 -o "$frr_ac_lcaps" = "yes"; then
99e9f424 2340 AC_DEFINE([HAVE_CAPABILITIES], [1], [capabilities])
41d3fc96 2341 fi
7bfe765a
DL
2342
2343 case "$host_os" in
2344 linux*)
f616c954 2345 if test "$enable_clippy_only" != "yes"; then
7bfe765a
DL
2346 if test "$frr_ac_lcaps" != "yes"; then
2347 AC_MSG_ERROR([libcap and/or its headers were not found. Running FRR without libcap support built in causes a huge performance penalty.])
2348 fi
2cd3abe4 2349 fi
7bfe765a
DL
2350 ;;
2351 esac
2352else
2353 case "$host_os" in
2354 linux*)
2355 AC_MSG_WARN([Running FRR without libcap support built in causes a huge performance penalty.])
2356 ;;
2357 esac
edd7c245 2358fi
99e9f424 2359AC_SUBST([LIBCAP])
edd7c245 2360
fb2d1502 2361dnl ---------------------------
2362dnl check for glibc 'backtrace'
31d7b6da 2363dnl ---------------------------
f616c954 2364if test "$enable_backtrace" != "no" ; then
8c99b4c1 2365 backtrace_ok=no
68b8a15f 2366 PKG_CHECK_MODULES([UNWIND], [libunwind], [
99e9f424 2367 AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
68b8a15f
DL
2368 backtrace_ok=yes
2369 ], [
d60693fd
DL
2370 true
2371 ])
2372
2373 if test "$backtrace_ok" = "no"; then
2374 AC_CHECK_HEADER([unwind.h], [
2375 AC_SEARCH_LIBS([unw_getcontext], [unwind], [
2376 AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
2377 backtrace_ok=yes
2378 ])
2379 ])
2380 fi
2381
2382 if test "$backtrace_ok" = "no"; then
0bdeb5e5
DL
2383 AC_CHECK_HEADER([execinfo.h], [
2384 AC_SEARCH_LIBS([backtrace], [execinfo], [
2385 AC_DEFINE([HAVE_GLIBC_BACKTRACE], [1], [Glibc backtrace])
68b8a15f 2386 backtrace_ok=yes
0bdeb5e5
DL
2387 ],, [-lm])
2388 ])
d60693fd 2389 fi
8c99b4c1 2390
f616c954 2391 if test "$enable_backtrace" = "yes" -a "$backtrace_ok" = "no"; then
8c99b4c1 2392 dnl user explicitly requested backtrace but we failed to find support
68b8a15f 2393 AC_MSG_FAILURE([failed to find backtrace or libunwind support])
8c99b4c1
DL
2394 fi
2395fi
fb2d1502 2396
41be32bf
PJ
2397dnl -----------------------------------------
2398dnl check for malloc mallinfo struct and call
2399dnl this must try and link using LIBS, in
2400dnl order to check no alternative allocator
2401dnl has been specified, which might not provide
cae8bc96 2402dnl mallinfo
41be32bf 2403dnl -----------------------------------------
324be174 2404AC_CHECK_HEADERS([malloc.h malloc_np.h malloc/malloc.h],,, [FRR_INCLUDES])
fa896a1d 2405
2a636b43
DL
2406AC_CACHE_CHECK([whether mallinfo is available], [frr_cv_mallinfo], [
2407 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
fa896a1d
DL
2408#ifdef HAVE_MALLOC_H
2409#include <malloc.h>
2410#endif
324be174
DL
2411#ifdef HAVE_MALLOC_NP_H
2412#include <malloc_np.h>
2413#endif
fa896a1d
DL
2414#ifdef HAVE_MALLOC_MALLOC_H
2415#include <malloc/malloc.h>
2416#endif
2417]], [[
2418struct mallinfo ac_x; ac_x = mallinfo ();
2419]])], [
2a636b43
DL
2420 frr_cv_mallinfo=yes
2421 ], [
2422 frr_cv_mallinfo=no
2423 ])
fa896a1d 2424])
7075f6a0 2425if test "$frr_cv_mallinfo" = "yes"; then
99e9f424 2426 AC_DEFINE([HAVE_MALLINFO], [1], [mallinfo])
2a636b43 2427fi
fa896a1d 2428
51ab4dba
QY
2429AC_CACHE_CHECK([whether mallinfo2 is available], [frr_cv_mallinfo2], [
2430 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2431#ifdef HAVE_MALLOC_H
2432#include <malloc.h>
2433#endif
2434#ifdef HAVE_MALLOC_NP_H
2435#include <malloc_np.h>
2436#endif
2437#ifdef HAVE_MALLOC_MALLOC_H
2438#include <malloc/malloc.h>
2439#endif
2440]], [[
2441struct mallinfo2 ac_x; ac_x = mallinfo2 ();
2442]])], [
2443 frr_cv_mallinfo2=yes
2444 ], [
2445 frr_cv_mallinfo2=no
2446 ])
2447])
2448if test "$frr_cv_mallinfo2" = "yes"; then
2449 AC_DEFINE([HAVE_MALLINFO2], [1], [mallinfo2])
2450fi
2451
99e9f424 2452AC_MSG_CHECKING([whether malloc_usable_size is available])
fa896a1d
DL
2453AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2454#ifdef HAVE_MALLOC_H
2455#include <malloc.h>
2456#endif
2457#ifdef HAVE_MALLOC_MALLOC_H
2458#include <malloc/malloc.h>
2459#endif
2460]], [[
2461size_t ac_x; ac_x = malloc_usable_size(NULL);
2462]])], [
99e9f424
RK
2463 AC_MSG_RESULT([yes])
2464 AC_DEFINE([HAVE_MALLOC_USABLE_SIZE], [1], [malloc_usable_size])
fa896a1d 2465], [
99e9f424 2466 AC_MSG_RESULT([no])
fa896a1d 2467
99e9f424 2468 AC_MSG_CHECKING([whether malloc_size is available])
fa896a1d
DL
2469 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
2470#ifdef HAVE_MALLOC_H
2471#include <malloc.h>
2472#endif
2473#ifdef HAVE_MALLOC_MALLOC_H
2474#include <malloc/malloc.h>
2475#endif
2476]], [[
2477size_t ac_x; ac_x = malloc_size(NULL);
2478]])], [
99e9f424
RK
2479 AC_MSG_RESULT([yes])
2480 AC_DEFINE([HAVE_MALLOC_SIZE], [1], [malloc_size])
fa896a1d 2481 ], [
99e9f424 2482 AC_MSG_RESULT([no])
fa896a1d
DL
2483 ])
2484])
41be32bf 2485
408ad943 2486dnl ----------
2487dnl configure date
2488dnl ----------
5e2dd3fa
LB
2489dev_version=`echo $VERSION | grep dev`
2490#don't expire deprecated code in non 'dev' branch
f616c954 2491if test "$dev_version" = ""; then
5e2dd3fa
LB
2492 CONFDATE=0
2493else
2494 CONFDATE=`date '+%Y%m%d'`
2495fi
99e9f424 2496AC_SUBST([CONFDATE])
408ad943 2497
7ea487bc 2498dnl ------------------------------
a159ed93 2499dnl set paths for state directory
23bd12c3 2500dnl ------------------------------
99e9f424 2501AC_MSG_CHECKING([directory to use for state file])
f616c954 2502if test "$prefix" = "NONE"; then
b2f36157 2503 frr_statedir_prefix="";
23bd12c3 2504else
b2f36157 2505 frr_statedir_prefix=${prefix}
23bd12c3 2506fi
f616c954 2507if test "$localstatedir" = '${prefix}/var'; then
8e4da10b 2508 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
b2f36157
DL
2509 ${frr_statedir_prefix}/var/adm dnl
2510 ${frr_statedir_prefix}/etc dnl
a159ed93 2511 /var/run dnl
2512 /var/adm dnl
2513 /etc dnl
2514 /dev/null;
23bd12c3 2515 do
8e4da10b 2516 test -d $FRR_STATE_DIR && break
23bd12c3 2517 done
8e4da10b 2518 frr_statedir=$FRR_STATE_DIR
23bd12c3 2519else
b2f36157 2520 frr_statedir=${localstatedir}
a159ed93 2521fi
9377fc4f 2522if test "$frr_statedir" = "/dev/null"; then
99e9f424 2523 AC_MSG_ERROR([STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!])
a159ed93 2524fi
99e9f424
RK
2525AC_MSG_RESULT([${frr_statedir}])
2526AC_SUBST([frr_statedir])
b2f36157 2527
0d675e49 2528AC_DEFINE_UNQUOTED([LDPD_SOCKET], ["$frr_statedir%s%s/ldpd.sock"], [ldpd control socket])
4e99f309 2529AC_DEFINE_UNQUOTED([ZEBRA_SERV_PATH], ["$frr_statedir%s%s/zserv.api"], [zebra api socket])
89277ebf 2530AC_DEFINE_UNQUOTED([BFDD_CONTROL_SOCKET], ["$frr_statedir%s%s/bfdd.sock"], [bfdd control socket])
10514170 2531AC_DEFINE_UNQUOTED([OSPFD_GR_STATE], ["$frr_statedir%s/ospfd-gr.json"], [ospfd GR state information])
71165098 2532AC_DEFINE_UNQUOTED([OSPF6D_GR_STATE], ["$frr_statedir/ospf6d-gr.json"], [ospf6d GR state information])
43e587c1 2533AC_DEFINE_UNQUOTED([DAEMON_VTY_DIR], ["$frr_statedir%s%s"], [daemon vty directory])
99e9f424 2534AC_DEFINE_UNQUOTED([DAEMON_DB_DIR], ["$frr_statedir"], [daemon database directory])
7ea487bc 2535
95c4aff2 2536dnl autoconf does this, but it does it too late...
31d7b6da
RK
2537test "$prefix" = "NONE" && prefix=$ac_default_prefix
2538test "$exec_prefix" = "NONE" && exec_prefix='${prefix}'
95c4aff2
DL
2539
2540dnl get the full path, recursing through variables...
2541vtysh_bin="$bindir/vtysh"
2542for I in 1 2 3 4 5 6 7 8 9 10; do
2543 eval vtysh_bin="\"$vtysh_bin\""
2544done
99e9f424
RK
2545AC_DEFINE_UNQUOTED([VTYSH_BIN_PATH], ["$vtysh_bin"], [path to vtysh binary])
2546AC_SUBST([vtysh_bin])
95c4aff2 2547
a07169b1
DL
2548CFG_SYSCONF="$sysconfdir"
2549CFG_SBIN="$sbindir"
2550CFG_STATE="$frr_statedir"
30771d65 2551CFG_MODULE="$moduledir"
1c2facd1 2552CFG_YANGMODELS="$yangmodelsdir"
e4e0229a 2553CFG_SCRIPT="$scriptdir"
a07169b1
DL
2554for I in 1 2 3 4 5 6 7 8 9 10; do
2555 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
2556 eval CFG_SBIN="\"$CFG_SBIN\""
2557 eval CFG_STATE="\"$CFG_STATE\""
30771d65 2558 eval CFG_MODULE="\"$CFG_MODULE\""
1c2facd1 2559 eval CFG_YANGMODELS="\"$CFG_YANGMODELS\""
e4e0229a 2560 eval CFG_SCRIPT="\"$CFG_SCRIPT\""
a07169b1 2561done
99e9f424
RK
2562AC_SUBST([CFG_SYSCONF])
2563AC_SUBST([CFG_SBIN])
2564AC_SUBST([CFG_STATE])
2565AC_SUBST([CFG_MODULE])
e4e0229a 2566AC_SUBST([CFG_SCRIPT])
99e9f424 2567AC_SUBST([CFG_YANGMODELS])
99e9f424 2568AC_DEFINE_UNQUOTED([MODULE_PATH], ["$CFG_MODULE"], [path to modules])
e4e0229a 2569AC_DEFINE_UNQUOTED([SCRIPT_PATH], ["$CFG_SCRIPT"], [path to scripts])
99e9f424 2570AC_DEFINE_UNQUOTED([YANG_MODELS_PATH], ["$CFG_YANGMODELS"], [path to YANG data models])
3ec95567 2571AC_DEFINE_UNQUOTED([WATCHFRR_SH_PATH], ["${CFG_SBIN%/}/watchfrr.sh"], [path to watchfrr.sh])
a07169b1 2572
a71c5039 2573dnl various features
f616c954
RK
2574AM_CONDITIONAL([SUPPORT_REALMS], [test "$enable_realms" = "yes"])
2575AM_CONDITIONAL([ENABLE_BGP_VNC], [test "$enable_bgp_vnc" != "no"])
83c64a7d 2576AM_CONDITIONAL([BGP_BMP], [$bgpd_bmp])
a71c5039
DL
2577dnl northbound
2578AM_CONDITIONAL([SQLITE3], [$SQLITE3])
31d7b6da
RK
2579AM_CONDITIONAL([CONFD], [test "$enable_confd" != ""])
2580AM_CONDITIONAL([SYSREPO], [test "$enable_sysrepo" = "yes"])
2581AM_CONDITIONAL([GRPC], [test "$enable_grpc" = "yes"])
2582AM_CONDITIONAL([ZEROMQ], [test "$ZEROMQ" = "true"])
a71c5039 2583dnl plugins
31d7b6da
RK
2584AM_CONDITIONAL([RPKI], [test "$RPKI" = "true"])
2585AM_CONDITIONAL([SNMP], [test "$SNMP_METHOD" = "agentx"])
a71c5039 2586AM_CONDITIONAL([IRDP], [$IRDP])
31d7b6da
RK
2587AM_CONDITIONAL([FPM], [test "$enable_fpm" = "yes"])
2588AM_CONDITIONAL([HAVE_PROTOBUF], [test "$enable_protobuf" = "yes"])
fd193241 2589AM_CONDITIONAL([HAVE_PROTOBUF3], [$PROTO3])
efba0985
SM
2590
2591dnl PCEP plugin
74971473
JG
2592AS_IF([test "$enable_pathd" != "no"], [
2593 AC_SUBST([PATHD_PCEP_LIBS], ["pceplib/libpcep_pcc.la"])
2594 AC_SUBST([PATHD_PCEP_INCL], ["-I./pceplib "])
2595 ])
2596AC_CHECK_LIB([cunit], [CU_initialize_registry], [pcep_cunit=yes],[pcep_cunit=no])
2597AM_CONDITIONAL([PATHD_PCEP_TEST], [test "x${pcep_cunit}" = xyes])
2598AC_CHECK_PROG(VALGRIND_CHECK, valgrind, yes)
2599AM_CONDITIONAL([HAVE_VALGRIND_PCEP], [test "$VALGRIND_CHECK" = "yes"])
efba0985 2600
a71c5039 2601dnl daemons
31d7b6da 2602AM_CONDITIONAL([VTYSH], [test "$VTYSH" = "vtysh"])
f616c954
RK
2603AM_CONDITIONAL([ZEBRA], [test "$enable_zebra" != "no"])
2604AM_CONDITIONAL([BGPD], [test "$enable_bgpd" != "no"])
2605AM_CONDITIONAL([RIPD], [test "$enable_ripd" != "no"])
2606AM_CONDITIONAL([OSPFD], [test "$enable_ospfd" != "no"])
2607AM_CONDITIONAL([LDPD], [test "$enable_ldpd" != "no"])
31d7b6da
RK
2608AM_CONDITIONAL([BFDD], [test "$BFDD" = "bfdd"])
2609AM_CONDITIONAL([NHRPD], [test "$NHRPD" = "nhrpd"])
f616c954 2610AM_CONDITIONAL([EIGRPD], [test "$enable_eigrpd" != "no"])
31d7b6da
RK
2611AM_CONDITIONAL([WATCHFRR], [test "$WATCHFRR" = "watchfrr"])
2612AM_CONDITIONAL([OSPFCLIENT], [test "$OSPFCLIENT" = "ospfclient"])
f616c954
RK
2613AM_CONDITIONAL([RIPNGD], [test "$enable_ripngd" != "no"])
2614AM_CONDITIONAL([BABELD], [test "$enable_babeld" != "no"])
2615AM_CONDITIONAL([OSPF6D], [test "$enable_ospf6d" != "no"])
2616AM_CONDITIONAL([ISISD], [test "$enable_isisd" != "no"])
2617AM_CONDITIONAL([PIMD], [test "$enable_pimd" != "no"])
2618AM_CONDITIONAL([PBRD], [test "$enable_pbrd" != "no"])
2619AM_CONDITIONAL([SHARPD], [test "$enable_sharpd" = "yes"])
2620AM_CONDITIONAL([STATICD], [test "$enable_staticd" != "no"])
2621AM_CONDITIONAL([FABRICD], [test "$enable_fabricd" != "no"])
2622AM_CONDITIONAL([VRRPD], [test "$enable_vrrpd" != "no"])
4d7b695d 2623AM_CONDITIONAL([PATHD], [test "$enable_pathd" != "no"])
74971473 2624AM_CONDITIONAL([PATHD_PCEP], [test "$enable_pathd" != "no"])
7ea487bc 2625
94cfb069
DL
2626AC_CONFIG_FILES([Makefile],[
2627 test "$enable_dev_build" = "yes" && makefile_devbuild="--dev-build"
2628 ${PYTHON} "${ac_abs_top_srcdir}/python/makefile.py" ${makefile_devbuild} || exit 1
2629], [
2630 PYTHON="$PYTHON"
2631 enable_dev_build="$enable_dev_build"
2632])
892d21b1
DL
2633
2634AC_CONFIG_FILES([
06871ed9 2635 config.version
22ea387f 2636 redhat/frr.spec
c737c7ba 2637 alpine/APKBUILD
3ab11ecc 2638 snapcraft/snapcraft.yaml
b7a97f82 2639 lib/version.h
8efe88ea 2640 tests/lib/cli/test_cli.refout
cbd04084 2641 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
7f57883e
DS
2642 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
2643 pkgsrc/eigrpd.sh])
65efcfce 2644
99e9f424
RK
2645AC_CONFIG_FILES([vtysh/extract.pl], [chmod +x vtysh/extract.pl])
2646AC_CONFIG_FILES([tools/frr], [chmod +x tools/frr])
ea4d91bf
DL
2647AC_CONFIG_FILES([tools/watchfrr.sh], [chmod +x tools/watchfrr.sh])
2648AC_CONFIG_FILES([tools/frrinit.sh], [chmod +x tools/frrinit.sh])
2649AC_CONFIG_FILES([tools/frrcommon.sh])
566397ba
EB
2650AC_CONFIG_FILES([tools/frr.service])
2651AC_CONFIG_FILES([tools/frr@.service])
65efcfce 2652
31d7b6da 2653AS_IF([test "$with_pkg_git_version" = "yes"], [
306ed681
DL
2654 AC_CONFIG_COMMANDS([lib/gitversion.h], [
2655 dst="${ac_abs_top_builddir}/lib/gitversion.h"
2656 ${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
2657 "${ac_abs_top_srcdir}" \
2658 > "${dst}.tmp"
f616c954 2659 test -f "$dst" \
306ed681
DL
2660 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2661 && rm "${dst}.tmp" \
2662 || mv "${dst}.tmp" "${dst}"
2663 ], [
2664 PERL="$PERL"
2665 ])
2666])
2667
1689cf7e 2668## Hack, but working solution to avoid rebuilding of frr.info.
48577196 2669## It's already in CVS until texinfo 4.7 is more common.
14c17fd8 2670AC_OUTPUT
7ea487bc 2671
7134d0e9
EB
2672if test "$enable_rpath" = "yes" ; then
2673 true
2674else
2675 # See https://old-en.opensuse.org/openSUSE:Packaging_Guidelines#Removing_Rpath
2554d126
DL
2676 sed -e 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool > libtool.sed && cat libtool.sed > libtool
2677 sed -e 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool > libtool.sed && cat libtool.sed > libtool
2678 test -f libtool.sed && rm libtool.sed
7134d0e9
EB
2679fi
2680
7ea487bc 2681echo "
447a8fe9 2682FRRouting configuration
b2f36157
DL
2683------------------------------
2684FRR version : ${PACKAGE_VERSION}
1080c13f 2685host operating system : ${host_os}
7ea487bc 2686source code location : ${srcdir}
2687compiler : ${CC}
1c35c57c 2688compiler flags : ${CFLAGS} ${WERROR} ${AC_CFLAGS} ${SAN_FLAGS}
6f0e3f6e 2689make : ${MAKE-make}
dbac691d 2690linker flags : ${LDFLAGS} ${SAN_FLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
b2f36157 2691state file directory : ${frr_statedir}
dc7a2bf1 2692config file directory : `eval echo \`echo ${sysconfdir}\``
30771d65 2693module directory : ${CFG_MODULE}
e4e0229a 2694script directory : ${CFG_SCRIPT}
b2f36157
DL
2695user to run as : ${enable_user}
2696group to run as : ${enable_group}
2697group for vty sockets : ${enable_vty_group}
aa593d5e 2698config file mask : ${enable_configfile_mask}
2699log file mask : ${enable_logfile_mask}
2b2f275e 2700zebra protobuf enabled : ${enable_protobuf:-no}
354196c0 2701vici socket path : ${vici_socket}
dc7a2bf1 2702
2703The above user and group must have read/write access to the state file
105b8239 2704directory and to the config files in the config file directory."
410a2492 2705
45f01188
DL
2706if test -n "$enable_datacenter"; then
2707 AC_MSG_WARN([The --enable-datacenter compile time option is deprecated. Please modify the init script to pass -F datacenter to the daemons instead.])
2708fi
2709if test -n "$enable_time_check"; then
2710 AC_MSG_WARN([The --enable-time-check compile time option is deprecated. Please use the service cputime-stats configuration option instead.])
2711fi
2712if test -n "$enable_cpu_time"; then
2713 AC_MSG_WARN([The --enable-cpu-time compile time option is deprecated. Please use the service cputime-warning NNN configuration option instead.])
2714fi
2715
f616c954 2716if test "$enable_doc" != "no" -a "$frr_py_mod_sphinx" = "false"; then
45da32d7
DL
2717 AC_MSG_WARN([sphinx is missing but required to build documentation])
2718fi
7075f6a0 2719if test "$frr_py_mod_pytest" = "false"; then
45da32d7 2720 AC_MSG_WARN([pytest is missing, unit tests cannot be performed])
410a2492 2721fi