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