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