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