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