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