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