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