]> git.proxmox.com Git - mirror_frr.git/blob - configure.ac
config: If we don't have crypt but we have ssl crypto, use it
[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")
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 *)
873 AC_MSG_RESULT([BSD])
874
875 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
876 AC_DEFINE(KAME,1,KAME IPv6)
877 ;;
878 esac
879
880 AC_SYS_LARGEFILE
881
882 dnl ---------------------
883 dnl Integrated VTY option
884 dnl ---------------------
885 case "${enable_vtysh}" in
886 "no") VTYSH="";;
887 *) VTYSH="vtysh";
888 AC_DEFINE(VTYSH,,VTY shell)
889 dnl Vtysh uses libreadline, which looks for termcap functions at
890 dnl configure time. We follow readlines search order.
891 dnl The required procedures are in libtermcap on NetBSD, in
892 dnl [TODO] on Linux, and in [TODO] on Solaris.
893 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
894 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
895 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
896 [AC_CHECK_LIB(ncurses, tputs,
897 LIBREADLINE="$LIBREADLINE -lncurses")]
898 )]
899 )]
900 )
901 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
902 "$LIBREADLINE")
903 if test $ac_cv_lib_readline_main = no; then
904 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
905 fi
906 AC_CHECK_HEADER(readline/history.h)
907 if test $ac_cv_header_readline_history_h = no;then
908 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
909 fi
910 AC_CHECK_LIB(readline, rl_completion_matches,
911 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
912 if test $ac_cv_lib_readline_rl_completion_matches = no; then
913 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
914 fi
915 ;;
916 esac
917 AC_SUBST(LIBREADLINE)
918 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
919
920 dnl ----------
921 dnl PAM module
922 dnl
923 dnl FRR detects the PAM library it is built against by checking for a
924 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
925 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
926 dnl openpam.h doesn't do that, although depends on the header too. Hence a
927 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
928 dnl of OpenPAM.
929 dnl ----------
930 if test "$with_libpam" = "yes"; then
931 AC_CHECK_HEADER([security/pam_misc.h],
932 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
933 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
934 pam_conv_func="misc_conv"
935 ],
936 [], FRR_INCLUDES)
937 AC_CHECK_HEADER([security/openpam.h],
938 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
939 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
940 pam_conv_func="openpam_ttyconv"
941 ],
942 [], FRR_INCLUDES[#include <security/pam_appl.h>])
943 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
944 AC_MSG_WARN([*** pam support will not be built ***])
945 with_libpam="no"
946 fi
947 fi
948
949 if test "$with_libpam" = "yes"; then
950 dnl took this test from proftpds configure.in and suited to our needs
951 dnl -------------------------------------------------------------------------
952 dnl
953 dnl This next check looks funky due to a linker problem with some versions
954 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
955 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
956 dnl with RedHat 6.2 and Debian 2.2 or better.
957 AC_CHECK_LIB(pam, pam_start,
958 [AC_CHECK_LIB(pam, $pam_conv_func,
959 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
960 LIBPAM="-lpam"],
961 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
962 LIBPAM="-lpam -lpam_misc"]
963 )
964 ],
965
966 [AC_CHECK_LIB(pam, pam_end,
967 [AC_CHECK_LIB(pam, $pam_conv_func,
968 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
969 LIBPAM="-lpam -ldl"],
970 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
971 LIBPAM="-lpam -ldl -lpam_misc"]
972 )
973 ],AC_MSG_WARN([*** pam support will not be built ***]),
974 [-ldl])
975 ]
976 )
977 fi
978 AC_SUBST(LIBPAM)
979
980 dnl -------------------------------
981 dnl Endian-ness check
982 dnl -------------------------------
983 AC_WORDS_BIGENDIAN
984
985 dnl -------------------------------
986 dnl check the size in byte of the C
987 dnl -------------------------------
988 dnl AC_CHECK_SIZEOF(char)
989 dnl AC_CHECK_SIZEOF(int)
990 dnl AC_CHECK_SIZEOF(short)
991 dnl AC_CHECK_SIZEOF(long)
992
993 dnl ----------------------------
994 dnl check existance of functions
995 dnl ----------------------------
996 AC_FUNC_FNMATCH
997 AC_FUNC_FORK
998 AC_FUNC_MKTIME
999 AC_FUNC_STAT
1000
1001 dnl -------------------------------
1002 dnl bgpd needs pow() and hence libm
1003 dnl -------------------------------
1004 TMPLIBS="$LIBS"
1005 AC_CHECK_HEADER([math.h],
1006 [AC_CHECK_LIB([m], [pow],
1007 [LIBM="-lm"
1008 LIBS="$LIBS $LIBM"
1009 AC_CHECK_FUNCS(pow,[],[LIBM=""])
1010 ])
1011 ])
1012 if test x"$LIBM" = x ; then
1013 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1014 fi
1015 LIBS="$TMPLIBS"
1016 AC_SUBST(LIBM)
1017
1018 dnl ---------------
1019 dnl other functions
1020 dnl ---------------
1021 AC_CHECK_FUNCS([ \
1022 strlcat strlcpy \
1023 getgrouplist])
1024
1025 AC_CHECK_HEADER([asm-generic/unistd.h],
1026 [AC_CHECK_DECL(__NR_setns,
1027 AC_DEFINE(HAVE_NETNS,, Have netns),,
1028 FRR_INCLUDES [#include <asm-generic/unistd.h>
1029 ])
1030 AC_CHECK_FUNCS(setns)]
1031 )
1032
1033 dnl --------------------------
1034 dnl Determine IS-IS I/O method
1035 dnl --------------------------
1036 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
1037 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
1038 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
1039 AC_CHECK_HEADER(net/bpf.h)
1040 AC_CHECK_HEADER(sys/dlpi.h)
1041 AC_MSG_CHECKING(zebra IS-IS I/O method)
1042
1043 case "$host_os" in
1044 linux*)
1045 AC_MSG_RESULT(pfpacket)
1046 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1047 ;;
1048 solaris* | sunos*)
1049 AC_MSG_RESULT(DLPI)
1050 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1051 ;;
1052 *)
1053 if test $ac_cv_header_net_bpf_h = no; then
1054 if test $ac_cv_header_sys_dlpi_h = no; then
1055 AC_MSG_RESULT(none)
1056 AC_MSG_WARN([*** IS-IS support will not be built ***])
1057 ISISD=""
1058 else
1059 AC_MSG_RESULT(DLPI)
1060 fi
1061 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1062 else
1063 AC_MSG_RESULT(BPF)
1064 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
1065 fi
1066 ;;
1067 esac
1068 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
1069
1070 dnl ------------------------------------
1071 dnl check for broken CMSG_FIRSTHDR macro
1072 dnl ------------------------------------
1073 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
1074 AC_RUN_IFELSE([AC_LANG_SOURCE([[
1075 #ifdef SUNOS_5
1076 #define _XPG4_2
1077 #define __EXTENSIONS__
1078 #endif
1079 #include <stdlib.h>
1080 #include <sys/types.h>
1081 #include <sys/socket.h>
1082
1083 main()
1084 {
1085 struct msghdr msg;
1086 char buf[4];
1087
1088 msg.msg_control = buf;
1089 msg.msg_controllen = 0;
1090
1091 if (CMSG_FIRSTHDR(&msg) != NULL)
1092 exit(0);
1093 exit (1);
1094 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
1095 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
1096
1097 dnl ---------------------------------------------------------------
1098 dnl figure out how to specify an interface in multicast sockets API
1099 dnl ---------------------------------------------------------------
1100 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1101
1102 AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1103 #include <sys/socket.h>
1104 #include <netinet/in.h>
1105 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1106 #include <linux/types.h>
1107 ])
1108
1109 m4_define([FRR_INCLUDES],
1110 FRR_INCLUDES
1111 [#if HAVE_LINUX_MROUTE_H
1112 # include <linux/mroute.h>
1113 #endif
1114 ])dnl
1115
1116 AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1117 #include <sys/socket.h>
1118 #include <sys/types.h>
1119 #include <netinet/in.h>
1120 #include <net/route.h>
1121 ])
1122
1123 m4_define([FRR_INCLUDES],
1124 FRR_INCLUDES
1125 [#if HAVE_NETINET_IP_MROUTE_H
1126 # include <netinet/ip_mroute.h>
1127 #endif
1128 ])dnl
1129
1130 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1131 AC_TRY_COMPILE([#include <sys/param.h>],
1132 [#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)
1133 return (0);
1134 #else
1135 #error No support for BSD struct ip_mreq hack detected
1136 #endif],[AC_MSG_RESULT(yes)
1137 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1138 AC_MSG_RESULT(no))
1139
1140 AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1141 AC_TRY_COMPILE([
1142 #include <sys/types.h>
1143 #include <netinet/in.h>
1144 ], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1145 ], [AC_MSG_RESULT(yes)
1146 AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1147 AC_MSG_RESULT(no))
1148
1149 dnl ---------------------------------------------------------------
1150 dnl figure out how to check link-state
1151 dnl ---------------------------------------------------------------
1152 AC_CHECK_HEADER( [net/if_media.h],
1153 [m4_define([LINK_DETECT_INCLUDES],
1154 FRR_INCLUDES
1155 [#include <net/if_media.h>
1156 ])
1157 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1158 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1159 [], LINK_DETECT_INCLUDES)],
1160 [],
1161 FRR_INCLUDES)
1162
1163 dnl ---------------------------------------------------------------
1164 dnl Additional, newer way to check link-state using ifi_link_state.
1165 dnl Not available in all BSD's when ifmediareq available
1166 dnl ---------------------------------------------------------------
1167 AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1168 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
1169 [], FRR_INCLUDES)
1170
1171 dnl ------------------------
1172 dnl TCP_MD5SIG socket option
1173 dnl ------------------------
1174
1175 AC_CHECK_HEADER([netinet/tcp.h],
1176 [m4_define([MD5_INCLUDES],
1177 FRR_INCLUDES
1178 [#include <netinet/tcp.h>
1179 ])
1180 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1181 [],
1182 FRR_INCLUDES)
1183 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1184 AC_CHECK_HEADER([linux/tcp.h],
1185 [m4_define([MD5_INCLUDES],
1186 FRR_INCLUDES
1187 [#include <linux/tcp.h>
1188 ])
1189 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1190 fi
1191
1192 dnl ----------------------------------------------------------------------------
1193 dnl figure out if domainname is available in the utsname struct (GNU extension).
1194 dnl ----------------------------------------------------------------------------
1195 AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1196
1197 dnl ------------------
1198 dnl IPv6 header checks
1199 dnl ------------------
1200 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1201 netinet6/in6_var.h netinet6/nd6.h], [], [],
1202 FRR_INCLUDES)
1203
1204 m4_define([FRR_INCLUDES],dnl
1205 FRR_INCLUDES
1206 [#if HAVE_NETINET6_IN6_H
1207 #include <netinet6/in6.h>
1208 #endif
1209 #if HAVE_NETINET_IN6_VAR_H
1210 #include <netinet/in6_var.h>
1211 #endif
1212 #include <netinet/icmp6.h>
1213 #if HAVE_NETINET6_IN6_VAR_H
1214 # include <netinet6/in6_var.h>
1215 #endif
1216 #if HAVE_NETINET6_ND6_H
1217 # include <netinet6/nd6.h>
1218 #endif
1219 ])dnl
1220
1221 dnl disable doc check
1222 if test "${enable_doc}" = "no";then
1223 DOC=""
1224 else
1225 DOC="doc"
1226 fi
1227
1228 dnl --------------------
1229 dnl Daemon disable check
1230 dnl --------------------
1231 AM_CONDITIONAL(ZEBRA, test "${enable_zebra}" != "no")
1232
1233 if test "${enable_bgpd}" = "no";then
1234 BGPD=""
1235 else
1236 BGPD="bgpd"
1237 fi
1238 AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
1239
1240 if test "${enable_ripd}" = "no";then
1241 RIPD=""
1242 else
1243 RIPD="ripd"
1244 fi
1245 AM_CONDITIONAL(RIPD, test "x$RIPD" = "xripd")
1246
1247 if test "${enable_ospfd}" = "no";then
1248 OSPFD=""
1249 else
1250 OSPFD="ospfd"
1251 fi
1252 AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd")
1253
1254 if test "${enable_ldpd}" = "no";then
1255 LDPD=""
1256 else
1257 LDPD="ldpd"
1258 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1259 fi
1260 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1261
1262 NHRPD=""
1263 case "$host_os" in
1264 linux*)
1265 if test "${enable_nhrpd}" != "no"; then
1266 NHRPD="nhrpd"
1267 fi
1268 ;;
1269 *)
1270 if test "${enable_nhrpd}" = "yes"; then
1271 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1272 fi
1273 ;;
1274 esac
1275 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1276
1277 if test "${enable_eigrpd}" = "no";then
1278 EIGRPD=""
1279 else
1280 EIGRPD="eigrpd"
1281 fi
1282 AM_CONDITIONAL(EIGRPD, test "x$EIGRPD" = "xeigrpd")
1283
1284 if test "${enable_watchfrr}" = "no";then
1285 WATCHFRR=""
1286 else
1287 WATCHFRR="watchfrr"
1288 fi
1289 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1290
1291 OSPFCLIENT=""
1292 if test "${enable_ospfapi}" != "no";then
1293 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1294
1295 if test "${enable_ospfclient}" != "no";then
1296 OSPFCLIENT="ospfclient"
1297 fi
1298 fi
1299
1300 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1301
1302 case "${enable_ripngd}" in
1303 "no" ) RIPNGD="";;
1304 * ) RIPNGD="ripngd";;
1305 esac
1306 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1307
1308 case "${enable_babeld}" in
1309 "no" ) BABELD="";;
1310 * ) BABELD="babeld";;
1311 esac
1312 AM_CONDITIONAL(BABELD, test "x$BABELD" = "xbabeld")
1313
1314 case "${enable_ospf6d}" in
1315 "no" ) OSPF6D="";;
1316 * ) OSPF6D="ospf6d";;
1317 esac
1318 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1319
1320 case "${enable_isisd}" in
1321 "no" ) ISISD="";;
1322 * ) ISISD="isisd";;
1323 esac
1324 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1325
1326 case "${enable_pimd}" in
1327 "no" ) PIMD="";;
1328 * ) PIMD="pimd";;
1329 esac
1330 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1331
1332 if test "${enable_bgp_announce}" = "no";then
1333 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1334 else
1335 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1336 fi
1337
1338 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1339 with_rfp_path="bgpd/rfp-example"
1340 fi
1341 if test "${with_rfp_path}" != "no"; then
1342 VNC_RFP_PATH="${with_rfp_path}"
1343 AC_SUBST(VNC_RFP_PATH)
1344 fi
1345
1346 if test "${enable_bgp_vnc}" != "no";then
1347 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1348 RFPTEST="${with_rfp_path}/rfptest"
1349 LIBRFP="${with_rfp_path}/librfp"
1350 RFPINC="${with_rfp_path}/librfp"
1351 else
1352 RFPTEST=
1353 LIBRFP=
1354 RFPINC="bgpd/rfp-example/librfp"
1355 fi
1356 # set
1357 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1358
1359 AC_SUBST(DOC)
1360 AC_SUBST(RFPTEST)
1361 AC_SUBST(LIBRFP)
1362 AC_SUBST(RFPINC)
1363 AC_SUBST(BABELD)
1364 AC_SUBST(BGPD)
1365 AC_SUBST(RIPD)
1366 AC_SUBST(RIPNGD)
1367 AC_SUBST(OSPFD)
1368 AC_SUBST(OSPF6D)
1369 AC_SUBST(LDPD)
1370 AC_SUBST(NHRPD)
1371 AC_SUBST(EIGRPD)
1372 AC_SUBST(WATCHFRR)
1373 AC_SUBST(ISISD)
1374 AC_SUBST(PIMD)
1375 AC_SUBST(SOLARIS)
1376 AC_SUBST(VTYSH)
1377 AC_SUBST(CURSES)
1378 AC_SUBST(OSPFCLIENT)
1379 AC_SUBST(OSPFAPI)
1380 AC_CHECK_LIB(crypt, crypt, [],
1381 [AC_CHECK_LIB(crypto, DES_crypt)])
1382 AC_CHECK_LIB(resolv, res_init)
1383
1384 dnl ---------------------------
1385 dnl check system has PCRE regexp
1386 dnl ---------------------------
1387 if test "x$enable_pcreposix" = "xyes"; then
1388 AC_CHECK_LIB(pcreposix, regexec, [], [
1389 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1390 ])
1391 fi
1392 AC_SUBST(HAVE_LIBPCREPOSIX)
1393
1394 dnl ------------------
1395 dnl check C-Ares library
1396 dnl ------------------
1397 if test "${NHRPD}" != ""; then
1398 PKG_CHECK_MODULES([CARES], [libcares], , [
1399 AC_MSG_ERROR([trying to build nhrpd, but libcares not found. install c-ares and its -dev headers.])
1400 ])
1401 fi
1402
1403
1404 dnl ------------------
1405 dnl check Net-SNMP library
1406 dnl ------------------
1407 if test "${enable_snmp}" != ""; then
1408 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1409 if test x"$NETSNMP_CONFIG" = x"no"; then
1410 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1411 fi
1412 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1413 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1414 AC_MSG_CHECKING([whether we can link to Net-SNMP])
1415 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
1416 int main(void);
1417 ],
1418 [
1419 {
1420 return 0;
1421 }
1422 ])], [
1423 AC_MSG_ERROR([--enable-snmp given but not usable])])
1424 case "${enable_snmp}" in
1425 yes)
1426 SNMP_METHOD=agentx
1427 ;;
1428 smux|agentx)
1429 SNMP_METHOD="${enable_snmp}"
1430 ;;
1431 *)
1432 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use smux or agentx])
1433 ;;
1434 esac
1435 AH_TEMPLATE([SNMP_SMUX], [Use SNMP SMUX to interface with snmpd])
1436 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1437 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
1438 fi
1439 AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1440 AC_SUBST(SNMP_LIBS)
1441 AC_SUBST(SNMP_CFLAGS)
1442
1443 dnl ---------------
1444 dnl math
1445 dnl ---------------
1446 AC_SEARCH_LIBS([sqrt], [m])
1447
1448 dnl ---------------
1449 dnl dlopen & dlinfo
1450 dnl ---------------
1451 AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1452 AC_MSG_ERROR([unable to find the dlopen()])
1453 ])
1454
1455 AC_CHECK_HEADERS([link.h])
1456
1457 AC_MSG_CHECKING([for dlinfo(RTLD_DI_ORIGIN)])
1458 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1459 #include <stdlib.h>
1460 #ifdef HAVE_LINK_H
1461 #include <link.h>
1462 #endif
1463 #include <dlfcn.h>
1464 ]], [[
1465 char origin[1];
1466 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1467 ]])], [
1468 AC_MSG_RESULT(yes)
1469 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1470 ], [
1471 AC_MSG_RESULT(no)
1472 ])
1473
1474 AC_MSG_CHECKING([for dlinfo(RTLD_DI_LINKMAP)])
1475 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1476 #include <stdlib.h>
1477 #ifdef HAVE_LINK_H
1478 #include <link.h>
1479 #endif
1480 #include <dlfcn.h>
1481 ]], [[
1482 struct link_map *lm = NULL;
1483 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1484 ]])], [
1485 AC_MSG_RESULT(yes)
1486 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1487 ], [
1488 AC_MSG_RESULT(no)
1489 ])
1490
1491
1492 AM_CONDITIONAL(SNMP, test "x$SNMP_METHOD" = "xagentx")
1493
1494 dnl ---------------------------
1495 dnl sockaddr and netinet checks
1496 dnl ---------------------------
1497 AC_CHECK_TYPES([
1498 struct sockaddr_dl,
1499 struct vifctl, struct mfcctl, struct sioc_sg_req,
1500 vifi_t, struct sioc_vif_req, struct igmpmsg,
1501 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1502 struct nd_opt_adv_interval, struct rt_addrinfo,
1503 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1504 [], [], FRR_INCLUDES)
1505
1506 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1507 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1508 struct sockaddr_dl.sdl_len,
1509 struct if6_aliasreq.ifra_lifetime,
1510 struct nd_opt_adv_interval.nd_opt_ai_type],
1511 [], [], FRR_INCLUDES)
1512
1513 dnl ---------------------------
1514 dnl IRDP/pktinfo/icmphdr checks
1515 dnl ---------------------------
1516 AC_CHECK_TYPES([struct in_pktinfo],
1517 [AC_CHECK_TYPES([struct icmphdr],
1518 [if test "${enable_irdp}" != "no"; then
1519 AC_DEFINE(HAVE_IRDP,, IRDP)
1520 fi],
1521 [if test "${enable_irdp}" = "yes"; then
1522 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1523 fi], [FRR_INCLUDES])],
1524 [if test "${enable_irdp}" = "yes"; then
1525 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1526 fi], [FRR_INCLUDES])
1527
1528 dnl -----------------------
1529 dnl checking for IP_PKTINFO
1530 dnl -----------------------
1531 AC_MSG_CHECKING(for IP_PKTINFO)
1532 AC_TRY_COMPILE([#include <netdb.h>], [
1533 int opt = IP_PKTINFO;
1534 ], [
1535 AC_MSG_RESULT(yes)
1536 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1537 ], [
1538 AC_MSG_RESULT(no)
1539 ])
1540
1541 dnl ---------------------------
1542 dnl checking for IP_RECVDSTADDR
1543 dnl ---------------------------
1544 AC_MSG_CHECKING(for IP_RECVDSTADDR)
1545 AC_TRY_COMPILE([#include <netinet/in.h>], [
1546 int opt = IP_RECVDSTADDR;
1547 ], [
1548 AC_MSG_RESULT(yes)
1549 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1550 ], [
1551 AC_MSG_RESULT(no)
1552 ])
1553
1554 dnl ----------------------
1555 dnl checking for IP_RECVIF
1556 dnl ----------------------
1557 AC_MSG_CHECKING(for IP_RECVIF)
1558 AC_TRY_COMPILE([#include <netinet/in.h>], [
1559 int opt = IP_RECVIF;
1560 ], [
1561 AC_MSG_RESULT(yes)
1562 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1563 ], [
1564 AC_MSG_RESULT(no)
1565 ])
1566
1567 dnl ----------------------
1568 dnl checking for SO_BINDANY
1569 dnl ----------------------
1570 AC_MSG_CHECKING(for SO_BINDANY)
1571 AC_TRY_COMPILE([#include <sys/socket.h>], [
1572 int opt = SO_BINDANY;
1573 ], [
1574 AC_MSG_RESULT(yes)
1575 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1576 ], [
1577 AC_MSG_RESULT(no)
1578 ])
1579
1580 dnl ----------------------
1581 dnl checking for IP_FREEBIND
1582 dnl ----------------------
1583 AC_MSG_CHECKING(for IP_FREEBIND)
1584 AC_TRY_COMPILE([#include <netinet/in.h>], [
1585 int opt = IP_FREEBIND;
1586 ], [
1587 AC_MSG_RESULT(yes)
1588 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1589 ], [
1590 AC_MSG_RESULT(no)
1591 ])
1592
1593 dnl --------------------------------------
1594 dnl checking for be32dec existence or not
1595 dnl --------------------------------------
1596 AC_CHECK_DECLS([be32enc, be32dec], [], [],
1597 [#include <sys/endian.h>])
1598
1599 dnl --------------------------------------
1600 dnl checking for clock_time monotonic struct and call
1601 dnl --------------------------------------
1602 AC_CHECK_DECL(CLOCK_MONOTONIC,
1603 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1604 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1605 ], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
1606
1607 dnl --------------------------------------
1608 dnl checking for flex and bison
1609 dnl --------------------------------------
1610
1611 AM_PROG_LEX
1612 AC_MSG_CHECKING(version of flex)
1613 frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1614 frr_ac_flex_version="${frr_ac_flex_version##* }"
1615 AC_MSG_RESULT([$frr_ac_flex_version])
1616 AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
1617 LEX="$SHELL $missing_dir/missing flex"
1618 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1619 AC_MSG_WARN([using pregenerated flex output files])
1620 else
1621 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1622 fi
1623 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1624 AC_SUBST([LEXLIB], [''])
1625 ])
1626
1627 AC_PROG_YACC
1628 dnl thanks GNU bison for this b*llshit...
1629 AC_MSG_CHECKING(version of bison)
1630 frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1631 frr_ac_bison_version="${frr_ac_bison_version##* }"
1632 frr_ac_bison_missing="false"
1633 case "x${frr_ac_bison_version}" in
1634 x2.7*)
1635 BISON_OPENBRACE='"'
1636 BISON_CLOSEBRACE='"'
1637 BISON_VERBOSE=''
1638 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
1639 ;;
1640 x2.*|x1.*)
1641 AC_MSG_RESULT([$frr_ac_bison_version])
1642 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1643 frr_ac_bison_missing="true"
1644 ;;
1645 x)
1646 AC_MSG_RESULT([none])
1647 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1648 frr_ac_bison_missing="true"
1649 ;;
1650 *)
1651 BISON_OPENBRACE='{'
1652 BISON_CLOSEBRACE='}'
1653 BISON_VERBOSE='-Dparse.error=verbose'
1654 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 or newer])
1655 ;;
1656 esac
1657 AC_SUBST(BISON_OPENBRACE)
1658 AC_SUBST(BISON_CLOSEBRACE)
1659 AC_SUBST(BISON_VERBOSE)
1660
1661 if $frr_ac_bison_missing; then
1662 YACC="$SHELL $missing_dir/missing bison -y"
1663 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1664 AC_MSG_WARN([using pregenerated bison output files])
1665 else
1666 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1667 fi
1668 fi
1669
1670 dnl -------------------
1671 dnl capabilities checks
1672 dnl -------------------
1673 if test "${enable_capabilities}" != "no"; then
1674 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1675 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1676 [AC_MSG_RESULT(yes)
1677 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1678 frr_ac_keepcaps="yes"],
1679 AC_MSG_RESULT(no)
1680 )
1681 if test x"${frr_ac_keepcaps}" = x"yes"; then
1682 AC_CHECK_HEADERS(sys/capability.h)
1683 fi
1684 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1685 AC_CHECK_LIB(cap, cap_init,
1686 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1687 LIBCAP="-lcap"
1688 frr_ac_lcaps="yes"]
1689 )
1690 else
1691 AC_CHECK_HEADERS(priv.h,
1692 [AC_MSG_CHECKING(Solaris style privileges are available)
1693 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1694 [AC_MSG_RESULT(yes)
1695 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1696 frr_ac_scaps="yes"],
1697 AC_MSG_RESULT(no)
1698 )
1699 ]
1700 )
1701 fi
1702 if test x"${frr_ac_scaps}" = x"yes" \
1703 -o x"${frr_ac_lcaps}" = x"yes"; then
1704 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1705 fi
1706 fi
1707 AC_SUBST(LIBCAP)
1708
1709 dnl ---------------------------
1710 dnl check for glibc 'backtrace'
1711 dnl ---------------------------
1712 if test x"${enable_backtrace}" != x"no" ; then
1713 backtrace_ok=no
1714 AC_CHECK_HEADER([execinfo.h], [
1715 AC_SEARCH_LIBS([backtrace], [execinfo], [
1716 AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1717 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1718 backtrace_ok=yes
1719 ],, [-lm])
1720 ])
1721
1722 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1723 dnl user explicitly requested backtrace but we failed to find support
1724 AC_MSG_FAILURE([failed to find backtrace support])
1725 fi
1726 fi
1727
1728 dnl -----------------------------------------
1729 dnl check for malloc mallinfo struct and call
1730 dnl this must try and link using LIBS, in
1731 dnl order to check no alternative allocator
1732 dnl has been specified, which might not provide
1733 dnl mallinfo, e.g. such as Umem on Solaris.
1734 dnl -----------------------------------------
1735 AC_CHECK_HEADER([malloc.h],
1736 [AC_MSG_CHECKING(whether mallinfo is available)
1737 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1738 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1739 [AC_MSG_RESULT(yes)
1740 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1741 AC_MSG_RESULT(no)
1742 )
1743 ], [], FRR_INCLUDES)
1744
1745 dnl ----------
1746 dnl configure date
1747 dnl ----------
1748 CONFDATE=`date '+%Y%m%d'`
1749 AC_SUBST(CONFDATE)
1750
1751 dnl ------------------------------
1752 dnl set paths for state directory
1753 dnl ------------------------------
1754 AC_MSG_CHECKING(directory to use for state file)
1755 if test "${prefix}" = "NONE"; then
1756 frr_statedir_prefix="";
1757 else
1758 frr_statedir_prefix=${prefix}
1759 fi
1760 if test "${localstatedir}" = '${prefix}/var'; then
1761 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
1762 ${frr_statedir_prefix}/var/adm dnl
1763 ${frr_statedir_prefix}/etc dnl
1764 /var/run dnl
1765 /var/adm dnl
1766 /etc dnl
1767 /dev/null;
1768 do
1769 test -d $FRR_STATE_DIR && break
1770 done
1771 frr_statedir=$FRR_STATE_DIR
1772 else
1773 frr_statedir=${localstatedir}
1774 fi
1775 if test $frr_statedir = "/dev/null"; then
1776 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1777 fi
1778 AC_MSG_RESULT(${frr_statedir})
1779 AC_SUBST(frr_statedir)
1780
1781 AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
1782 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
1783 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1784
1785 dnl autoconf does this, but it does it too late...
1786 test "x$prefix" = xNONE && prefix=$ac_default_prefix
1787 test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
1788
1789 dnl get the full path, recursing through variables...
1790 vtysh_bin="$bindir/vtysh"
1791 for I in 1 2 3 4 5 6 7 8 9 10; do
1792 eval vtysh_bin="\"$vtysh_bin\""
1793 done
1794 AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
1795
1796 CFG_SYSCONF="$sysconfdir"
1797 CFG_SBIN="$sbindir"
1798 CFG_STATE="$frr_statedir"
1799 CFG_MODULE="$moduledir"
1800 for I in 1 2 3 4 5 6 7 8 9 10; do
1801 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
1802 eval CFG_SBIN="\"$CFG_SBIN\""
1803 eval CFG_STATE="\"$CFG_STATE\""
1804 eval CFG_MODULE="\"$CFG_MODULE\""
1805 done
1806 AC_SUBST(CFG_SYSCONF)
1807 AC_SUBST(CFG_SBIN)
1808 AC_SUBST(CFG_STATE)
1809 AC_SUBST(CFG_MODULE)
1810 AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1811
1812 dnl ---------------------------
1813 dnl Check htonl works correctly
1814 dnl ---------------------------
1815 AC_MSG_CHECKING(for working htonl)
1816 AC_CACHE_VAL(ac_cv_htonl_works,
1817 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
1818 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1819 ]
1820 )
1821 AC_MSG_RESULT($ac_cv_htonl_works)
1822
1823 AC_CONFIG_FILES([Makefile ripd/Makefile
1824 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchfrr/Makefile
1825 ospf6d/Makefile ldpd/Makefile isisd/Makefile vtysh/Makefile
1826 doc/Makefile ospfclient/Makefile tests/Makefile
1827 bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile
1828 babeld/Makefile
1829 pimd/Makefile
1830 eigrpd/Makefile
1831 nhrpd/Makefile
1832 tools/Makefile
1833 redhat/frr.spec
1834 snapcraft/snapcraft.yaml
1835 lib/version.h
1836 tests/lib/cli/test_cli.refout
1837 doc/defines.texi
1838 doc/bgpd.8
1839 doc/isisd.8
1840 doc/ospf6d.8
1841 doc/ospfclient.8
1842 doc/ospfd.8
1843 doc/ldpd.8
1844 doc/ripd.8
1845 doc/eigrpd.8
1846 doc/ripngd.8
1847 doc/pimd.8
1848 doc/nhrpd.8
1849 doc/vtysh.1
1850 doc/watchfrr.8
1851 doc/zebra.8
1852 doc/frr.1
1853 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1854 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1855 pkgsrc/eigrpd.sh])
1856
1857
1858 AC_CONFIG_FILES([solaris/Makefile])
1859
1860 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1861
1862 ## Hack, but working solution to avoid rebuilding of frr.info.
1863 ## It's already in CVS until texinfo 4.7 is more common.
1864 AC_OUTPUT
1865
1866 echo "
1867 FRRouting configuration
1868 ------------------------------
1869 FRR version : ${PACKAGE_VERSION}
1870 host operating system : ${host_os}
1871 source code location : ${srcdir}
1872 compiler : ${CC}
1873 compiler flags : ${CFLAGS}
1874 make : ${MAKE-make}
1875 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1876 state file directory : ${frr_statedir}
1877 config file directory : `eval echo \`echo ${sysconfdir}\``
1878 example directory : `eval echo \`echo ${exampledir}\``
1879 module directory : ${CFG_MODULE}
1880 user to run as : ${enable_user}
1881 group to run as : ${enable_group}
1882 group for vty sockets : ${enable_vty_group}
1883 config file mask : ${enable_configfile_mask}
1884 log file mask : ${enable_logfile_mask}
1885 zebra protobuf enabled : ${have_protobuf:-no}
1886
1887 The above user and group must have read/write access to the state file
1888 directory and to the config files in the config file directory."