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