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