]> git.proxmox.com Git - mirror_frr.git/blame - configure.ac
Merge pull request #5793 from ton31337/fix/formatting_show_bgp_summary_failed
[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])
53d93be1 125AM_CONDITIONAL([PKGSRC], [test "x$pkgsrcrcdir" != "x"])
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
DL
199 ])
200 if test "${cachename}" = yes; then
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
83284209
AJ
245if test "x${enable_gcov}" = "xyes"; then
246 if test "z$orig_cflags" = "z"; then
247 AC_C_FLAG([-coverage])
248 AC_C_FLAG([-O0])
249 fi
250
251 LDFLAGS="${LDFLAGS} -lgcov"
b4fd9ea7
QY
252fi
253
254if test "x${enable_clang_coverage}" = "xyes"; then
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
263if test "x${enable_dev_build}" = "xyes"; then
99e9f424 264 AC_DEFINE([DEV_BUILD], [1], [Build for development])
09329dbc
DS
265 if test "z$orig_cflags" = "z"; then
266 AC_C_FLAG([-g3])
267 AC_C_FLAG([-O0])
268 fi
634949ae 269 if test "x${enable_lua}" = "xyes"; 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
634949ae
DS
278 if test "x${enable_lua}" = "xyes"; then
279 AC_MSG_ERROR([Lua is not meant to be built/used outside of development at this time])
280 fi
09329dbc
DS
281 if test "z$orig_cflags" = "z"; then
282 AC_C_FLAG([-g])
39c94f89 283 AC_C_FLAG([-O2])
09329dbc
DS
284 fi
285fi
286AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
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])
298if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
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
aa9584c1
DS
321if test x"${enable_werror}" = x"yes" ; then
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])
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])
d6e76257 403AM_CONDITIONAL([STATIC_BIN], [test "x$enable_static_bin" = "xyes"])
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]),
a16dcf7c 454 [ test "x$withval" != "xno" && 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],
8dc1f7fc 546 AS_HELP_STRING([--disable-irdp], [enable IRDP server support in zebra (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
605AS_IF([test x"${with_crypto}" = x"openssl"], [
606AC_CHECK_LIB([crypto], [EVP_DigestInit], [LIBS="$LIBS -lcrypto"], [], [])
607if test $ac_cv_lib_crypto_EVP_DigestInit = no; then
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
612], [test x"${with_crypto}" = x"internal" || test x"${with_crypto}" = x"" ], [AC_DEFINE([CRYPTO_INTERNAL], [1], [Compile with internal cryptographic implementation])
613], [AC_MSG_ERROR([Unknown value for --with-crypto])]
614)
6b6942f9 615
c71b8557 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])
39d3cc4e 619if test "$ac_cv_lib_json_c_json_object_get" = no; then
99e9f424 620 AC_CHECK_LIB([json], [json_object_get], [LIBS="$LIBS -ljson"])
39d3cc4e 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
924b9229 633if test x"${enable_time_check}" != x"no" ; then
634 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; 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"])
37219958
DS
653 if test $ac_cv_lib_systemd_sd_notify = no; then
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
76981cd3 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
df970aa6 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
411314ed 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
acfa8927 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
df970aa6 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
576b6b5d 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
45da32d7
DL
705if test "${enable_doc}" != "no"; then
706 FRR_PYTHON_MODULES([sphinx], , [
707 if test "${enable_doc}" = "yes"; then
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
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])
d2a0ccc6 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
0b02a1b4
JAG
741if test x"${enable_user}" = x"no"; then
742 enable_user=""
743else
744 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
b2f36157 745 enable_user="frr"
0b02a1b4 746 fi
99e9f424 747 AC_DEFINE_UNQUOTED([FRR_USER], ["${enable_user}"], [frr User])
edd7c245 748fi
edd7c245 749
0b02a1b4
JAG
750if test x"${enable_group}" = x"no"; then
751 enable_group=""
752else
753 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
b2f36157 754 enable_group="frr"
0b02a1b4 755 fi
99e9f424 756 AC_DEFINE_UNQUOTED([FRR_GROUP], ["${enable_group}"], [frr Group])
edd7c245 757fi
edd7c245 758
759if test x"${enable_vty_group}" = x"yes" ; then
8d4aee5d 760 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
79cb2169 761elif test x"${enable_vty_group}" != x""; then
8d4aee5d 762 if test x"${enable_vty_group}" != x"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 ;;
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 --------------------
99e9f424 799AM_CONDITIONAL([HAVE_GCOV], [test '!' "$enable_gcov" = no])
83284209 800
c737c7ba
AJ
801dnl ------------------------------------
802dnl Alpine only accepts numeric versions
803dnl ------------------------------------
804if test "x${enable_numeric_version}" != "x" ; then
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 -----------------------------------
813if test "x${EXTRAVERSION}" != "x" ; 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
a16dcf7c
DL
821if test "x$with_pkg_git_version" = "xyes"; then
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
828AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
0be793e6 829
42efb0d4 830AC_CHECK_TOOL([OBJCOPY], [objcopy], [:])
1b68b1cd
RK
831if test "x${OBJCOPY}" != "x:"; then
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
2b43bf23
DO
1029[#if HAVE_NET_IF_VAR_H
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>
6f0e3f6e
PJ
1064#if HAVE_NETINET_IN_VAR_H
1065# include <netinet/in_var.h>
1066#endif
1067#if HAVE_NET_IF_DL_H
1068# include <net/if_dl.h>
1069#endif
6f0e3f6e
PJ
1070#if HAVE_NET_NETOPT_H
1071# include <net/netopt.h>
1072#endif
24f5e2fc 1073#include <net/route.h>
6f0e3f6e
PJ
1074#if HAVE_INET_ND_H
1075# include <inet/nd.h>
1076#endif
24f5e2fc 1077#include <arpa/inet.h>
11770e10
PJ
1078/* Required for IDRP */
1079#if HAVE_NETINET_IP_ICMP_H
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
JAG
1125
1126 if test "x${enable_pimd}" != "xno"; then
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
99e9f424 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 ------------------------
1152if test "${enable_realms}" = "yes"; then
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"!
1178if test "${enable_clippy_only}" != "yes"; then
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])
64537bc4
DL
1246 if test $ac_cv_header_readline_history_h = no;then
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])
64537bc4 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])
64537bc4 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 *)
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])
7c0cbd0e 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
b3f2bf7c
RW
1404[#if HAVE_LINUX_MROUTE_H
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
b3f2bf7c
RW
1418[#if HAVE_NETINET_IP_MROUTE_H
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)
0df7c91f
PJ
1476if test $ac_cv_have_decl_TCP_MD5SIG = no; then
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 ---------------------------
1493if test "x$enable_pcreposix" = "xyes"; then
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
LC
1500dnl ##########################################################################
1501dnl test "${enable_clippy_only}" != "yes"
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
6f0e3f6e
PJ
1531[#if HAVE_NETINET6_IN6_H
1532#include <netinet6/in6.h>
1533#endif
1534#if HAVE_NETINET_IN6_VAR_H
1535#include <netinet/in6_var.h>
1536#endif
24f5e2fc 1537#include <netinet/icmp6.h>
6f0e3f6e
PJ
1538#if HAVE_NETINET6_IN6_VAR_H
1539# include <netinet6/in6_var.h>
1540#endif
1541#if 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
30237d29 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
39d3cc4e 1572if test "$ac_cv_lib_json_c_json_object_get" = no -a "x$BFDD" = "xbfdd"; 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)
2163a630 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 *)
1598 if test "${enable_nhrpd}" = "yes"; then
1599 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1600 fi
1601 ;;
1602esac
7f57883e 1603
9473e340
DS
1604if test "${enable_watchfrr}" = "no";then
1605 WATCHFRR=""
d0199430 1606else
9473e340 1607 WATCHFRR="watchfrr"
d0199430 1608fi
1609
1ef74ef7 1610OSPFCLIENT=""
cd66cd4c 1611if test "${enable_ospfapi}" != "no";then
99e9f424 1612 AC_DEFINE([SUPPORT_OSPF_API], [1], [OSPFAPI])
1ef74ef7 1613
cd66cd4c 1614 if test "${enable_ospfclient}" != "no";then
1ef74ef7 1615 OSPFCLIENT="ospfclient"
1ef74ef7 1616 fi
7ea487bc 1617fi
cd66cd4c 1618
7ea487bc 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
f95f2ad9 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
1648if test "${enable_clippy_only}" != "yes"; then
1649dnl ##########################################################################
7ea487bc 1650
1651dnl ------------------
b1fc9acb 1652dnl check Net-SNMP library
7ea487bc 1653dnl ------------------
53b99735 1654if test "${enable_snmp}" != "" -a "${enable_snmp}" != "no"; then
08d7f653
VB
1655 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1656 if test x"$NETSNMP_CONFIG" = x"no"; then
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")
5bce33b3
RW
1729 if test "x$CONFD" = "x/bin/false"; then
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 ------
1772if test "x$enable_zeromq" != "xno"; then
1773 PKG_CHECK_MODULES([ZEROMQ], [libzmq >= 4.0.0], [
1774 AC_DEFINE([HAVE_ZEROMQ], [1], [Enable ZeroMQ support])
1775 ZEROMQ=true
1776 ], [
1777 if test "x$enable_zeromq" = "xyes"; then
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 ------------------------------------
1786if test "${enable_rpki}" = "yes"; then
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
1794dnl ------------------------------------------
1795dnl Check whether rtrlib was build with ssh support
1796dnl ------------------------------------------
1797AC_MSG_CHECKING([whether the RTR Library is compiled with SSH])
1798AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "rtrlib/rtrlib.h"]],
1799 [[struct tr_ssh_config config;]])],
1800 [AC_MSG_RESULT([yes])
1801 AC_DEFINE([FOUND_SSH], [1], [found_ssh])],
1802 AC_MSG_RESULT([no])
1803)
4db0cff1 1804
b249c083
DL
1805dnl ---------------
1806dnl dlopen & dlinfo
1807dnl ---------------
99e9f424 1808AC_SEARCH_LIBS([dlopen], [dl dld], [], [
30771d65
DL
1809 AC_MSG_ERROR([unable to find the dlopen()])
1810])
1811
b249c083
DL
1812AC_CHECK_HEADERS([link.h])
1813
2a636b43
DL
1814AC_CACHE_CHECK([for dlinfo(RTLD_DI_ORIGIN)], [frr_cv_rtld_di_origin], [
1815 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
b249c083
DL
1816#include <stdlib.h>
1817#ifdef HAVE_LINK_H
1818#include <link.h>
1819#endif
1820#include <dlfcn.h>
1821]], [[
1822 char origin[1];
1823 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1824]])], [
2a636b43
DL
1825 frr_cv_rtld_di_origin=yes
1826 ], [
1827 frr_cv_rtld_di_origin=no
1828 ])
b249c083 1829])
2a636b43 1830if test "$frr_cv_rtld_di_origin" = yes; then
99e9f424 1831 AC_DEFINE([HAVE_DLINFO_ORIGIN], [1], [Have dlinfo RTLD_DI_ORIGIN])
2a636b43 1832fi
b249c083 1833
2a636b43
DL
1834AC_CACHE_CHECK([for dlinfo(RTLD_DI_LINKMAP)], [frr_cv_rtld_di_linkmap], [
1835 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
b249c083
DL
1836#include <stdlib.h>
1837#ifdef HAVE_LINK_H
1838#include <link.h>
1839#endif
1840#include <dlfcn.h>
1841]], [[
1842 struct link_map *lm = NULL;
1843 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1844]])], [
2a636b43
DL
1845 frr_cv_rtld_di_linkmap=yes
1846 ], [
1847 frr_cv_rtld_di_linkmap=no
1848 ])
b249c083 1849])
2a636b43 1850if test "$frr_cv_rtld_di_linkmap" = yes; then
99e9f424 1851 AC_DEFINE([HAVE_DLINFO_LINKMAP], [1], [Have dlinfo RTLD_DI_LINKMAP])
2a636b43 1852fi
6cf9df08 1853
a71c5039
DL
1854dnl ##########################################################################
1855dnl test "${enable_clippy_only}" != "yes"
1856fi
1857dnl END OF LARGE if block
1858dnl ##########################################################################
62ff928b 1859
7ea487bc 1860dnl ---------------------------
6f0e3f6e 1861dnl sockaddr and netinet checks
7ea487bc 1862dnl ---------------------------
24f5e2fc
DL
1863AC_CHECK_TYPES([
1864 struct sockaddr_dl,
1865 struct vifctl, struct mfcctl, struct sioc_sg_req,
12e41d03 1866 vifi_t, struct sioc_vif_req, struct igmpmsg,
6f0e3f6e 1867 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
2655e41f 1868 struct nd_opt_adv_interval,
3eb4fbb0
LS
1869 struct nd_opt_homeagent_info, struct nd_opt_adv_interval,
1870 struct nd_opt_rdnss, struct nd_opt_dnssl],
8e4da10b 1871 [], [], FRR_INCLUDES)
6f0e3f6e
PJ
1872
1873AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1874 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
ca3ccd87 1875 struct sockaddr_dl.sdl_len,
6f0e3f6e
PJ
1876 struct if6_aliasreq.ifra_lifetime,
1877 struct nd_opt_adv_interval.nd_opt_ai_type],
8e4da10b 1878 [], [], FRR_INCLUDES)
29c4c9bd 1879
6f0e3f6e 1880dnl ---------------------------
11770e10 1881dnl IRDP/pktinfo/icmphdr checks
6f0e3f6e 1882dnl ---------------------------
8dc1f7fc
DL
1883
1884AC_CHECK_TYPES([struct in_pktinfo], [
1885 AC_CHECK_TYPES([struct icmphdr], [
1886 IRDP=true
1887 ], [
1888 IRDP=false
1889 ], [FRR_INCLUDES])
1890], [
1891 IRDP=false
1892], [FRR_INCLUDES])
1893
1894case "${enable_irdp}" in
1895yes)
1896 $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1897 ;;
1898no)
1899 IRDP=false
1900 ;;
1901esac
1902
29c4c9bd 1903
12e41d03
DL
1904dnl -----------------------
1905dnl checking for IP_PKTINFO
1906dnl -----------------------
99e9f424 1907AC_MSG_CHECKING([for IP_PKTINFO])
12e41d03
DL
1908AC_TRY_COMPILE([#include <netdb.h>], [
1909 int opt = IP_PKTINFO;
1910], [
99e9f424
RK
1911 AC_MSG_RESULT([yes])
1912 AC_DEFINE([HAVE_IP_PKTINFO], [1], [Have IP_PKTINFO])
12e41d03 1913], [
99e9f424 1914 AC_MSG_RESULT([no])
12e41d03
DL
1915])
1916
1917dnl ---------------------------
1918dnl checking for IP_RECVDSTADDR
1919dnl ---------------------------
99e9f424 1920AC_MSG_CHECKING([for IP_RECVDSTADDR])
12e41d03
DL
1921AC_TRY_COMPILE([#include <netinet/in.h>], [
1922 int opt = IP_RECVDSTADDR;
1923], [
99e9f424
RK
1924 AC_MSG_RESULT([yes])
1925 AC_DEFINE([HAVE_IP_RECVDSTADDR], [1], [Have IP_RECVDSTADDR])
12e41d03 1926], [
99e9f424 1927 AC_MSG_RESULT([no])
12e41d03
DL
1928])
1929
1930dnl ----------------------
1931dnl checking for IP_RECVIF
1932dnl ----------------------
99e9f424 1933AC_MSG_CHECKING([for IP_RECVIF])
12e41d03
DL
1934AC_TRY_COMPILE([#include <netinet/in.h>], [
1935 int opt = IP_RECVIF;
1936], [
99e9f424
RK
1937 AC_MSG_RESULT([yes])
1938 AC_DEFINE([HAVE_IP_RECVIF], [1], [Have IP_RECVIF])
12e41d03 1939], [
99e9f424 1940 AC_MSG_RESULT([no])
12e41d03
DL
1941])
1942
eac6e3f0
RW
1943dnl ----------------------
1944dnl checking for SO_BINDANY
1945dnl ----------------------
99e9f424 1946AC_MSG_CHECKING([for SO_BINDANY])
eac6e3f0
RW
1947AC_TRY_COMPILE([#include <sys/socket.h>], [
1948 int opt = SO_BINDANY;
1949], [
99e9f424
RK
1950 AC_MSG_RESULT([yes])
1951 AC_DEFINE([HAVE_SO_BINDANY], [1], [Have SO_BINDANY])
eac6e3f0 1952], [
99e9f424 1953 AC_MSG_RESULT([no])
eac6e3f0
RW
1954])
1955
1956dnl ----------------------
1957dnl checking for IP_FREEBIND
1958dnl ----------------------
99e9f424 1959AC_MSG_CHECKING([for IP_FREEBIND])
eac6e3f0
RW
1960AC_TRY_COMPILE([#include <netinet/in.h>], [
1961 int opt = IP_FREEBIND;
1962], [
99e9f424
RK
1963 AC_MSG_RESULT([yes])
1964 AC_DEFINE([HAVE_IP_FREEBIND], [1], [Have IP_FREEBIND])
eac6e3f0 1965], [
99e9f424 1966 AC_MSG_RESULT([no])
eac6e3f0
RW
1967])
1968
ba0cb3fe
DS
1969dnl --------------------------------------
1970dnl checking for be32dec existence or not
1971dnl --------------------------------------
1972AC_CHECK_DECLS([be32enc, be32dec], [], [],
1973 [#include <sys/endian.h>])
1974
c4376c9d
SH
1975dnl --------------------------------------
1976dnl checking for clock_time monotonic struct and call
1977dnl --------------------------------------
99e9f424
RK
1978AC_CHECK_DECL([CLOCK_MONOTONIC],
1979 [AC_CHECK_LIB([rt], [clock_gettime], [LIBS="$LIBS -lrt"])
1980 AC_DEFINE([HAVE_CLOCK_MONOTONIC], [1], [Have monotonic clock])
1981], [AC_MSG_RESULT([no])], [FRR_INCLUDES])
c4376c9d 1982
bbf5ffa0
QY
1983dnl --------------------------------------
1984dnl checking for flex and bison
1985dnl --------------------------------------
4a06690f 1986
bbf5ffa0 1987AM_PROG_LEX
99e9f424 1988AC_MSG_CHECKING([version of flex])
1689cf7e
JAG
1989frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1990frr_ac_flex_version="${frr_ac_flex_version##* }"
1991AC_MSG_RESULT([$frr_ac_flex_version])
1992AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
4a06690f
DL
1993 LEX="$SHELL $missing_dir/missing flex"
1994 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1995 AC_MSG_WARN([using pregenerated flex output files])
1996 else
1997 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1998 fi
1999 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
2000 AC_SUBST([LEXLIB], [''])
2001])
0d37f9f3 2002
bbf5ffa0 2003AC_PROG_YACC
0d37f9f3 2004dnl thanks GNU bison for this b*llshit...
99e9f424 2005AC_MSG_CHECKING([version of bison])
1689cf7e
JAG
2006frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
2007frr_ac_bison_version="${frr_ac_bison_version##* }"
2008frr_ac_bison_missing="false"
1af5b6d9 2009case "x${frr_ac_bison_version}x" in
0d37f9f3
DL
2010 x2.7*)
2011 BISON_OPENBRACE='"'
2012 BISON_CLOSEBRACE='"'
05dbb7df 2013 BISON_VERBOSE=''
1689cf7e 2014 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
0d37f9f3
DL
2015 ;;
2016 x2.*|x1.*)
1689cf7e 2017 AC_MSG_RESULT([$frr_ac_bison_version])
0d37f9f3 2018 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1689cf7e 2019 frr_ac_bison_missing="true"
0d37f9f3
DL
2020 ;;
2021 x)
2022 AC_MSG_RESULT([none])
2023 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1689cf7e 2024 frr_ac_bison_missing="true"
0d37f9f3 2025 ;;
1af5b6d9 2026 x3.[012][^0-9]*)
0d37f9f3
DL
2027 BISON_OPENBRACE='{'
2028 BISON_CLOSEBRACE='}'
05dbb7df 2029 BISON_VERBOSE='-Dparse.error=verbose'
1af5b6d9
DL
2030 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 to 3.2])
2031 ;;
2032 *)
2033 BISON_OPENBRACE='{'
2034 BISON_CLOSEBRACE='}'
2035 BISON_VERBOSE='-Dparse.error=verbose -Wno-yacc'
2036 AC_MSG_RESULT([$frr_ac_bison_version - 3.3 or newer])
0d37f9f3
DL
2037 ;;
2038esac
99e9f424
RK
2039AC_SUBST([BISON_OPENBRACE])
2040AC_SUBST([BISON_CLOSEBRACE])
2041AC_SUBST([BISON_VERBOSE])
0d37f9f3 2042
1689cf7e 2043if $frr_ac_bison_missing; then
0d37f9f3
DL
2044 YACC="$SHELL $missing_dir/missing bison -y"
2045 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
2046 AC_MSG_WARN([using pregenerated bison output files])
2047 else
2048 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
2049 fi
2050fi
bbf5ffa0 2051
edd7c245 2052dnl -------------------
2053dnl capabilities checks
2054dnl -------------------
41d3fc96 2055if test "${enable_capabilities}" != "no"; then
99e9f424
RK
2056 AC_MSG_CHECKING([whether prctl PR_SET_KEEPCAPS is available])
2057 AC_TRY_COMPILE([#include <sys/prctl.h>], [prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
2058 [AC_MSG_RESULT([yes])
2059 AC_DEFINE([HAVE_PR_SET_KEEPCAPS], [1], [prctl])
8e4da10b 2060 frr_ac_keepcaps="yes"],
99e9f424 2061 AC_MSG_RESULT([no])
edd7c245 2062 )
8e4da10b 2063 if test x"${frr_ac_keepcaps}" = x"yes"; then
99e9f424 2064 AC_CHECK_HEADERS([sys/capability.h])
41d3fc96 2065 fi
2066 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
99e9f424
RK
2067 AC_CHECK_LIB([cap], [cap_init],
2068 [AC_DEFINE([HAVE_LCAPS], [1], [Capabilities])
41d3fc96 2069 LIBCAP="-lcap"
8e4da10b 2070 frr_ac_lcaps="yes"]
41d3fc96 2071 )
ceacedba 2072 else
99e9f424
RK
2073 AC_CHECK_HEADERS([priv.h],
2074 [AC_MSG_CHECKING([Solaris style privileges are available])
2075 AC_TRY_COMPILE([#include <priv.h>], [getpflags(PRIV_AWARE);],
2076 [AC_MSG_RESULT([yes])
2077 AC_DEFINE([HAVE_SOLARIS_CAPABILITIES], [1], [getpflags])
8e4da10b 2078 frr_ac_scaps="yes"],
ceacedba 2079 AC_MSG_RESULT(no)
2080 )
2081 ]
2082 )
2083 fi
8e4da10b
DL
2084 if test x"${frr_ac_scaps}" = x"yes" \
2085 -o x"${frr_ac_lcaps}" = x"yes"; then
99e9f424 2086 AC_DEFINE([HAVE_CAPABILITIES], [1], [capabilities])
41d3fc96 2087 fi
7bfe765a
DL
2088
2089 case "$host_os" in
2090 linux*)
2cd3abe4 2091 if test "${enable_clippy_only}" != "yes"; then
7bfe765a
DL
2092 if test "$frr_ac_lcaps" != "yes"; then
2093 AC_MSG_ERROR([libcap and/or its headers were not found. Running FRR without libcap support built in causes a huge performance penalty.])
2094 fi
2cd3abe4 2095 fi
7bfe765a
DL
2096 ;;
2097 esac
2098else
2099 case "$host_os" in
2100 linux*)
2101 AC_MSG_WARN([Running FRR without libcap support built in causes a huge performance penalty.])
2102 ;;
2103 esac
edd7c245 2104fi
99e9f424 2105AC_SUBST([LIBCAP])
edd7c245 2106
fb2d1502 2107dnl ---------------------------
2108dnl check for glibc 'backtrace'
2109dnl ---------------------------
8c99b4c1
DL
2110if test x"${enable_backtrace}" != x"no" ; then
2111 backtrace_ok=no
68b8a15f 2112 PKG_CHECK_MODULES([UNWIND], [libunwind], [
99e9f424 2113 AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
68b8a15f
DL
2114 backtrace_ok=yes
2115 ], [
d60693fd
DL
2116 true
2117 ])
2118
2119 if test "$backtrace_ok" = "no"; then
2120 AC_CHECK_HEADER([unwind.h], [
2121 AC_SEARCH_LIBS([unw_getcontext], [unwind], [
2122 AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
2123 backtrace_ok=yes
2124 ])
2125 ])
2126 fi
2127
2128 if test "$backtrace_ok" = "no"; then
68b8a15f
DL
2129 case "$host_os" in
2130 sunos* | solaris2*)
2131 AC_CHECK_FUNCS([printstack], [
99e9f424 2132 AC_DEFINE([HAVE_PRINTSTACK], [1], [Solaris printstack])
68b8a15f
DL
2133 backtrace_ok=yes
2134 ])
2135 ;;
2136 esac
2137 if test "$backtrace_ok" = no; then
2138 AC_CHECK_HEADER([execinfo.h], [
2139 AC_SEARCH_LIBS([backtrace], [execinfo], [
99e9f424 2140 AC_DEFINE([HAVE_GLIBC_BACKTRACE], [1], [Glibc backtrace])
68b8a15f
DL
2141 backtrace_ok=yes
2142 ],, [-lm])
2143 ])
2144 fi
d60693fd 2145 fi
8c99b4c1
DL
2146
2147 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
2148 dnl user explicitly requested backtrace but we failed to find support
68b8a15f 2149 AC_MSG_FAILURE([failed to find backtrace or libunwind support])
8c99b4c1
DL
2150 fi
2151fi
fb2d1502 2152
41be32bf
PJ
2153dnl -----------------------------------------
2154dnl check for malloc mallinfo struct and call
2155dnl this must try and link using LIBS, in
2156dnl order to check no alternative allocator
2157dnl has been specified, which might not provide
2158dnl mallinfo, e.g. such as Umem on Solaris.
2159dnl -----------------------------------------
324be174 2160AC_CHECK_HEADERS([malloc.h malloc_np.h malloc/malloc.h],,, [FRR_INCLUDES])
fa896a1d 2161
2a636b43
DL
2162AC_CACHE_CHECK([whether mallinfo is available], [frr_cv_mallinfo], [
2163 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
fa896a1d
DL
2164#ifdef HAVE_MALLOC_H
2165#include <malloc.h>
2166#endif
324be174
DL
2167#ifdef HAVE_MALLOC_NP_H
2168#include <malloc_np.h>
2169#endif
fa896a1d
DL
2170#ifdef HAVE_MALLOC_MALLOC_H
2171#include <malloc/malloc.h>
2172#endif
2173]], [[
2174struct mallinfo ac_x; ac_x = mallinfo ();
2175]])], [
2a636b43
DL
2176 frr_cv_mallinfo=yes
2177 ], [
2178 frr_cv_mallinfo=no
2179 ])
fa896a1d 2180])
2a636b43 2181if test "$frr_cv_mallinfo" = yes; then
99e9f424 2182 AC_DEFINE([HAVE_MALLINFO], [1], [mallinfo])
2a636b43 2183fi
fa896a1d 2184
99e9f424 2185AC_MSG_CHECKING([whether malloc_usable_size is available])
fa896a1d
DL
2186AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2187#ifdef HAVE_MALLOC_H
2188#include <malloc.h>
2189#endif
2190#ifdef HAVE_MALLOC_MALLOC_H
2191#include <malloc/malloc.h>
2192#endif
2193]], [[
2194size_t ac_x; ac_x = malloc_usable_size(NULL);
2195]])], [
99e9f424
RK
2196 AC_MSG_RESULT([yes])
2197 AC_DEFINE([HAVE_MALLOC_USABLE_SIZE], [1], [malloc_usable_size])
fa896a1d 2198], [
99e9f424 2199 AC_MSG_RESULT([no])
fa896a1d 2200
99e9f424 2201 AC_MSG_CHECKING([whether malloc_size is available])
fa896a1d
DL
2202 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
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_size(NULL);
2211]])], [
99e9f424
RK
2212 AC_MSG_RESULT([yes])
2213 AC_DEFINE([HAVE_MALLOC_SIZE], [1], [malloc_size])
fa896a1d 2214 ], [
99e9f424 2215 AC_MSG_RESULT([no])
fa896a1d
DL
2216 ])
2217])
41be32bf 2218
408ad943 2219dnl ----------
2220dnl configure date
2221dnl ----------
5e2dd3fa
LB
2222dev_version=`echo $VERSION | grep dev`
2223#don't expire deprecated code in non 'dev' branch
2224if test "${dev_version}" = ""; then
2225 CONFDATE=0
2226else
2227 CONFDATE=`date '+%Y%m%d'`
2228fi
99e9f424 2229AC_SUBST([CONFDATE])
408ad943 2230
7ea487bc 2231dnl ------------------------------
a159ed93 2232dnl set paths for state directory
23bd12c3 2233dnl ------------------------------
99e9f424 2234AC_MSG_CHECKING([directory to use for state file])
23bd12c3 2235if test "${prefix}" = "NONE"; then
b2f36157 2236 frr_statedir_prefix="";
23bd12c3 2237else
b2f36157 2238 frr_statedir_prefix=${prefix}
23bd12c3 2239fi
2240if test "${localstatedir}" = '${prefix}/var'; then
8e4da10b 2241 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
b2f36157
DL
2242 ${frr_statedir_prefix}/var/adm dnl
2243 ${frr_statedir_prefix}/etc dnl
a159ed93 2244 /var/run dnl
2245 /var/adm dnl
2246 /etc dnl
2247 /dev/null;
23bd12c3 2248 do
8e4da10b 2249 test -d $FRR_STATE_DIR && break
23bd12c3 2250 done
8e4da10b 2251 frr_statedir=$FRR_STATE_DIR
23bd12c3 2252else
b2f36157 2253 frr_statedir=${localstatedir}
a159ed93 2254fi
b2f36157 2255if test $frr_statedir = "/dev/null"; then
99e9f424 2256 AC_MSG_ERROR([STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!])
a159ed93 2257fi
99e9f424
RK
2258AC_MSG_RESULT([${frr_statedir}])
2259AC_SUBST([frr_statedir])
b2f36157 2260
0d675e49 2261AC_DEFINE_UNQUOTED([LDPD_SOCKET], ["$frr_statedir%s%s/ldpd.sock"], [ldpd control socket])
4e99f309 2262AC_DEFINE_UNQUOTED([ZEBRA_SERV_PATH], ["$frr_statedir%s%s/zserv.api"], [zebra api socket])
89277ebf 2263AC_DEFINE_UNQUOTED([BFDD_CONTROL_SOCKET], ["$frr_statedir%s%s/bfdd.sock"], [bfdd control socket])
43e587c1 2264AC_DEFINE_UNQUOTED([DAEMON_VTY_DIR], ["$frr_statedir%s%s"], [daemon vty directory])
99e9f424 2265AC_DEFINE_UNQUOTED([DAEMON_DB_DIR], ["$frr_statedir"], [daemon database directory])
7ea487bc 2266
95c4aff2
DL
2267dnl autoconf does this, but it does it too late...
2268test "x$prefix" = xNONE && prefix=$ac_default_prefix
2269test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
2270
2271dnl get the full path, recursing through variables...
2272vtysh_bin="$bindir/vtysh"
2273for I in 1 2 3 4 5 6 7 8 9 10; do
2274 eval vtysh_bin="\"$vtysh_bin\""
2275done
99e9f424
RK
2276AC_DEFINE_UNQUOTED([VTYSH_BIN_PATH], ["$vtysh_bin"], [path to vtysh binary])
2277AC_SUBST([vtysh_bin])
95c4aff2 2278
a07169b1
DL
2279CFG_SYSCONF="$sysconfdir"
2280CFG_SBIN="$sbindir"
2281CFG_STATE="$frr_statedir"
30771d65 2282CFG_MODULE="$moduledir"
1c2facd1 2283CFG_YANGMODELS="$yangmodelsdir"
a07169b1
DL
2284for I in 1 2 3 4 5 6 7 8 9 10; do
2285 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
2286 eval CFG_SBIN="\"$CFG_SBIN\""
2287 eval CFG_STATE="\"$CFG_STATE\""
30771d65 2288 eval CFG_MODULE="\"$CFG_MODULE\""
1c2facd1 2289 eval CFG_YANGMODELS="\"$CFG_YANGMODELS\""
a07169b1 2290done
99e9f424
RK
2291AC_SUBST([CFG_SYSCONF])
2292AC_SUBST([CFG_SBIN])
2293AC_SUBST([CFG_STATE])
2294AC_SUBST([CFG_MODULE])
2295AC_SUBST([CFG_YANGMODELS])
99e9f424
RK
2296AC_DEFINE_UNQUOTED([MODULE_PATH], ["$CFG_MODULE"], [path to modules])
2297AC_DEFINE_UNQUOTED([YANG_MODELS_PATH], ["$CFG_YANGMODELS"], [path to YANG data models])
3ec95567 2298AC_DEFINE_UNQUOTED([WATCHFRR_SH_PATH], ["${CFG_SBIN%/}/watchfrr.sh"], [path to watchfrr.sh])
a07169b1 2299
a71c5039
DL
2300dnl various features
2301AM_CONDITIONAL([SUPPORT_REALMS], [test "${enable_realms}" = "yes"])
2302AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
83c64a7d 2303AM_CONDITIONAL([BGP_BMP], [$bgpd_bmp])
a71c5039
DL
2304dnl northbound
2305AM_CONDITIONAL([SQLITE3], [$SQLITE3])
2306AM_CONDITIONAL([CONFD], [test "x$enable_confd" != "x"])
2307AM_CONDITIONAL([SYSREPO], [test "x$enable_sysrepo" = "xyes"])
2308AM_CONDITIONAL([GRPC], [test "x$enable_grpc" = "xyes"])
2309AM_CONDITIONAL([ZEROMQ], [test "x$ZEROMQ" = "xtrue"])
2310dnl plugins
99e9f424 2311AM_CONDITIONAL([RPKI], [test "x$RPKI" = "xtrue"])
a71c5039
DL
2312AM_CONDITIONAL([SNMP], [test "x$SNMP_METHOD" = "xagentx"])
2313AM_CONDITIONAL([IRDP], [$IRDP])
2314AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
2315AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$enable_protobuf" = "xyes"])
fd193241 2316AM_CONDITIONAL([HAVE_PROTOBUF3], [$PROTO3])
a71c5039
DL
2317dnl daemons
2318AM_CONDITIONAL([VTYSH], [test "x$VTYSH" = "xvtysh"])
2319AM_CONDITIONAL([ZEBRA], [test "${enable_zebra}" != "no"])
2320AM_CONDITIONAL([BGPD], [test "x${enable_bgpd}" != "no"])
2321AM_CONDITIONAL([RIPD], [test "${enable_ripd}" != "no"])
2322AM_CONDITIONAL([OSPFD], [test "${enable_ospfd}" != "no"])
2323AM_CONDITIONAL([LDPD], [test "${enable_ldpd}" != "no"])
2324AM_CONDITIONAL([BFDD], [test "x$BFDD" = "xbfdd"])
2325AM_CONDITIONAL([NHRPD], [test "x$NHRPD" = "xnhrpd"])
2326AM_CONDITIONAL([EIGRPD], [test "${enable_eigrpd}" != "no"])
2327AM_CONDITIONAL([WATCHFRR], [test "x$WATCHFRR" = "xwatchfrr"])
2328AM_CONDITIONAL([OSPFCLIENT], [test "x$OSPFCLIENT" = "xospfclient"])
2329AM_CONDITIONAL([RIPNGD], [test "${enable_ripngd}" != "no"])
2330AM_CONDITIONAL([BABELD], [test "${enable_babeld}" != "no"])
2331AM_CONDITIONAL([OSPF6D], [test "${enable_ospf6d}" != "no"])
2332AM_CONDITIONAL([ISISD], [test "${enable_isisd}" != "no"])
2333AM_CONDITIONAL([PIMD], [test "${enable_pimd}" != "no"])
2334AM_CONDITIONAL([PBRD], [test "${enable_pbrd}" != "no"])
2335AM_CONDITIONAL([SHARPD], [test "${enable_sharpd}" = "yes"])
2336AM_CONDITIONAL([STATICD], [test "${enable_staticd}" != "no"])
2337AM_CONDITIONAL([FABRICD], [test "${enable_fabricd}" != "no"])
2338AM_CONDITIONAL([VRRPD], [test "${enable_vrrpd}" != "no"])
7ea487bc 2339
892d21b1
DL
2340AC_CONFIG_FILES([Makefile],[sed -e 's/^#AUTODERP# //' -i Makefile])
2341
2342AC_CONFIG_FILES([
06871ed9 2343 config.version
74afa5e6 2344 changelog-auto
22ea387f 2345 redhat/frr.spec
e3863245 2346 solaris/Makefile
c737c7ba 2347 alpine/APKBUILD
3ab11ecc 2348 snapcraft/snapcraft.yaml
b7a97f82 2349 lib/version.h
8efe88ea 2350 tests/lib/cli/test_cli.refout
cbd04084 2351 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
7f57883e
DS
2352 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
2353 pkgsrc/eigrpd.sh])
65efcfce 2354
99e9f424
RK
2355AC_CONFIG_FILES([vtysh/extract.pl], [chmod +x vtysh/extract.pl])
2356AC_CONFIG_FILES([tools/frr], [chmod +x tools/frr])
ea4d91bf
DL
2357AC_CONFIG_FILES([tools/watchfrr.sh], [chmod +x tools/watchfrr.sh])
2358AC_CONFIG_FILES([tools/frrinit.sh], [chmod +x tools/frrinit.sh])
2359AC_CONFIG_FILES([tools/frrcommon.sh])
65efcfce 2360
306ed681
DL
2361AC_CONFIG_COMMANDS([lib/route_types.h], [
2362 dst="${ac_abs_top_builddir}/lib/route_types.h"
2363 ${PERL} "${ac_abs_top_srcdir}/lib/route_types.pl" \
2364 < "${ac_abs_top_srcdir}/lib/route_types.txt" \
2365 > "${dst}.tmp"
2366 test -f "${dst}" \
2367 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2368 && rm "${dst}.tmp" \
2369 || mv "${dst}.tmp" "${dst}"
2370], [
2371 PERL="$PERL"
2372])
2373
2374AS_IF([test "x$with_pkg_git_version" = "xyes"], [
2375 AC_CONFIG_COMMANDS([lib/gitversion.h], [
2376 dst="${ac_abs_top_builddir}/lib/gitversion.h"
2377 ${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
2378 "${ac_abs_top_srcdir}" \
2379 > "${dst}.tmp"
2380 test -f "${dst}" \
2381 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2382 && rm "${dst}.tmp" \
2383 || mv "${dst}.tmp" "${dst}"
2384 ], [
2385 PERL="$PERL"
2386 ])
2387])
2388
1689cf7e 2389## Hack, but working solution to avoid rebuilding of frr.info.
48577196 2390## It's already in CVS until texinfo 4.7 is more common.
14c17fd8 2391AC_OUTPUT
7ea487bc 2392
2393echo "
447a8fe9 2394FRRouting configuration
b2f36157
DL
2395------------------------------
2396FRR version : ${PACKAGE_VERSION}
1080c13f 2397host operating system : ${host_os}
7ea487bc 2398source code location : ${srcdir}
2399compiler : ${CC}
dbac691d 2400compiler flags : ${CFLAGS} ${SAN_FLAGS}
6f0e3f6e 2401make : ${MAKE-make}
dbac691d 2402linker flags : ${LDFLAGS} ${SAN_FLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
b2f36157 2403state file directory : ${frr_statedir}
dc7a2bf1 2404config file directory : `eval echo \`echo ${sysconfdir}\``
d6b72f7a 2405example directory : `eval echo \`echo ${exampledir}\``
30771d65 2406module directory : ${CFG_MODULE}
b2f36157
DL
2407user to run as : ${enable_user}
2408group to run as : ${enable_group}
2409group for vty sockets : ${enable_vty_group}
aa593d5e 2410config file mask : ${enable_configfile_mask}
2411log file mask : ${enable_logfile_mask}
2b2f275e 2412zebra protobuf enabled : ${enable_protobuf:-no}
dc7a2bf1 2413
2414The above user and group must have read/write access to the state file
105b8239 2415directory and to the config files in the config file directory."
410a2492 2416
45da32d7
DL
2417if test "${enable_doc}" != "no" -a "$frr_py_mod_sphinx" = false; then
2418 AC_MSG_WARN([sphinx is missing but required to build documentation])
2419fi
2420if test "$frr_py_mod_pytest" = false; then
2421 AC_MSG_WARN([pytest is missing, unit tests cannot be performed])
410a2492 2422fi