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