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