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