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