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