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