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