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