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