]> git.proxmox.com Git - mirror_frr.git/blob - configure.ac
Merge branch 'master' into bgpd-ipv4-plus-label-misc3
[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_WITH(vtysh_pager,
232 AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
233 VTYSH_PAGER=$withval, VTYSH_PAGER="more")
234 AC_ARG_ENABLE(vtysh,
235 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for Quagga]))
236 AC_ARG_ENABLE(doc,
237 AS_HELP_STRING([--disable-doc], [do not build docs]))
238 AC_ARG_ENABLE(zebra,
239 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
240 AC_ARG_ENABLE(bgpd,
241 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
242 AC_ARG_ENABLE(ripd,
243 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
244 AC_ARG_ENABLE(ripngd,
245 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
246 AC_ARG_ENABLE(ospfd,
247 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
248 AC_ARG_ENABLE(ospf6d,
249 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
250 AC_ARG_ENABLE(ldpd,
251 AS_HELP_STRING([--enable-ldpd], [build ldpd]))
252 AC_ARG_ENABLE(nhrpd,
253 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
254 AC_ARG_ENABLE(eigrpd,
255 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
256 AC_ARG_ENABLE(babeld,
257 AS_HELP_STRING([--disable-babeld], [do not build babeld]))
258 AC_ARG_ENABLE(watchfrr,
259 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
260 AC_ARG_ENABLE(isisd,
261 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
262 AC_ARG_ENABLE(pimd,
263 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
264 AC_ARG_ENABLE(bgp-announce,
265 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
266 AC_ARG_ENABLE(bgp-vnc,
267 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
268 AC_ARG_WITH(rfp-path,
269 AS_HELP_STRING([--with-rfp-path[=DIR]],[path to replaced stub RFP used with BGP VNC]))
270 AC_ARG_ENABLE(snmp,
271 AS_HELP_STRING([--enable-snmp=ARG], [enable SNMP support (smux or agentx)]))
272 AC_ARG_WITH(libpam,
273 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
274 AC_ARG_ENABLE(tcp-zebra,
275 AS_HELP_STRING([--enable-tcp-zebra], [enable TCP/IP socket connection between zebra and protocol daemon]))
276 AC_ARG_ENABLE(ospfapi,
277 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
278 AC_ARG_ENABLE(ospfclient,
279 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
280 (this is the default if --disable-ospfapi is set)]))
281 AC_ARG_ENABLE(multipath,
282 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
283 AC_ARG_ENABLE(user,
284 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
285 AC_ARG_ENABLE(group,
286 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
287 AC_ARG_ENABLE(vty_group,
288 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
289 AC_ARG_ENABLE(configfile_mask,
290 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
291 AC_ARG_ENABLE(logfile_mask,
292 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
293 AC_ARG_ENABLE(shell_access,
294 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
295 AC_ARG_ENABLE(rtadv,
296 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
297 AC_ARG_ENABLE(irdp,
298 AS_HELP_STRING([--enable-irdp], [enable IRDP server support in zebra]))
299 AC_ARG_ENABLE(capabilities,
300 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
301 AC_ARG_ENABLE(rusage,
302 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
303 AC_ARG_ENABLE(gcc_ultra_verbose,
304 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
305 AC_ARG_ENABLE(linux24_tcp_md5,
306 AS_HELP_STRING([--enable-linux24-tcp-md5], [enable support for old, Linux-2.4 RFC2385 patch]))
307 AC_ARG_ENABLE(backtrace,
308 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
309 AC_ARG_ENABLE(time-check,
310 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
311 AC_ARG_ENABLE(pcreposix,
312 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
313 AC_ARG_ENABLE(fpm,
314 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
315 AC_ARG_ENABLE(systemd,
316 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
317 AC_ARG_ENABLE(werror,
318 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
319 AC_ARG_ENABLE(cumulus,
320 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
321 AC_ARG_ENABLE(datacenter,
322 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
323 AC_ARG_ENABLE(rr-semantics,
324 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
325 AC_ARG_ENABLE([protobuf],
326 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
327 AC_ARG_ENABLE([oldvpn_commands],
328 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
329
330 AC_CHECK_HEADERS(json-c/json.h)
331 AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c")
332 if test $ac_cv_lib_json_c_json_object_get = no; then
333 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
334 if test $ac_cv_lib_json_json_object_get = no; then
335 AC_MSG_ERROR([lib json is needed to compile])
336 fi
337 fi
338
339 AC_ARG_ENABLE([dev_build],
340 AS_HELP_STRING([--enable-dev-build], [build for development]))
341
342 if test x"${enable_time_check}" != x"no" ; then
343 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
344 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
345 else
346 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
347 fi
348 fi
349
350 case "${enable_systemd}" in
351 "no") ;;
352 "yes")
353 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
354 if test $ac_cv_lib_systemd_sd_notify = no; then
355 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
356 else
357 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
358 fi
359 ;;
360 "*") ;;
361 esac
362
363 if test "${enable_rr_semantics}" != "no" ; then
364 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
365 fi
366
367 dnl ----------
368 dnl MPLS check
369 dnl ----------
370 AC_MSG_CHECKING(whether this OS has MPLS stack)
371 case "$host" in
372 *-linux*)
373 MPLS_METHOD="zebra_mpls_netlink.o"
374 AC_MSG_RESULT(Linux MPLS)
375 ;;
376 *-openbsd*)
377 MPLS_METHOD="zebra_mpls_openbsd.o"
378 AC_MSG_RESULT(OpenBSD MPLS)
379 ;;
380 *)
381 MPLS_METHOD="zebra_mpls_null.o"
382 AC_MSG_RESULT(Unsupported kernel)
383 ;;
384 esac
385 AC_SUBST(MPLS_METHOD)
386
387 if test "${enable_datacenter}" = "yes" ; then
388 AC_DEFINE(HAVE_DATACENTER,,Compile extensions for a DataCenter)
389 DFLT_NAME="datacenter"
390 else
391 DFLT_NAME="traditional"
392 fi
393
394 if test "${enable_cumulus}" = "yes" ; then
395 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
396 fi
397
398 AC_SUBST(DFLT_NAME)
399 AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
400
401 if test "${enable_shell_access}" = "yes"; then
402 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
403 fi
404
405 AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
406
407 if test "x${enable_dev_build}" = "xyes"; then
408 AC_DEFINE(DEV_BUILD,,Build for development)
409 fi
410 AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
411
412 #
413 # Logic for protobuf support.
414 #
415 if test "$enable_protobuf" = "yes"; then
416 have_protobuf=yes
417
418 # Check for protoc-c
419 AC_CHECK_PROG([PROTOC_C], [protoc-c], [protoc-c], [/bin/false])
420 if test "x$PROTOC_C" = "x/bin/false"; then
421 have_protobuf=no
422 else
423 found_protobuf_c=no
424 PKG_CHECK_MODULES([PROTOBUF_C], libprotobuf-c >= 0.14,
425 [found_protobuf_c=yes],
426 [AC_MSG_RESULT([pkg-config did not find libprotobuf-c])])
427
428 if test "x$found_protobuf_c" = "xyes"; then
429 LDFLAGS="$LDFLAGS $PROTOBUF_C_LIBS"
430 CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS"
431 else
432 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [],
433 [have_protobuf=no; AC_MSG_RESULT([Couldn't find google/protobuf-c.h])])
434 fi
435 fi
436 fi
437
438 #
439 # Logic for old vpn commans support.
440 #
441 if test "$enable_oldvpn_commands" = "yes"; then
442 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
443 fi
444
445 # Fail if the user explicity enabled protobuf support and we couldn't
446 # find the compiler or libraries.
447 if test "x$have_protobuf" = "xno" && test "x$enable_protobuf" = "xyes"; then
448 AC_MSG_ERROR([Protobuf enabled explicitly but can't find libraries/tools])
449 fi
450
451 if test "x$have_protobuf" = "xyes"; then
452 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
453 fi
454
455 AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$have_protobuf" = "xyes"])
456
457 #
458 # End of logic for protobuf support.
459 #
460
461 if test "${enable_tcp_zebra}" = "yes"; then
462 AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
463 fi
464
465 if test "${enable_linux24_tcp_md5}" = "yes"; then
466 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
467 fi
468
469 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
470 if test "${enable_rtadv}" != "no"; then
471 AC_MSG_RESULT(yes)
472 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
473 else
474 AC_MSG_RESULT(no)
475 fi
476
477 if test "${enable_irdp}" = "yes"; then
478 AC_DEFINE(HAVE_IRDP,, IRDP )
479 fi
480
481 if test x"${enable_user}" = x"no"; then
482 enable_user=""
483 else
484 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
485 enable_user="frr"
486 fi
487 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
488 fi
489
490 if test x"${enable_group}" = x"no"; then
491 enable_group=""
492 else
493 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
494 enable_group="frr"
495 fi
496 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
497 fi
498
499 if test x"${enable_vty_group}" = x"yes" ; then
500 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
501 elif test x"${enable_vty_group}" != x""; then
502 if test x"${enable_vty_group}" != x"no"; then
503 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
504 fi
505 fi
506 AC_SUBST([enable_user])
507 AC_SUBST([enable_group])
508 AC_SUBST([enable_vty_group])
509
510 enable_configfile_mask=${enable_configfile_mask:-0600}
511 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
512
513 enable_logfile_mask=${enable_logfile_mask:-0600}
514 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
515
516 MPATH_NUM=1
517
518 case "${enable_multipath}" in
519 0)
520 MPATH_NUM=64
521 ;;
522 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
523 MPATH_NUM="${enable_multipath}"
524 ;;
525 "")
526 ;;
527 *)
528 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
529 ;;
530 esac
531
532 AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
533
534 AC_DEFINE_UNQUOTED(VTYSH_PAGER, "$VTYSH_PAGER", [What pager to use])
535
536 dnl -----------------------------------
537 dnl Add extra version string to package
538 dnl name, string and version fields.
539 dnl -----------------------------------
540 if test "x${EXTRAVERSION}" != "x" ; then
541 VERSION="${VERSION}${EXTRAVERSION}"
542 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
543 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
544 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
545 fi
546
547 if test "x$with_pkg_git_version" = "xyes"; then
548 if test -d "${srcdir}/.git"; then
549 AC_DEFINE(GIT_VERSION, [1], [include git version info])
550 else with_pkg_git_version="no"
551 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
552 fi
553 fi
554 AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
555
556 dnl ------------------------------------
557 dnl Check C keywords and standard types
558 dnl ------------------------------------
559 AC_C_CONST
560 AC_C_INLINE
561 AC_C_VOLATILE
562 AC_HEADER_STDC
563 dnl AC_TYPE_PID_T
564 AC_TYPE_UID_T
565 AC_TYPE_MODE_T
566 AC_TYPE_SIZE_T
567 AC_STRUCT_TM
568
569 dnl -------------------------
570 dnl Check other header files.
571 dnl -------------------------
572 AC_CHECK_HEADERS([stropts.h sys/ksym.h \
573 linux/version.h asm/types.h \
574 sys/cdefs.h])
575
576 ac_stdatomic_ok=false
577 AC_DEFINE(FRR_AUTOCONF_ATOMIC, 1, [did autoconf checks for atomic funcs])
578 AC_CHECK_HEADER([stdatomic.h],[
579
580 AC_MSG_CHECKING([whether _Atomic qualifier works])
581 AC_LINK_IFELSE([AC_LANG_SOURCE([[
582 #include <stdatomic.h>
583 int main(int argc, char **argv) {
584 _Atomic int i = 0;
585 return i;
586 }
587 ]])], [
588 AC_DEFINE(HAVE_STDATOMIC_H, 1, [found stdatomic.h])
589 AC_MSG_RESULT([yes])
590 ac_stdatomic_ok=true
591 ], [
592 AC_MSG_RESULT([no])
593 ])
594 ])
595
596 AS_IF([$ac_stdatomic_ok], [true], [
597 AC_MSG_CHECKING([for __atomic_* builtins])
598 AC_LINK_IFELSE([AC_LANG_SOURCE([[
599 int main(int argc, char **argv) {
600 volatile int i = 1;
601 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
602 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
603 }
604 ]])], [
605 AC_DEFINE(HAVE___ATOMIC, 1, [found __atomic builtins])
606 AC_MSG_RESULT([yes])
607 ], [
608 AC_MSG_RESULT([no])
609
610 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
611 AC_MSG_CHECKING([for __sync_* builtins])
612 AC_LINK_IFELSE([AC_LANG_SOURCE([[
613 int main(int argc, char **argv) {
614 volatile int i = 1;
615 __sync_fetch_and_sub (&i, 1);
616 return __sync_val_compare_and_swap (&i, 0, 1);
617 }
618 ]])], [
619 AC_DEFINE(HAVE___SYNC, 1, [found __sync builtins])
620 AC_MSG_RESULT([yes])
621
622 AC_MSG_CHECKING([for __sync_swap builtin])
623 AC_LINK_IFELSE([AC_LANG_SOURCE([[
624 int main(int argc, char **argv) {
625 volatile int i = 1;
626 return __sync_swap (&i, 2);
627 }
628 ]])], [
629 AC_DEFINE(HAVE___SYNC_SWAP, 1, [found __sync_swap builtin])
630 AC_MSG_RESULT([yes])
631 ], [
632 AC_MSG_RESULT([no])
633 ])
634
635 ], [
636 AC_MSG_RESULT([no])
637 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
638 ])
639 ])
640 ])
641
642 dnl Utility macro to avoid retyping includes all the time
643 m4_define([FRR_INCLUDES],
644 [#ifdef SUNOS_5
645 #define _XPG4_2
646 #define __EXTENSIONS__
647 #endif
648 #include <stdio.h>
649 #include <stdlib.h>
650 #include <stddef.h>
651 #include <sys/types.h>
652 /* sys/conf.h depends on param.h on FBSD at least */
653 #include <sys/param.h>
654 /* Required for MAXSIG */
655 #include <signal.h>
656 #include <sys/socket.h>
657 #ifdef __APPLE__
658 # define __APPLE_USE_RFC_3542
659 #endif
660 #include <netinet/in.h>
661 #include <sys/time.h>
662 #include <time.h>
663 #include <net/if.h>
664 ])dnl
665
666 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
667 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
668 dnl an additional round for it.
669
670 AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
671
672 m4_define([FRR_INCLUDES],
673 FRR_INCLUDES
674 [#if HAVE_NET_IF_VAR_H
675 # include <net/if_var.h>
676 #endif
677 ])dnl
678
679 AC_CHECK_HEADERS([netinet/in_var.h \
680 net/if_dl.h net/netopt.h \
681 inet/nd.h netinet/ip_icmp.h \
682 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
683 [], [], FRR_INCLUDES)
684
685 AC_CHECK_HEADERS([ucontext.h], [], [],
686 [#ifndef __USE_GNU
687 #define __USE_GNU
688 #endif /* __USE_GNU */
689 FRR_INCLUDES
690 ])
691
692 m4_define([UCONTEXT_INCLUDES],
693 [#include <ucontext.h>])dnl
694
695 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
696 [], [], [UCONTEXT_INCLUDES])
697 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
698 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
699 [], [], [UCONTEXT_INCLUDES])],
700 [], [UCONTEXT_INCLUDES])
701 AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
702 [], [], [UCONTEXT_INCLUDES])
703
704 m4_define([FRR_INCLUDES],
705 FRR_INCLUDES
706 [
707 #include <sys/un.h>
708 #include <netinet/in_systm.h>
709 #if HAVE_NETINET_IN_VAR_H
710 # include <netinet/in_var.h>
711 #endif
712 #if HAVE_NET_IF_DL_H
713 # include <net/if_dl.h>
714 #endif
715 #if HAVE_NET_NETOPT_H
716 # include <net/netopt.h>
717 #endif
718 #include <net/route.h>
719 #if HAVE_INET_ND_H
720 # include <inet/nd.h>
721 #endif
722 #include <arpa/inet.h>
723 /* Required for IDRP */
724 #if HAVE_NETINET_IP_ICMP_H
725 # include <netinet/ip_icmp.h>
726 #endif
727 ])dnl
728
729 dnl V6 headers are checked below, after we check for v6
730
731 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
732 case "$host" in
733 [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
734 opsys=sol2-6
735 AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
736 AC_DEFINE(SUNOS_5, 1, SunOS 5)
737 AC_CHECK_LIB(xnet, main)
738 CURSES=-lcurses
739 SOLARIS="solaris"
740 ;;
741 [*-sunos5.[8-9]] \
742 | [*-sunos5.1[0-9]] \
743 | [*-sunos5.1[0-9].[0-9]] \
744 | [*-solaris2.[8-9]] \
745 | [*-solaris2.1[0-9]] \
746 | [*-solaris2.1[0-9].[0-9]])
747 opsys=sol8
748 AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
749 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
750 AC_CHECK_LIB(socket, main)
751 AC_CHECK_LIB(nsl, main)
752 AC_CHECK_LIB(umem, main)
753 AC_CHECK_FUNCS([printstack],
754 [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
755 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
756 ])
757 CURSES=-lcurses
758 SOLARIS="solaris"
759 ;;
760 *-sunos5* | *-solaris2*)
761 AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
762 AC_CHECK_LIB(socket, main)
763 AC_CHECK_LIB(nsl, main)
764 CURSES=-lcurses
765 SOLARIS="solaris"
766 ;;
767 *-linux*)
768 opsys=gnu-linux
769 AC_DEFINE(GNU_LINUX,,GNU Linux)
770 ;;
771 *-openbsd*)
772 opsys=openbsd
773 AC_DEFINE(OPEN_BSD,,OpenBSD)
774 ;;
775 esac
776
777 AC_SYS_LARGEFILE
778
779 dnl ---------------------
780 dnl Integrated VTY option
781 dnl ---------------------
782 case "${enable_vtysh}" in
783 "no") VTYSH="";;
784 *) VTYSH="vtysh";
785 AC_DEFINE(VTYSH,,VTY shell)
786 dnl Vtysh uses libreadline, which looks for termcap functions at
787 dnl configure time. We follow readlines search order.
788 dnl The required procedures are in libtermcap on NetBSD, in
789 dnl [TODO] on Linux, and in [TODO] on Solaris.
790 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
791 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
792 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
793 [AC_CHECK_LIB(ncurses, tputs,
794 LIBREADLINE="$LIBREADLINE -lncurses")]
795 )]
796 )]
797 )
798 AC_CHECK_LIB(readline, main, LIBREADLINE="-lreadline $LIBREADLINE",,
799 "$LIBREADLINE")
800 if test $ac_cv_lib_readline_main = no; then
801 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
802 fi
803 AC_CHECK_HEADER(readline/history.h)
804 if test $ac_cv_header_readline_history_h = no;then
805 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
806 fi
807 AC_CHECK_LIB(readline, rl_completion_matches,
808 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
809 if test $ac_cv_lib_readline_rl_completion_matches = no; then
810 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
811 fi
812 ;;
813 esac
814 AC_SUBST(LIBREADLINE)
815 AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
816
817 dnl ----------
818 dnl PAM module
819 dnl
820 dnl Quagga detects the PAM library it is built against by checking for a
821 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
822 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
823 dnl openpam.h doesn't do that, although depends on the header too. Hence a
824 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
825 dnl of OpenPAM.
826 dnl ----------
827 if test "$with_libpam" = "yes"; then
828 AC_CHECK_HEADER([security/pam_misc.h],
829 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
830 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
831 pam_conv_func="misc_conv"
832 ],
833 [], FRR_INCLUDES)
834 AC_CHECK_HEADER([security/openpam.h],
835 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
836 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
837 pam_conv_func="openpam_ttyconv"
838 ],
839 [], FRR_INCLUDES[#include <security/pam_appl.h>])
840 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
841 AC_MSG_WARN([*** pam support will not be built ***])
842 with_libpam="no"
843 fi
844 fi
845
846 if test "$with_libpam" = "yes"; then
847 dnl took this test from proftpds configure.in and suited to our needs
848 dnl -------------------------------------------------------------------------
849 dnl
850 dnl This next check looks funky due to a linker problem with some versions
851 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
852 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
853 dnl with RedHat 6.2 and Debian 2.2 or better.
854 AC_CHECK_LIB(pam, pam_start,
855 [AC_CHECK_LIB(pam, $pam_conv_func,
856 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
857 LIBPAM="-lpam"],
858 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
859 LIBPAM="-lpam -lpam_misc"]
860 )
861 ],
862
863 [AC_CHECK_LIB(pam, pam_end,
864 [AC_CHECK_LIB(pam, $pam_conv_func,
865 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
866 LIBPAM="-lpam -ldl"],
867 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
868 LIBPAM="-lpam -ldl -lpam_misc"]
869 )
870 ],AC_MSG_WARN([*** pam support will not be built ***]),
871 [-ldl])
872 ]
873 )
874 fi
875 AC_SUBST(LIBPAM)
876
877 dnl -------------------------------
878 dnl Endian-ness check
879 dnl -------------------------------
880 AC_WORDS_BIGENDIAN
881
882 dnl -------------------------------
883 dnl check the size in byte of the C
884 dnl -------------------------------
885 dnl AC_CHECK_SIZEOF(char)
886 dnl AC_CHECK_SIZEOF(int)
887 dnl AC_CHECK_SIZEOF(short)
888 dnl AC_CHECK_SIZEOF(long)
889
890 dnl ----------------------------
891 dnl check existance of functions
892 dnl ----------------------------
893 AC_FUNC_FNMATCH
894 AC_FUNC_FORK
895 AC_FUNC_MKTIME
896 AC_FUNC_STAT
897
898 dnl -------------------------------
899 dnl bgpd needs pow() and hence libm
900 dnl -------------------------------
901 TMPLIBS="$LIBS"
902 AC_CHECK_HEADER([math.h],
903 [AC_CHECK_LIB([m], [pow],
904 [LIBM="-lm"
905 LIBS="$LIBS $LIBM"
906 AC_CHECK_FUNCS(pow,[],[LIBM=""])
907 ])
908 ])
909 if test x"$LIBM" = x ; then
910 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
911 fi
912 LIBS="$TMPLIBS"
913 AC_SUBST(LIBM)
914
915 dnl ---------------
916 dnl other functions
917 dnl ---------------
918 AC_CHECK_FUNCS([ \
919 strlcat strlcpy \
920 getgrouplist])
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 LDPD="ldpd"
1288 AC_DEFINE(HAVE_LDPD, 1, ldpd)
1289 fi
1290 AM_CONDITIONAL(LDPD, test "x$LDPD" = "xldpd")
1291
1292 NHRPD=""
1293 if test "$opsys" = "gnu-linux"; then
1294 if test "${enable_nhrpd}" != "no"; then
1295 NHRPD="nhrpd"
1296 fi
1297 else
1298 if test "${enable_nhrpd}" = "yes"; then
1299 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1300 fi
1301 fi
1302 AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1303
1304 if test "${enable_eigrpd}" = "no";then
1305 EIGRPD=""
1306 else
1307 EIGRPD="eigrpd"
1308 fi
1309 AM_CONDITIONAL(EIGRPD, test "x$EIGRPD" = "xeigrpd")
1310
1311 if test "${enable_watchfrr}" = "no";then
1312 WATCHFRR=""
1313 else
1314 WATCHFRR="watchfrr"
1315 fi
1316 AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
1317
1318 OSPFCLIENT=""
1319 if test "${enable_ospfapi}" != "no";then
1320 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1321
1322 if test "${enable_ospfclient}" != "no";then
1323 OSPFCLIENT="ospfclient"
1324 fi
1325 fi
1326
1327 AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
1328
1329 case "${enable_ripngd}" in
1330 "no" ) RIPNGD="";;
1331 * ) RIPNGD="ripngd";;
1332 esac
1333 AM_CONDITIONAL(RIPNGD, test "x$RIPNGD" = "xripngd")
1334
1335 case "${enable_babeld}" in
1336 "no" ) BABELD="";;
1337 * ) BABELD="babeld";;
1338 esac
1339 AM_CONDITIONAL(BABELD, test "x$BABELD" = "xbabeld")
1340
1341 case "${enable_ospf6d}" in
1342 "no" ) OSPF6D="";;
1343 * ) OSPF6D="ospf6d";;
1344 esac
1345 AM_CONDITIONAL(OSPF6D, test "x$OSPF6D" = "xospf6d")
1346
1347 case "${enable_isisd}" in
1348 "no" ) ISISD="";;
1349 * ) ISISD="isisd";;
1350 esac
1351 AM_CONDITIONAL(ISISD, test "x$ISISD" = "xisisd")
1352
1353 case "${enable_pimd}" in
1354 "no" ) PIMD="";;
1355 * ) PIMD="pimd";;
1356 esac
1357 AM_CONDITIONAL(PIMD, test "x$PIMD" = "xpimd")
1358
1359 if test "${enable_bgp_announce}" = "no";then
1360 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1361 else
1362 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1363 fi
1364
1365 if test "${with_rfp_path}" = "yes" || test x"${with_rfp_path}" = x""; then
1366 with_rfp_path="bgpd/rfp-example"
1367 fi
1368 if test "${with_rfp_path}" != "no"; then
1369 VNC_RFP_PATH="${with_rfp_path}"
1370 AC_SUBST(VNC_RFP_PATH)
1371 fi
1372
1373 if test "${enable_bgp_vnc}" != "no";then
1374 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
1375 RFPTEST="${with_rfp_path}/rfptest"
1376 LIBRFP="${with_rfp_path}/librfp"
1377 RFPINC="${with_rfp_path}/librfp"
1378 else
1379 RFPTEST=
1380 LIBRFP=
1381 RFPINC="bgpd/rfp-example/librfp"
1382 fi
1383 # set
1384 AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
1385
1386 AC_SUBST(DOC)
1387 AC_SUBST(ZEBRA)
1388 AC_SUBST(RFPTEST)
1389 AC_SUBST(LIBRFP)
1390 AC_SUBST(RFPINC)
1391 AC_SUBST(BABELD)
1392 AC_SUBST(BGPD)
1393 AC_SUBST(RIPD)
1394 AC_SUBST(RIPNGD)
1395 AC_SUBST(OSPFD)
1396 AC_SUBST(OSPF6D)
1397 AC_SUBST(LDPD)
1398 AC_SUBST(NHRPD)
1399 AC_SUBST(EIGRPD)
1400 AC_SUBST(WATCHFRR)
1401 AC_SUBST(ISISD)
1402 AC_SUBST(PIMD)
1403 AC_SUBST(SOLARIS)
1404 AC_SUBST(VTYSH)
1405 AC_SUBST(CURSES)
1406 AC_SUBST(OSPFCLIENT)
1407 AC_SUBST(OSPFAPI)
1408 AC_CHECK_LIB(crypt, crypt)
1409 AC_CHECK_LIB(resolv, res_init)
1410
1411 dnl ---------------------------
1412 dnl check system has PCRE regexp
1413 dnl ---------------------------
1414 if test "x$enable_pcreposix" = "xyes"; then
1415 AC_CHECK_LIB(pcreposix, regexec, [], [
1416 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1417 ])
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 babeld/Makefile
1849 pimd/Makefile
1850 eigrpd/Makefile
1851 nhrpd/Makefile
1852 redhat/Makefile
1853 tools/Makefile
1854 pkgsrc/Makefile
1855 fpm/Makefile
1856 redhat/frr.spec
1857 snapcraft/Makefile
1858 snapcraft/snapcraft.yaml
1859 lib/version.h
1860 tests/lib/cli/test_cli.refout
1861 doc/defines.texi
1862 doc/bgpd.8
1863 doc/isisd.8
1864 doc/ospf6d.8
1865 doc/ospfclient.8
1866 doc/ospfd.8
1867 doc/ldpd.8
1868 doc/ripd.8
1869 doc/eigrpd.8
1870 doc/ripngd.8
1871 doc/pimd.8
1872 doc/nhrpd.8
1873 doc/vtysh.1
1874 doc/watchfrr.8
1875 doc/zebra.8
1876 doc/frr.1
1877 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1878 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
1879 pkgsrc/eigrpd.sh])
1880
1881 if test "${enable_bgp_vnc}" != "no"; then
1882 if test "${with_rfp_path}" = "bgpd/rfp-example" ; then
1883 AC_CONFIG_FILES([bgpd/rfp-example/rfptest/Makefile bgpd/rfp-example/librfp/Makefile])
1884 else
1885 AC_CONFIG_FILES([${with_rfp_path}/rfptest/Makefile ${with_rfp_path}/librfp/Makefile])
1886 fi
1887 fi
1888
1889 AC_CONFIG_FILES([solaris/Makefile])
1890
1891 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1892
1893 ## Hack, but working solution to avoid rebuilding of quagga.info.
1894 ## It's already in CVS until texinfo 4.7 is more common.
1895 AC_OUTPUT
1896
1897 echo "
1898 FRRouting configuration
1899 ------------------------------
1900 FRR version : ${PACKAGE_VERSION}
1901 host operating system : ${host_os}
1902 source code location : ${srcdir}
1903 compiler : ${CC}
1904 compiler flags : ${CFLAGS}
1905 make : ${MAKE-make}
1906 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1907 state file directory : ${frr_statedir}
1908 config file directory : `eval echo \`echo ${sysconfdir}\``
1909 example directory : `eval echo \`echo ${exampledir}\``
1910 module directory : ${CFG_MODULE}
1911 user to run as : ${enable_user}
1912 group to run as : ${enable_group}
1913 group for vty sockets : ${enable_vty_group}
1914 config file mask : ${enable_configfile_mask}
1915 log file mask : ${enable_logfile_mask}
1916 zebra protobuf enabled : ${have_protobuf:-no}
1917
1918 The above user and group must have read/write access to the state file
1919 directory and to the config files in the config file directory."