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