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