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