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