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