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