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