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