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