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