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