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