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