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