]> git.proxmox.com Git - mirror_frr.git/blame - configure.ac
Merge pull request #3301 from opensourcerouting/bugfix/remove-unused-isis-debugs
[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
17808c03 10AC_INIT(frr, 6.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"; \
c71b8557 43 cd hosttools; "${abssrc}/configure" "--host=$build" "--build=$build" "--enable-clippy-only" "--disable-nhrpd" "--disable-vtysh"; )
29ad6f68
DL
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.
f20aafee 60AM_INIT_AUTOMAKE([1.12 -Wno-portability foreign])
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
1c2facd1 94
62565dc9
LB
95AC_ARG_WITH([yangmodelsdir], [AS_HELP_STRING([--with-yangmodelsdir=DIR], [yang models directory (${datarootdir}/yang)])], [
96 yangmodelsdir="$withval"
97], [
98 yangmodelsdir="\${datarootdir}/yang"
99])
100AC_SUBST(yangmodelsdir)
101
102AC_ARG_WITH([libyang_pluginsdir], [AS_HELP_STRING([--with-libyang-pluginsdir=DIR], [yangmodule plugins directory (${libdir}/frr/libyang_plugins)])], [
103 libyang_pluginsdir="$withval"
104], [
105 libyang_pluginsdir="\${libdir}/frr/libyang_plugins"
106])
1c2facd1
RW
107AC_SUBST(libyang_pluginsdir)
108
3f9c7369 109AC_ARG_ENABLE(tcmalloc,
428cd73f 110 AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
3f9c7369
DS
111[case "${enableval}" in
112 yes) tcmalloc_enabled=true
113LIBS="$LIBS -ltcmalloc_minimal"
114 ;;
115 no) tcmalloc_enabled=false ;;
116 *) AC_MSG_ERROR(bad value ${enableval} for --enable-tcmalloc) ;;
117esac],[tcmalloc_enabled=false])
118
119
fbd0bae6
DL
120dnl Thanks autoconf, but we don't want a default -g -O2. We have our own
121dnl flag determination logic.
122CFLAGS="${CFLAGS:-}"
123
1969e4b9 124dnl --------------------
125dnl Check CC and friends
126dnl --------------------
a89b1641
DL
127dnl note orig_cflags is also used further down
128orig_cflags="$CFLAGS"
46bc0e43 129AC_LANG([C])
7ea487bc 130AC_PROG_CC
1969e4b9 131AC_PROG_CPP
46bc0e43 132AM_PROG_CC_C_O
a89b1641
DL
133dnl remove autoconf default "-g -O2"
134CFLAGS="$orig_cflags"
1769aff8 135AC_PROG_CC_C99
8aa42b82 136dnl NB: see C11 below
553bdfe3 137
a89b1641 138AC_PROG_EGREP
2fb975da 139PKG_PROG_PKG_CONFIG
a89b1641 140
553bdfe3
GT
141dnl autoconf 2.59 appears not to support AC_PROG_SED
142dnl AC_PROG_SED
143AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
1969e4b9 144
1689cf7e 145dnl try and enable CFLAGS that are useful for FRR
a89b1641 146dnl - specifically, options to control warnings
1969e4b9 147
b31fd749 148AC_USE_SYSTEM_EXTENSIONS
988225dd 149AC_DEFUN([AC_C_FLAG], [{
2a636b43
DL
150 m4_pushdef([cachename],[m4_translit([frr_cv_$1],[ =-],[___])])
151 AC_CACHE_CHECK([[whether $CC supports $1]], cachename, [
988225dd
DL
152 AC_LANG_PUSH(C)
153 ac_c_flag_save="$CFLAGS"
154 CFLAGS="$CFLAGS $1"
988225dd
DL
155 AC_COMPILE_IFELSE(
156 [AC_LANG_PROGRAM([[]])],
157 [
2a636b43 158 cachename=yes
988225dd 159 ], [
2a636b43 160 cachename=no
988225dd 161 ])
2a636b43 162 CFLAGS="$ac_c_flag_save"
988225dd 163 AC_LANG_POP(C)
2a636b43
DL
164 ])
165 if test "${cachename}" = yes; then
166 m4_if([$3], [], [CFLAGS="$CFLAGS $1"], [$3])
167 else
168 :
169 $2
170 fi
171 m4_popdef([cachename])
172}])
988225dd 173
92e50261
DL
174AC_DEFUN([AC_LINK_IFELSE_FLAGS], [{
175 AC_LANG_PUSH(C)
176 ac_cflags_save="$CFLAGS"
177 ac_libs_save="$LIBS"
178 CFLAGS="$CFLAGS $1"
179 LIBS="$LIBS $2"
180 AC_LINK_IFELSE(
181 [$3],
182 [
183 AC_MSG_RESULT([yes])
184 CFLAGS="$ac_cflags_save"
185 LIBS="$ac_libs_save"
186 $5
187 ], [
188 AC_MSG_RESULT([no])
189 CFLAGS="$ac_cflags_save"
190 LIBS="$ac_libs_save"
191 $4
192 ])
193 AC_LANG_POP(C)
194 }])
195
a89b1641
DL
196dnl ICC won't bail on unknown options without -diag-error 10006
197dnl need to do this first so we get useful results for the other options
198AC_C_FLAG([-diag-error 10006])
199
8aa42b82
DL
200dnl AC_PROG_CC_C99 may change CC to include -std=gnu99 or something
201ac_cc="$CC"
202CC="${CC% -std=gnu99}"
203CC="${CC% -std=c99}"
204
205AC_C_FLAG([-std=gnu11], [CC="$ac_cc"], [CC="$CC -std=gnu11"])
206
09329dbc 207dnl if the user has specified any CFLAGS, override our settings
83284209
AJ
208if test "x${enable_gcov}" = "xyes"; then
209 if test "z$orig_cflags" = "z"; then
210 AC_C_FLAG([-coverage])
211 AC_C_FLAG([-O0])
212 fi
213
214 LDFLAGS="${LDFLAGS} -lgcov"
215elif test "x${enable_dev_build}" = "xyes"; then
09329dbc
DS
216 AC_DEFINE(DEV_BUILD,,Build for development)
217 if test "z$orig_cflags" = "z"; then
218 AC_C_FLAG([-g3])
219 AC_C_FLAG([-O0])
220 fi
634949ae
DS
221 if test "x${enable_lua}" = "xyes"; then
222 AC_CHECK_LIB([lua], [lua_newstate],
223 [LIBS="$LIBS -llua"])
224 AC_DEFINE(HAVE_LUA,,Lua enabled for development)
225 fi
09329dbc 226else
634949ae
DS
227 if test "x${enable_lua}" = "xyes"; then
228 AC_MSG_ERROR([Lua is not meant to be built/used outside of development at this time])
229 fi
09329dbc
DS
230 if test "z$orig_cflags" = "z"; then
231 AC_C_FLAG([-g])
232 AC_C_FLAG([-Os], [
233 AC_C_FLAG([-O2])
234 ])
235 fi
236fi
237AM_CONDITIONAL([DEV_BUILD], [test "x$enable_dev_build" = "xyes"])
238
a89b1641
DL
239dnl always want these CFLAGS
240AC_C_FLAG([-fno-omit-frame-pointer])
c594d99f 241AC_C_FLAG([-funwind-tables])
a89b1641
DL
242AC_C_FLAG([-Wall])
243AC_C_FLAG([-Wextra])
244AC_C_FLAG([-Wmissing-prototypes])
245AC_C_FLAG([-Wmissing-declarations])
246AC_C_FLAG([-Wpointer-arith])
247AC_C_FLAG([-Wbad-function-cast])
248AC_C_FLAG([-Wwrite-strings])
249if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
250 AC_C_FLAG([-Wcast-qual])
251 AC_C_FLAG([-Wstrict-prototypes])
252 AC_C_FLAG([-Wmissing-noreturn])
253 AC_C_FLAG([-Wmissing-format-attribute])
254 AC_C_FLAG([-Wunreachable-code])
255 AC_C_FLAG([-Wpacked])
256 AC_C_FLAG([-Wpadded])
2b5773b2 257 AC_C_FLAG([-Wshadow])
6a4b8832 258else
a89b1641 259 AC_C_FLAG([-Wno-unused-result])
1969e4b9 260fi
a89b1641
DL
261AC_C_FLAG([-Wno-unused-parameter])
262AC_C_FLAG([-Wno-missing-field-initializers])
263
264dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
265dnl for some reason the string consts get 'promoted' to char *,
266dnl triggering a const to non-const conversion warning.
267AC_C_FLAG([-diag-disable 3179])
1969e4b9 268
aa9584c1
DS
269if test x"${enable_werror}" = x"yes" ; then
270 WERROR="-Werror"
271fi
272AC_SUBST(WERROR)
273
dbac691d
DL
274SAN_FLAGS=""
275if test "$enable_address_sanitizer" = "yes"; then
276 AC_C_FLAG([-fsanitize=address], [
277 AC_MSG_ERROR([$CC does not support Address Sanitizer.])
278 ], [
279 SAN_FLAGS="$SAN_FLAGS -fsanitize=address"
280 ])
281fi
282if test "$enable_thread_sanitizer" = "yes"; then
283 AC_C_FLAG([-fsanitize=thread], [
284 AC_MSG_ERROR([$CC does not support Thread Sanitizer.])
285 ], [
286 SAN_FLAGS="$SAN_FLAGS -fsanitize=thread"
287 ])
288fi
289if test "$enable_memory_sanitizer" = "yes"; then
290 AC_C_FLAG([-fsanitize=thread -fPIE -pie], [
291 AC_MSG_ERROR([$CC does not support Thread Sanitizer.])
292 ], [
293 SAN_FLAGS="-fsanitize=memory -fPIE -pie"
294 ])
295fi
296AC_SUBST([SAN_FLAGS])
297
b31fd749
DL
298dnl ----------
299dnl Essentials
300dnl ----------
301
302AX_PTHREAD([
303 CC="$PTHREAD_CC"
304 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
305 LIBS="$PTHREAD_LIBS $LIBS"
306], [
1689cf7e 307 AC_MSG_FAILURE([This FRR version needs pthreads])
b31fd749
DL
308])
309
afc9534f
DS
310AC_SEARCH_LIBS([pthread_condattr_setclock], [],
311 [frr_cv_pthread_condattr_setclock=yes],
312 [frr_cv_pthread_condattr_setclock=no])
313if test "$frr_cv_pthread_condattr_setclock" = yes; then
314 AC_DEFINE(HAVE_PTHREAD_CONDATTR_SETCLOCK, 1, [Have pthread.h pthread_condattr_setclock])
315fi
316
7ea487bc 317dnl --------------
318dnl Check programs
319dnl --------------
7ea487bc 320AC_PROG_INSTALL
6f0e3f6e 321AC_PROG_LN_S
7ea487bc 322AC_PROG_MAKE_SET
323AC_CHECK_TOOL(AR, ar)
7ea487bc 324
87efd646 325dnl -------
326dnl libtool
327dnl -------
d6e76257
DL
328AC_ARG_ENABLE(static-bin,
329 AS_HELP_STRING([--enable-static-bin], [link binaries statically]))
95bb8305 330LT_INIT
d6e76257
DL
331_LT_CONFIG_LIBTOOL([
332 patch -N -i "${srcdir}/m4/libtool-whole-archive.patch" libtool >&AS_MESSAGE_LOG_FD || \
333 AC_MSG_WARN([Could not patch libtool for static linking support. Loading modules into a statically linked daemon will fail.])
334])
335if test "$enable_static_bin" = "yes"; then
336 AC_LDFLAGS="-static"
337fi
338AC_SUBST(AC_LDFLAGS)
339AM_CONDITIONAL([STATIC_BIN], [test "x$enable_static_bin" = "xyes"])
87efd646 340
105a8189
DL
341dnl $AR and $RANLIB are set by LT_INIT above
342AC_MSG_CHECKING([whether $AR supports D option])
343if $AR crD conftest.a; then
344 AC_MSG_RESULT([yes])
345 dnl ARFLAGS is for automake, AR_FLAGS for libtool m-(
346 ARFLAGS="crD"
347 AR_FLAGS="crD"
348else
349 AC_MSG_RESULT([no])
350 ARFLAGS="cru"
351 AR_FLAGS="cru"
352fi
353AC_SUBST(ARFLAGS)
354AC_SUBST(AR_FLAGS)
355
356AC_MSG_CHECKING([whether $RANLIB supports D option])
357if $RANLIB -D conftest.a; then
358 AC_MSG_RESULT([yes])
359 RANLIB="$RANLIB -D"
360else
361 AC_MSG_RESULT([no])
362fi
363AC_SUBST(RANLIB)
364
365test -f conftest.a && rm conftest.a
366
7ea487bc 367dnl ----------------------
368dnl Packages configuration
369dnl ----------------------
06871ed9
DL
370if test -f config.version; then
371 . ./config.version
372elif test -f "${srcdir}/config.version"; then
373 . "${srcdir}/config.version"
374fi
1080c13f 375AC_ARG_WITH(pkg-extra-version,
06871ed9
DL
376 AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]), [
377 if test "$withval" = "no"; then
378 EXTRAVERSION=
379 else
380 EXTRAVERSION=$withval
381 fi
382], [])
0be793e6
DL
383AC_ARG_WITH(pkg-git-version,
384 AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
a16dcf7c 385 [ test "x$withval" != "xno" && with_pkg_git_version="yes" ])
08c369bd
DS
386AC_ARG_WITH(vtysh_pager,
387 AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
388 VTYSH_PAGER=$withval, VTYSH_PAGER="more")
7ea487bc 389AC_ARG_ENABLE(vtysh,
1689cf7e 390 AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for FRR]))
cbcd9bfc 391AC_ARG_ENABLE(doc,
23925784 392 AS_HELP_STRING([--disable-doc], [do not build docs]))
9e53b315 393AC_ARG_ENABLE(doc-html,
50dc6dbd 394 AS_HELP_STRING([--enable-doc-html], [build HTML docs]))
7ea487bc 395AC_ARG_ENABLE(zebra,
23925784 396 AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
7ea487bc 397AC_ARG_ENABLE(bgpd,
23925784 398 AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
7ea487bc 399AC_ARG_ENABLE(ripd,
23925784 400 AS_HELP_STRING([--disable-ripd], [do not build ripd]))
7ea487bc 401AC_ARG_ENABLE(ripngd,
23925784 402 AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
7ea487bc 403AC_ARG_ENABLE(ospfd,
23925784 404 AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
7ea487bc 405AC_ARG_ENABLE(ospf6d,
23925784 406 AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
eac6e3f0 407AC_ARG_ENABLE(ldpd,
5a6869b2 408 AS_HELP_STRING([--disable-ldpd], [do not build ldpd]))
2fb975da
TT
409AC_ARG_ENABLE(nhrpd,
410 AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
7f57883e
DS
411AC_ARG_ENABLE(eigrpd,
412 AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
ca10883e
DS
413AC_ARG_ENABLE(babeld,
414 AS_HELP_STRING([--disable-babeld], [do not build babeld]))
9473e340
DS
415AC_ARG_ENABLE(watchfrr,
416 AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
9e867fe6 417AC_ARG_ENABLE(isisd,
c3a9461e 418 AS_HELP_STRING([--disable-isisd], [do not build isisd]))
12e41d03 419AC_ARG_ENABLE(pimd,
23925784 420 AS_HELP_STRING([--disable-pimd], [do not build pimd]))
3cab181d
DS
421AC_ARG_ENABLE(pbrd,
422 AS_HELP_STRING([--disable-pbrd], [do not build pbrd]))
2222a716 423AC_ARG_ENABLE(sharpd,
5a6869b2
MS
424 AS_HELP_STRING([--enable-sharpd], [build sharpd]))
425AC_ARG_ENABLE(staticd,
426 AS_HELP_STRING([--disable-staticd], [do not build staticd]))
7c0cbd0e
CF
427AC_ARG_ENABLE(fabricd,
428 AS_HELP_STRING([--disable-fabricd], [do not build fabricd]))
7ea487bc 429AC_ARG_ENABLE(bgp-announce,
23925784 430 AS_HELP_STRING([--disable-bgp-announce,], [turn off BGP route announcement]))
65efcfce 431AC_ARG_ENABLE(bgp-vnc,
f95f2ad9 432 AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
7ea487bc 433AC_ARG_ENABLE(snmp,
807ed4e9 434 AS_HELP_STRING([--enable-snmp], [enable SNMP support for agentx]))
1c2facd1
RW
435AC_ARG_ENABLE(config_rollbacks,
436 AS_HELP_STRING([--enable-config-rollbacks], [enable configuration rollbacks (requires sqlite3)]))
5bce33b3
RW
437AC_ARG_ENABLE(confd,
438 AS_HELP_STRING([--enable-confd=ARG], [enable confd integration]))
a7ca2199
RW
439AC_ARG_ENABLE(sysrepo,
440 AS_HELP_STRING([--enable-sysrepo], [enable sysrepo integration]))
b6116506
DL
441AC_ARG_ENABLE(zeromq,
442 AS_HELP_STRING([--enable-zeromq], [enable ZeroMQ handler (libfrrzmq)]))
7ea487bc 443AC_ARG_WITH(libpam,
23925784 444 AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
1ef74ef7 445AC_ARG_ENABLE(ospfapi,
23925784 446 AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
1ef74ef7 447AC_ARG_ENABLE(ospfclient,
23925784
DL
448 AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
449 (this is the default if --disable-ospfapi is set)]))
7ea487bc 450AC_ARG_ENABLE(multipath,
23925784 451 AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
fe86b484 452AC_ARG_ENABLE(user,
b2f36157 453 AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
fe86b484 454AC_ARG_ENABLE(group,
b2f36157 455 AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
edd7c245 456AC_ARG_ENABLE(vty_group,
23925784 457 AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
aa593d5e 458AC_ARG_ENABLE(configfile_mask,
23925784 459 AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
aa593d5e 460AC_ARG_ENABLE(logfile_mask,
23925784 461 AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
5fd1f747 462AC_ARG_ENABLE(shell_access,
23925784 463 AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
4e40b6d6
KK
464AC_ARG_ENABLE(realms,
465 AS_HELP_STRING([--enable-realms], [enable REALMS support under Linux]))
71c0fb50 466AC_ARG_ENABLE(rtadv,
23925784 467 AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
ca776988 468AC_ARG_ENABLE(irdp,
8dc1f7fc 469 AS_HELP_STRING([--disable-irdp], [enable IRDP server support in zebra (default if supported)]))
41d3fc96 470AC_ARG_ENABLE(capabilities,
23925784 471 AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
47f6aef0 472AC_ARG_ENABLE(rusage,
23925784 473 AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
6b6942f9 474AC_ARG_ENABLE(gcc_ultra_verbose,
23925784 475 AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
8c99b4c1 476AC_ARG_ENABLE(backtrace,
23925784 477 AS_HELP_STRING([--disable-backtrace,], [disable crash backtraces (default autodetect)]))
924b9229 478AC_ARG_ENABLE(time-check,
23925784 479 AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
25f45887 480AC_ARG_ENABLE(pcreposix,
23925784 481 AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
5adc2528 482AC_ARG_ENABLE(fpm,
23925784 483 AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
ddd82ff6 484AC_ARG_ENABLE(systemd,
23925784 485 AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
aa9584c1
DS
486AC_ARG_ENABLE(werror,
487 AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
000cf1fb 488AC_ARG_ENABLE(cumulus,
23925784 489 AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
df970aa6
DS
490AC_ARG_ENABLE(datacenter,
491 AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
411314ed
DS
492AC_ARG_ENABLE(fuzzing,
493 AS_HELP_STRING([--enable-fuzzing], [enable ability to fuzz various parts of FRR]))
acfa8927
SW
494AC_ARG_ENABLE(netlink_fuzzing,
495 AS_HELP_STRING([--enable-netlink-fuzzing], [enable ability to fuzz netlink listening socket in zebra]))
76981cd3
DS
496AC_ARG_ENABLE(rr-semantics,
497 AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
dad253b4
AS
498AC_ARG_ENABLE([protobuf],
499 AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
28436d6d 500AC_ARG_ENABLE([oldvpn_commands],
fcc65b0f 501 AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
dabecd7c
MR
502AC_ARG_ENABLE(rpki,
503 AS_HELP_STRING([--enable-rpki], [enable RPKI prefix validation support]))
c71b8557
LC
504AC_ARG_ENABLE([clippy-only],
505 AS_HELP_STRING([--enable-clippy-only], [Only build clippy]))
c737c7ba
AJ
506AC_ARG_ENABLE([numeric_version],
507 AS_HELP_STRING([--enable-numeric-version], [Only numeric digits allowed in version (for Alpine)]))
83284209
AJ
508AC_ARG_ENABLE([gcov],
509 AS_HELP_STRING([--enable-gcov], [Add code coverage information]))
7134904b
RZ
510AC_ARG_ENABLE(bfdd,
511 AS_HELP_STRING([--disable-bfdd], [do not build bfdd]))
dbac691d
DL
512AC_ARG_ENABLE([address-sanitizer],
513 AS_HELP_STRING([--enable-address-sanitizer], [enable AddressSanitizer support for detecting a wide variety of memory allocation and deallocation errors]))
514AC_ARG_ENABLE([thread-sanitizer],
515 AS_HELP_STRING([--enable-thread-sanitizer], [enable ThreadSanitizer support for detecting data races]))
516AC_ARG_ENABLE([memory-sanitizer],
517 AS_HELP_STRING([--enable-memory-sanitizer], [enable MemorySanitizer support for detecting uninitialized memory reads]))
6b6942f9 518
c71b8557 519AS_IF([test "${enable_clippy_only}" != "yes"], [
112072ac 520AC_CHECK_HEADERS(json-c/json.h)
ea2fd55a 521AC_CHECK_LIB(json-c, json_object_get, LIBS="$LIBS -ljson-c", [], [-lm])
39d3cc4e 522if test "$ac_cv_lib_json_c_json_object_get" = no; then
10b8ab26 523 AC_CHECK_LIB(json, json_object_get, LIBS="$LIBS -ljson")
39d3cc4e 524 if test "$ac_cv_lib_json_json_object_get" = no; then
1f104f57 525 AC_MSG_ERROR([libjson is needed to compile])
10b8ab26 526 fi
c2f4c19c 527fi
c71b8557 528])
c2f4c19c 529
3b8282a8
AS
530AC_ARG_ENABLE([dev_build],
531 AS_HELP_STRING([--enable-dev-build], [build for development]))
532
634949ae
DS
533AC_ARG_ENABLE([lua],
534 AS_HELP_STRING([--enable-lua], [Build Lua scripting]))
535
924b9229 536if test x"${enable_time_check}" != x"no" ; then
537 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
538 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
539 else
540 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
541 fi
542fi
543
37219958
DS
544case "${enable_systemd}" in
545 "no") ;;
546 "yes")
547 AC_CHECK_LIB(systemd, sd_notify, LIBS="$LIBS -lsystemd")
548 if test $ac_cv_lib_systemd_sd_notify = no; then
549 AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
63e30864
DS
550 else
551 AC_DEFINE(HAVE_SYSTEMD,,Compile systemd support in)
37219958
DS
552 fi
553 ;;
554 "*") ;;
555esac
ddd82ff6 556
76981cd3
DS
557if test "${enable_rr_semantics}" != "no" ; then
558 AC_DEFINE(HAVE_V6_RR_SEMANTICS,, Compile in v6 Route Replacement Semantics)
559fi
560
df970aa6
DS
561if test "${enable_datacenter}" = "yes" ; then
562 AC_DEFINE(HAVE_DATACENTER,,Compile extensions for a DataCenter)
8efe88ea
DL
563 DFLT_NAME="datacenter"
564else
565 DFLT_NAME="traditional"
000cf1fb 566fi
df970aa6 567
411314ed
DS
568if test "${enable_fuzzing}" = "yes" ; then
569 AC_DEFINE(HANDLE_ZAPI_FUZZING,,Compile extensions to use with a fuzzer)
570fi
571
acfa8927
SW
572if test "${enable_netlink_fuzzing}" = "yes" ; then
573 AC_DEFINE(HANDLE_NETLINK_FUZZING,,Compile extensions to use with a fuzzer for netlink)
574fi
575
df970aa6
DS
576if test "${enable_cumulus}" = "yes" ; then
577 AC_DEFINE(HAVE_CUMULUS,,Compile Special Cumulus Code in)
578fi
579
8efe88ea
DL
580AC_SUBST(DFLT_NAME)
581AC_DEFINE_UNQUOTED(DFLT_NAME,["$DFLT_NAME"], Name of the configuration default set)
000cf1fb 582
576b6b5d
DS
583if test "${enable_shell_access}" = "yes"; then
584 AC_DEFINE(HAVE_SHELL_ACCESS,,Allow user to use ssh/telnet/bash)
585fi
586
4f8ea50c 587AM_CONDITIONAL([FPM], [test "x$enable_fpm" = "xyes"])
5adc2528 588
29ad6f68
DL
589#
590# Python for clippy
591#
29ad6f68 592
0fca9cee
DL
593AC_DEFUN([FRR_PYTHON_CHECK_WORKING], [
594 AC_MSG_CHECKING([whether we found a working Python version])
595 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
29ad6f68
DL
596#include <Python.h>
597#if PY_VERSION_HEX < 0x02070000
598#error python too old
599#endif
600int main(void);
601],
602[
603{
604 Py_Initialize();
605 return 0;
606}
607])], [
0fca9cee
DL
608 # some python installs are missing the zlib dependency...
609 PYTHON_LIBS="${PYTHON_LIBS} -lz"
29ad6f68
DL
610 AC_LINK_IFELSE_FLAGS([$PYTHON_CFLAGS], [$PYTHON_LIBS], [AC_LANG_PROGRAM([
611#include <Python.h>
612#if PY_VERSION_HEX < 0x02070000
613#error python too old
614#endif
615int main(void);
616],
617[
618{
619 Py_Initialize();
620 return 0;
621}
622])], [
0fca9cee
DL
623 m4_if([$1], [], [
624 PYTHONCONFIG=""
625 unset PYTHON_LIBS
626 unset PYTHON_CFLAGS
627 ], [$1])
628 ])
629 ])
630])
631
632AS_IF([test "$host" = "$build"], [
633 PYTHONCONFIG=""
634
635 # ordering:
636 # 1. try python3, but respect the user's preference on which minor ver
637 # 2. try python, which might be py3 or py2 again on the user's preference
638 # 3. try python2 (can really only be 2.7 but eh)
639 # 4. try 3.6 > 3.5 > 3.4 > 3.3 > 3.2 > 2.7 through pkg-config (no user pref)
640 #
641 # (AX_PYTHON_DEVEL has no clue about py3 vs py2)
642 # (AX_PYTHON does not do what we need)
643
644 AC_CHECK_TOOLS([PYTHONCONFIG], [ \
645 python3-config \
646 python-config \
647 python2-config \
648 python3.6-config \
649 python3.5-config \
650 python3.4-config \
651 python3.3-config \
652 python3.2-config \
653 python2.7-config ])
654 if test -n "$PYTHONCONFIG"; then
655 PYTHON_CFLAGS="`\"${PYTHONCONFIG}\" --includes`"
656 PYTHON_LIBS="`\"${PYTHONCONFIG}\" --ldflags`"
657
658 FRR_PYTHON_CHECK_WORKING([])
659 fi
660
661 if test -z "$PYTHONCONFIG"; then
662 PKG_CHECK_MODULES([PYTHON], python-3.6, [], [
663 PKG_CHECK_MODULES([PYTHON], python-3.5, [], [
664 PKG_CHECK_MODULES([PYTHON], python-3.4, [], [
665 PKG_CHECK_MODULES([PYTHON], python-3.3, [], [
666 PKG_CHECK_MODULES([PYTHON], python-3.2, [], [
667 PKG_CHECK_MODULES([PYTHON], python-2.7, [], [
668 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
669 ])])])])])])
670
671
672 FRR_PYTHON_CHECK_WORKING([
29ad6f68
DL
673 AC_MSG_FAILURE([could not find python-config or pkg-config python, please install Python development files from libpython-dev or similar])
674 ])
675 fi
676])
677AC_SUBST(PYTHON_CFLAGS)
678AC_SUBST(PYTHON_LIBS)
679
dad253b4
AS
680#
681# Logic for protobuf support.
682#
683if test "$enable_protobuf" = "yes"; then
2b2f275e
DL
684 # Check for protoc & protoc-c
685
686 # protoc is not required, it's only for a "be nice" helper target
687 AC_CHECK_PROGS([PROTOC], [protoc], [/bin/false])
688
689 AC_CHECK_PROGS([PROTOC_C], [protoc-c], [/bin/false])
690 if test "$PROTOC_C" = "/bin/false"; then
691 AC_MSG_FAILURE([protobuf requested but protoc-c not found. Install protobuf-c.])
692 fi
693
694 PKG_CHECK_MODULES([PROTOBUF_C], [libprotobuf-c >= 0.14],, [
695 AC_MSG_FAILURE([protobuf requested but libprotobuf-c not found. Install protobuf-c.])
696 ])
697 AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h], [], [
698 AC_MSG_FAILURE([protobuf requested but protobuf-c.h not found. Install protobuf-c.])
699 ])
700
701 AC_DEFINE(HAVE_PROTOBUF,, protobuf)
dad253b4 702fi
2b2f275e 703AM_CONDITIONAL([HAVE_PROTOBUF], [test "x$enable_protobuf" = "xyes"])
dad253b4 704
28436d6d
PG
705#
706# Logic for old vpn commans support.
707#
fcc65b0f 708if test "$enable_oldvpn_commands" = "yes"; then
28436d6d
PG
709 AC_DEFINE(KEEP_OLD_VPN_COMMANDS,, [Define for compiling with old vpn commands])
710fi
711
dad253b4
AS
712#
713# End of logic for protobuf support.
714#
715
d2a0ccc6 716AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
717if test "${enable_rtadv}" != "no"; then
71c0fb50 718 AC_MSG_RESULT(yes)
d2a0ccc6 719 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
2487bea1 720else
721 AC_MSG_RESULT(no)
71c0fb50 722fi
7ea487bc 723
0b02a1b4
JAG
724if test x"${enable_user}" = x"no"; then
725 enable_user=""
726else
727 if test x"${enable_user}" = x"yes" || test x"${enable_user}" = x""; then
b2f36157 728 enable_user="frr"
0b02a1b4 729 fi
b2f36157 730 AC_DEFINE_UNQUOTED(FRR_USER, "${enable_user}", frr User)
edd7c245 731fi
edd7c245 732
0b02a1b4
JAG
733if test x"${enable_group}" = x"no"; then
734 enable_group=""
735else
736 if test x"${enable_group}" = x"yes" || test x"${enable_group}" = x""; then
b2f36157 737 enable_group="frr"
0b02a1b4 738 fi
b2f36157 739 AC_DEFINE_UNQUOTED(FRR_GROUP, "${enable_group}", frr Group)
edd7c245 740fi
edd7c245 741
742if test x"${enable_vty_group}" = x"yes" ; then
8d4aee5d 743 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
79cb2169 744elif test x"${enable_vty_group}" != x""; then
8d4aee5d 745 if test x"${enable_vty_group}" != x"no"; then
edd7c245 746 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
747 fi
748fi
26275b05 749AC_SUBST([enable_user])
750AC_SUBST([enable_group])
751AC_SUBST([enable_vty_group])
edd7c245 752
aa593d5e 753enable_configfile_mask=${enable_configfile_mask:-0600}
754AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
755
756enable_logfile_mask=${enable_logfile_mask:-0600}
757AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
758
7a6da5ba 759MPATH_NUM=1
7ea487bc 760
761case "${enable_multipath}" in
7c5d2b76 762 0)
7a6da5ba 763 MPATH_NUM=64
7c5d2b76 764 ;;
90fb3e13 765 [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
7a6da5ba 766 MPATH_NUM="${enable_multipath}"
7ea487bc 767 ;;
768 "")
769 ;;
770 *)
6f0e3f6e 771 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
7ea487bc 772 ;;
773esac
774
7a6da5ba 775AC_DEFINE_UNQUOTED(MULTIPATH_NUM, $MPATH_NUM, Maximum number of paths for a route)
7ea487bc 776
08c369bd
DS
777AC_DEFINE_UNQUOTED(VTYSH_PAGER, "$VTYSH_PAGER", [What pager to use])
778
83284209
AJ
779dnl --------------------
780dnl Enable code coverage
781dnl --------------------
782AM_CONDITIONAL([HAVE_GCOV],[test '!' "$enable_gcov" = no])
783
c737c7ba
AJ
784dnl ------------------------------------
785dnl Alpine only accepts numeric versions
786dnl ------------------------------------
787if test "x${enable_numeric_version}" != "x" ; then
788 VERSION="`echo ${VERSION} | tr -c -d '[[.0-9]]'`"
789 PACKAGE_VERSION="`echo ${PACKAGE_VERSION} | tr -c -d '[[.0-9]]'`"
790fi
791
1080c13f
JN
792dnl -----------------------------------
793dnl Add extra version string to package
794dnl name, string and version fields.
795dnl -----------------------------------
796if test "x${EXTRAVERSION}" != "x" ; then
0be793e6
DL
797 VERSION="${VERSION}${EXTRAVERSION}"
798 PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
3ab11ecc 799 AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
0be793e6 800 PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
1080c13f 801fi
06871ed9 802AC_SUBST(EXTRAVERSION)
1080c13f 803
a16dcf7c
DL
804if test "x$with_pkg_git_version" = "xyes"; then
805 if test -d "${srcdir}/.git"; then
806 AC_DEFINE(GIT_VERSION, [1], [include git version info])
807 else with_pkg_git_version="no"
808 AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
809 fi
810fi
811AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
0be793e6 812
42efb0d4
DL
813AC_CHECK_TOOL([OBJCOPY], [objcopy], [:])
814AC_CACHE_CHECK([for .interp value to use], [frr_cv_interp], [
815 frr_cv_interp=""
816 AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])], [
817 if $OBJCOPY -j.interp -Obinary conftest conftest.interp; then
818 frr_cv_interp="`xargs -0 echo < conftest.interp`"
819 fi
820 test -f conftest.interp && rm conftest.interp
821 ])
822])
823if test -n "$frr_cv_interp"; then
824 AC_DEFINE_UNQUOTED(INTERP, ["$frr_cv_interp"], [.interp value])
825fi
826
6f0e3f6e
PJ
827dnl ------------------------------------
828dnl Check C keywords and standard types
829dnl ------------------------------------
830AC_C_CONST
831AC_C_INLINE
6f0e3f6e 832AC_C_VOLATILE
dc7a2bf1 833AC_HEADER_STDC
6f0e3f6e
PJ
834dnl AC_TYPE_PID_T
835AC_TYPE_UID_T
836AC_TYPE_MODE_T
837AC_TYPE_SIZE_T
6f0e3f6e 838AC_STRUCT_TM
dc7a2bf1 839
6f0e3f6e
PJ
840dnl -------------------------
841dnl Check other header files.
842dnl -------------------------
24f5e2fc
DL
843AC_CHECK_HEADERS([stropts.h sys/ksym.h \
844 linux/version.h asm/types.h \
845 sys/cdefs.h])
6f0e3f6e 846
899a4fd2
DL
847ac_stdatomic_ok=false
848AC_DEFINE(FRR_AUTOCONF_ATOMIC, 1, [did autoconf checks for atomic funcs])
849AC_CHECK_HEADER([stdatomic.h],[
850
851 AC_MSG_CHECKING([whether _Atomic qualifier works])
852 AC_LINK_IFELSE([AC_LANG_SOURCE([[
853#include <stdatomic.h>
854int main(int argc, char **argv) {
855 _Atomic int i = 0;
856 return i;
857}
858]])], [
859 AC_DEFINE(HAVE_STDATOMIC_H, 1, [found stdatomic.h])
860 AC_MSG_RESULT([yes])
861 ac_stdatomic_ok=true
862 ], [
863 AC_MSG_RESULT([no])
864 ])
865])
866
867AS_IF([$ac_stdatomic_ok], [true], [
868 AC_MSG_CHECKING([for __atomic_* builtins])
869 AC_LINK_IFELSE([AC_LANG_SOURCE([[
870int main(int argc, char **argv) {
871 volatile int i = 1;
872 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
873 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
874}
875]])], [
876 AC_DEFINE(HAVE___ATOMIC, 1, [found __atomic builtins])
877 AC_MSG_RESULT([yes])
878 ], [
879 AC_MSG_RESULT([no])
880
881 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
882 AC_MSG_CHECKING([for __sync_* builtins])
883 AC_LINK_IFELSE([AC_LANG_SOURCE([[
884int main(int argc, char **argv) {
885 volatile int i = 1;
886 __sync_fetch_and_sub (&i, 1);
887 return __sync_val_compare_and_swap (&i, 0, 1);
888}
889]])], [
890 AC_DEFINE(HAVE___SYNC, 1, [found __sync builtins])
891 AC_MSG_RESULT([yes])
892
893 AC_MSG_CHECKING([for __sync_swap builtin])
894 AC_LINK_IFELSE([AC_LANG_SOURCE([[
895int main(int argc, char **argv) {
896 volatile int i = 1;
897 return __sync_swap (&i, 2);
898}
899]])], [
900 AC_DEFINE(HAVE___SYNC_SWAP, 1, [found __sync_swap builtin])
901 AC_MSG_RESULT([yes])
902 ], [
903 AC_MSG_RESULT([no])
904 ])
905
906 ], [
907 AC_MSG_RESULT([no])
908 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
909 ])
910 ])
911])
912
324be174
DL
913AC_CHECK_HEADERS([pthread_np.h],,, [
914#include <pthread.h>
915])
e9d938b8 916AC_CHECK_FUNCS([pthread_setname_np pthread_set_name_np])
324be174 917
6f0e3f6e 918dnl Utility macro to avoid retyping includes all the time
8e4da10b 919m4_define([FRR_INCLUDES],
6f0e3f6e 920[#ifdef SUNOS_5
0718b562 921#define _POSIX_C_SOURCE 200809L
6f0e3f6e
PJ
922#define __EXTENSIONS__
923#endif
924#include <stdio.h>
24f5e2fc
DL
925#include <stdlib.h>
926#include <stddef.h>
927#include <sys/types.h>
6f0e3f6e 928/* sys/conf.h depends on param.h on FBSD at least */
24f5e2fc 929#include <sys/param.h>
6f0e3f6e 930/* Required for MAXSIG */
24f5e2fc
DL
931#include <signal.h>
932#include <sys/socket.h>
ea057677
HT
933#ifdef __APPLE__
934# define __APPLE_USE_RFC_3542
935#endif
24f5e2fc
DL
936#include <netinet/in.h>
937#include <sys/time.h>
938#include <time.h>
939#include <net/if.h>
2b43bf23
DO
940])dnl
941
942dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
943dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
944dnl an additional round for it.
945
8e4da10b 946AC_CHECK_HEADERS([net/if_var.h], [], [], FRR_INCLUDES)
2b43bf23 947
8e4da10b
DL
948m4_define([FRR_INCLUDES],
949FRR_INCLUDES
2b43bf23
DO
950[#if HAVE_NET_IF_VAR_H
951# include <net/if_var.h>
952#endif
953])dnl
954
24f5e2fc
DL
955AC_CHECK_HEADERS([netinet/in_var.h \
956 net/if_dl.h net/netopt.h \
957 inet/nd.h netinet/ip_icmp.h \
6f0e3f6e 958 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
8e4da10b 959 [], [], FRR_INCLUDES)
6f0e3f6e
PJ
960
961AC_CHECK_HEADERS([ucontext.h], [], [],
962[#ifndef __USE_GNU
963#define __USE_GNU
964#endif /* __USE_GNU */
8e4da10b 965FRR_INCLUDES
6f0e3f6e
PJ
966])
967
bccbd141
JT
968m4_define([UCONTEXT_INCLUDES],
969[#include <ucontext.h>])dnl
970
971AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
972 [], [], [UCONTEXT_INCLUDES])
973AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
974 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
975 [], [], [UCONTEXT_INCLUDES])],
976 [], [UCONTEXT_INCLUDES])
977AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
978 [], [], [UCONTEXT_INCLUDES])
979
8e4da10b
DL
980m4_define([FRR_INCLUDES],
981FRR_INCLUDES
24f5e2fc
DL
982[
983#include <sys/un.h>
984#include <netinet/in_systm.h>
6f0e3f6e
PJ
985#if HAVE_NETINET_IN_VAR_H
986# include <netinet/in_var.h>
987#endif
988#if HAVE_NET_IF_DL_H
989# include <net/if_dl.h>
990#endif
6f0e3f6e
PJ
991#if HAVE_NET_NETOPT_H
992# include <net/netopt.h>
993#endif
24f5e2fc 994#include <net/route.h>
6f0e3f6e
PJ
995#if HAVE_INET_ND_H
996# include <inet/nd.h>
997#endif
24f5e2fc 998#include <arpa/inet.h>
11770e10
PJ
999/* Required for IDRP */
1000#if HAVE_NETINET_IP_ICMP_H
1001# include <netinet/ip_icmp.h>
1002#endif
6f0e3f6e 1003])dnl
dc7a2bf1 1004
fa3232e1 1005dnl V6 headers are checked below, after we check for v6
7ea487bc 1006
ddfeb486
DL
1007AC_MSG_CHECKING([which operating system interface to use])
1008case "$host_os" in
1009 sunos* | solaris2*)
1010 AC_MSG_RESULT([Solaris])
1011
1012 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
1013 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
0718b562 1014 AC_DEFINE(_POSIX_C_SOURCE, 200809L, [enable POSIX.1-2008 and XPG7/SUSv4])
ddfeb486
DL
1015
1016 AC_CHECK_LIB(socket, main)
1017 AC_CHECK_LIB(nsl, main)
1018 AC_CHECK_LIB(umem, main)
ddfeb486
DL
1019 SOLARIS="solaris"
1020 ;;
1021 linux*)
1022 AC_MSG_RESULT([Linux])
1023
1024 AC_DEFINE(GNU_LINUX,,GNU Linux)
1025 AC_DEFINE(HAVE_NETLINK,,netlink)
1026 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
1027
1028 dnl Linux has a compilation problem with mixing
1029 dnl netinet/in.h and linux/in6.h they are not
1030 dnl compatible. There has been discussion on
1031 dnl how to fix it but no real progress on implementation
1032 dnl when they fix it, remove this
1033 AC_DEFINE(IPV6_MINHOPCOUNT, 73, Linux ipv6 Min Hop Count)
ddfeb486
DL
1034 ;;
1035 openbsd*)
1036 AC_MSG_RESULT([OpenBSD])
1037
1038 AC_DEFINE(OPEN_BSD,,OpenBSD)
1039 AC_DEFINE(KAME,1,KAME IPv6)
d616d639 1040 AC_DEFINE(BSD_V6_SYSCTL,1,BSD v6 sysctl to turn on and off forwarding)
004174c7
JAG
1041
1042 if test "x${enable_pimd}" != "xno"; then
1043 case "$host_os" in
1044 openbsd6.0)
1045 ;;
1046 openbsd[6-9]*)
1047 AC_MSG_FAILURE([pimd cannot be enabled as PIM support has been removed from OpenBSD 6.1])
1048 ;;
1049 esac
1050 fi
ddfeb486
DL
1051 ;;
1052 *)
1053 AC_MSG_RESULT([BSD])
1054
1055 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
1056 AC_DEFINE(KAME,1,KAME IPv6)
d616d639 1057 AC_DEFINE(BSD_V6_SYSCTL,1,BSD v6 sysctl to turn on and off forwarding)
ddfeb486 1058 ;;
7ea487bc 1059esac
0fb07d51 1060AM_CONDITIONAL(SOLARIS, test "${SOLARIS}" = "solaris")
7ea487bc 1061
62c9f504
PJ
1062AC_SYS_LARGEFILE
1063
4e40b6d6
KK
1064dnl ------------------------
1065dnl Integrated REALMS option
1066dnl ------------------------
1067if test "${enable_realms}" = "yes"; then
1068 case "$host_os" in
1069 linux*)
1070 AC_DEFINE(SUPPORT_REALMS,, Realms support)
1071 ;;
1072 *)
1073 echo "Sorry, only Linux has REALMS support"
1074 exit 1
1075 ;;
1076 esac
1077fi
1078AM_CONDITIONAL([SUPPORT_REALMS], [test "${enable_realms}" = "yes"])
1079
7ea487bc 1080dnl ---------------------
1081dnl Integrated VTY option
1082dnl ---------------------
1083case "${enable_vtysh}" in
64537bc4
DL
1084"no")
1085 VTYSH="";;
1086*)
1087 VTYSH="vtysh";
1088 AC_DEFINE(VTYSH,,VTY shell)
1089
1090 prev_libs="$LIBS"
1091 AC_CHECK_LIB(readline, main, [
1092 LIBREADLINE="-lreadline"
1093 ], [
1094 dnl readline failed - it might be incorrectly linked and missing its
1095 dnl termcap/tinfo/curses dependency. see if we can fix that...
1096 AC_SEARCH_LIBS(tputs, [termcap tinfo curses ncurses], [
1097 LIBREADLINE="$ac_cv_search_tputs"
1098 ], [
1099 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1100 ])
1101
1102 dnl re-try with the lib we found above
1103 unset ac_cv_lib_readline_main
1104 AC_CHECK_LIB(readline, main, [
1105 LIBREADLINE="-lreadline $LIBREADLINE"
1106 ], [
1107 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1108 ], [$LIBREADLINE])
1109 ], [])
1110 LIBS="$prev_libs"
1111
1112 AC_CHECK_HEADER(readline/history.h)
1113 if test $ac_cv_header_readline_history_h = no;then
1114 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
1115 fi
1116 AC_CHECK_LIB(readline, rl_completion_matches, [true], [], [$LIBREADLINE])
1117 if test $ac_cv_lib_readline_rl_completion_matches = no; then
1118 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
1119 fi
1120 AC_CHECK_LIB(readline, [append_history], [frr_cv_append_history=yes], [frr_cv_append_history=no], [$LIBREADLINE])
1121 if test "$frr_cv_append_history" = yes; then
1122 AC_DEFINE(HAVE_APPEND_HISTORY, 1, [Have history.h append_history])
1123 fi
1124 ;;
7ea487bc 1125esac
c0689394 1126AC_SUBST(LIBREADLINE)
f027d331 1127AM_CONDITIONAL(VTYSH, test "x$VTYSH" = "xvtysh")
7ea487bc 1128
1129dnl ----------
1130dnl PAM module
6159928d 1131dnl
1689cf7e 1132dnl FRR detects the PAM library it is built against by checking for a
6159928d
DO
1133dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
1134dnl is known to #include pam_appl.h, the standard header of a PAM library, and
1135dnl openpam.h doesn't do that, although depends on the header too. Hence a
1136dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
1137dnl of OpenPAM.
7ea487bc 1138dnl ----------
24cd435b 1139if test "$with_libpam" = "yes"; then
6f0e3f6e
PJ
1140 AC_CHECK_HEADER([security/pam_misc.h],
1141 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
1142 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
1143 pam_conv_func="misc_conv"
1144 ],
8e4da10b 1145 [], FRR_INCLUDES)
6f0e3f6e
PJ
1146 AC_CHECK_HEADER([security/openpam.h],
1147 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
1148 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
1149 pam_conv_func="openpam_ttyconv"
1150 ],
8e4da10b 1151 [], FRR_INCLUDES[#include <security/pam_appl.h>])
24cd435b 1152 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
1153 AC_MSG_WARN([*** pam support will not be built ***])
1154 with_libpam="no"
1155 fi
1156fi
1157
7ea487bc 1158if test "$with_libpam" = "yes"; then
6f0e3f6e 1159dnl took this test from proftpds configure.in and suited to our needs
7ea487bc 1160dnl -------------------------------------------------------------------------
1161dnl
1162dnl This next check looks funky due to a linker problem with some versions
1163dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
1164dnl omitted requiring libdl linking information. PAM-0.72 or better ships
1165dnl with RedHat 6.2 and Debian 2.2 or better.
1166AC_CHECK_LIB(pam, pam_start,
24cd435b 1167 [AC_CHECK_LIB(pam, $pam_conv_func,
7ea487bc 1168 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1169 LIBPAM="-lpam"],
1170 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
1171 LIBPAM="-lpam -lpam_misc"]
1172 )
1173 ],
1174
1175 [AC_CHECK_LIB(pam, pam_end,
24cd435b 1176 [AC_CHECK_LIB(pam, $pam_conv_func,
a159ed93 1177 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
7ea487bc 1178 LIBPAM="-lpam -ldl"],
a159ed93 1179 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
7ea487bc 1180 LIBPAM="-lpam -ldl -lpam_misc"]
1181 )
1182 ],AC_MSG_WARN([*** pam support will not be built ***]),
1183 [-ldl])
1184 ]
1185)
1186fi
1187AC_SUBST(LIBPAM)
1188
1189dnl -------------------------------
1190dnl Endian-ness check
1191dnl -------------------------------
1192AC_WORDS_BIGENDIAN
1193
1194dnl -------------------------------
1195dnl check the size in byte of the C
1196dnl -------------------------------
1197dnl AC_CHECK_SIZEOF(char)
1198dnl AC_CHECK_SIZEOF(int)
1199dnl AC_CHECK_SIZEOF(short)
1200dnl AC_CHECK_SIZEOF(long)
1201
1202dnl ----------------------------
1203dnl check existance of functions
1204dnl ----------------------------
6f0e3f6e
PJ
1205AC_FUNC_FNMATCH
1206AC_FUNC_FORK
6f0e3f6e 1207AC_FUNC_MKTIME
6f0e3f6e 1208AC_FUNC_STAT
6f0e3f6e
PJ
1209
1210dnl -------------------------------
1211dnl bgpd needs pow() and hence libm
1212dnl -------------------------------
1213TMPLIBS="$LIBS"
1214AC_CHECK_HEADER([math.h],
1215 [AC_CHECK_LIB([m], [pow],
1216 [LIBM="-lm"
1217 LIBS="$LIBS $LIBM"
6f0e3f6e
PJ
1218 AC_CHECK_FUNCS(pow,[],[LIBM=""])
1219 ])
1220])
1221if test x"$LIBM" = x ; then
1222 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1223fi
1224LIBS="$TMPLIBS"
634949ae 1225
6f0e3f6e
PJ
1226AC_SUBST(LIBM)
1227
154b9e8f
DL
1228AC_CHECK_FUNCS([ppoll], [
1229 AC_DEFINE([HAVE_PPOLL], 1, [have Linux/BSD ppoll()])
1230])
1231AC_CHECK_FUNCS([pollts], [
1232 AC_DEFINE([HAVE_POLLTS], 1, [have NetBSD pollts()])
1233])
1234
6f0e3f6e
PJ
1235dnl ---------------
1236dnl other functions
1237dnl ---------------
24f5e2fc
DL
1238AC_CHECK_FUNCS([ \
1239 strlcat strlcpy \
316d0ae5 1240 getgrouplist])
6f0e3f6e 1241
13460c44
FL
1242AC_CHECK_HEADER([asm-generic/unistd.h],
1243 [AC_CHECK_DECL(__NR_setns,
1244 AC_DEFINE(HAVE_NETNS,, Have netns),,
8e4da10b 1245 FRR_INCLUDES [#include <asm-generic/unistd.h>
13460c44 1246 ])
428cd73f 1247 AC_CHECK_FUNCS(setns)]
13460c44
FL
1248 )
1249
238497fc
PJ
1250dnl --------------------------
1251dnl Determine IS-IS I/O method
1252dnl --------------------------
745bf05f
DL
1253AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
1254AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
1255AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
238497fc
PJ
1256AC_CHECK_HEADER(net/bpf.h)
1257AC_CHECK_HEADER(sys/dlpi.h)
1258AC_MSG_CHECKING(zebra IS-IS I/O method)
ddfeb486
DL
1259
1260case "$host_os" in
1261 linux*)
1262 AC_MSG_RESULT(pfpacket)
1263 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1264 ;;
1265 solaris* | sunos*)
1266 AC_MSG_RESULT(DLPI)
1267 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1268 ;;
1269 *)
1270 if test $ac_cv_header_net_bpf_h = no; then
1271 if test $ac_cv_header_sys_dlpi_h = no; then
1272 AC_MSG_RESULT(none)
7c0cbd0e 1273 if test "${enable_isisd}" = yes -o "${enable_fabricd}" = yes; then
86e463cf
DL
1274 AC_MSG_FAILURE([IS-IS support requested but no packet backend found])
1275 fi
ddfeb486 1276 AC_MSG_WARN([*** IS-IS support will not be built ***])
86e463cf 1277 enable_isisd="no"
7c0cbd0e 1278 enable_fabricd="no"
ddfeb486
DL
1279 else
1280 AC_MSG_RESULT(DLPI)
1281 fi
1282 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
238497fc 1283 else
ddfeb486
DL
1284 AC_MSG_RESULT(BPF)
1285 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
238497fc 1286 fi
ddfeb486
DL
1287 ;;
1288esac
745bf05f 1289AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
238497fc 1290
42c98199 1291dnl ---------------------------------------------------------------
1292dnl figure out how to specify an interface in multicast sockets API
1293dnl ---------------------------------------------------------------
8e4da10b 1294AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
42c98199 1295
b3f2bf7c 1296AC_CHECK_HEADERS([linux/mroute.h], [], [],[
24f5e2fc
DL
1297 #include <sys/socket.h>
1298 #include <netinet/in.h>
b3f2bf7c
RW
1299 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1300 #include <linux/types.h>
1301])
1302
8e4da10b
DL
1303m4_define([FRR_INCLUDES],
1304FRR_INCLUDES
b3f2bf7c
RW
1305[#if HAVE_LINUX_MROUTE_H
1306# include <linux/mroute.h>
1307#endif
1308])dnl
1309
1310AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
24f5e2fc
DL
1311 #include <sys/socket.h>
1312 #include <sys/types.h>
1313 #include <netinet/in.h>
1314 #include <net/route.h>
b3f2bf7c
RW
1315])
1316
8e4da10b
DL
1317m4_define([FRR_INCLUDES],
1318FRR_INCLUDES
b3f2bf7c
RW
1319[#if HAVE_NETINET_IP_MROUTE_H
1320# include <netinet/ip_mroute.h>
1321#endif
1322])dnl
1323
42c98199 1324AC_MSG_CHECKING([for BSD struct ip_mreq hack])
24f5e2fc
DL
1325AC_TRY_COMPILE([#include <sys/param.h>],
1326[#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 1327 return (0);
1328#else
1329 #error No support for BSD struct ip_mreq hack detected
1330#endif],[AC_MSG_RESULT(yes)
1331AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
1332AC_MSG_RESULT(no))
1333
10d04cdb
DT
1334AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1335AC_TRY_COMPILE([
1336#include <sys/types.h>
1337#include <netinet/in.h>
1338], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1339], [AC_MSG_RESULT(yes)
1340AC_DEFINE(HAVE_RFC3678,1,[Have RFC3678 protocol-independed API])],
1341AC_MSG_RESULT(no))
1342
c543a173
AS
1343dnl ---------------------------------------------------------------
1344dnl figure out how to check link-state
1345dnl ---------------------------------------------------------------
24f5e2fc
DL
1346AC_CHECK_HEADER( [net/if_media.h],
1347 [m4_define([LINK_DETECT_INCLUDES],
8e4da10b 1348 FRR_INCLUDES
24f5e2fc
DL
1349 [#include <net/if_media.h>
1350 ])
1351 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
1352 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
1353 [], LINK_DETECT_INCLUDES)],
1354 [],
8e4da10b 1355 FRR_INCLUDES)
c543a173 1356
9234b382
DV
1357dnl ---------------------------------------------------------------
1358dnl Additional, newer way to check link-state using ifi_link_state.
1359dnl Not available in all BSD's when ifmediareq available
1360dnl ---------------------------------------------------------------
24f5e2fc
DL
1361AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1362 AC_DEFINE(HAVE_BSD_IFI_LINK_STATE,,[BSD ifi_link_state available]),
8e4da10b 1363 [], FRR_INCLUDES)
9234b382 1364
0df7c91f
PJ
1365dnl ------------------------
1366dnl TCP_MD5SIG socket option
1367dnl ------------------------
1368
1369AC_CHECK_HEADER([netinet/tcp.h],
1370 [m4_define([MD5_INCLUDES],
8e4da10b 1371 FRR_INCLUDES
0df7c91f
PJ
1372 [#include <netinet/tcp.h>
1373 ])
1374 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1375 [],
8e4da10b 1376 FRR_INCLUDES)
0df7c91f
PJ
1377if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1378 AC_CHECK_HEADER([linux/tcp.h],
1379 [m4_define([MD5_INCLUDES],
8e4da10b 1380 FRR_INCLUDES
0df7c91f
PJ
1381 [#include <linux/tcp.h>
1382 ])
1383 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1384fi
1385
60060acc
RW
1386dnl ----------------------------------------------------------------------------
1387dnl figure out if domainname is available in the utsname struct (GNU extension).
1388dnl ----------------------------------------------------------------------------
1389AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1390
fa3232e1 1391dnl ------------------
1392dnl IPv6 header checks
1393dnl ------------------
24f5e2fc 1394AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
6f0e3f6e 1395 netinet6/in6_var.h netinet6/nd6.h], [], [],
8e4da10b 1396 FRR_INCLUDES)
fa3232e1 1397
8e4da10b
DL
1398m4_define([FRR_INCLUDES],dnl
1399FRR_INCLUDES
6f0e3f6e
PJ
1400[#if HAVE_NETINET6_IN6_H
1401#include <netinet6/in6.h>
1402#endif
1403#if HAVE_NETINET_IN6_VAR_H
1404#include <netinet/in6_var.h>
1405#endif
24f5e2fc 1406#include <netinet/icmp6.h>
6f0e3f6e
PJ
1407#if HAVE_NETINET6_IN6_VAR_H
1408# include <netinet6/in6_var.h>
1409#endif
1410#if HAVE_NETINET6_ND6_H
fbf24544 1411# include <netinet6/nd6.h>
6f0e3f6e
PJ
1412#endif
1413])dnl
1414
cbcd9bfc 1415dnl disable doc check
f4f2f2cc
DL
1416AC_CHECK_PROGS([SPHINXBUILD], [sphinx-build sphinx-build3 sphinx-build2], [/bin/false])
1417if test "$SPHINXBUILD" = "/bin/false"; then
1418 if test "${enable_doc}" = "yes"; then
1419 AC_MSG_ERROR([Documentation was explicitly requested with --enable-doc but sphinx-build is not available. Please disable docs or install sphinx.])
1420 fi
1421fi
1422AM_CONDITIONAL(DOC, test "${enable_doc}" != "no" -a "$SPHINXBUILD" != "/bin/false")
50dc6dbd 1423AM_CONDITIONAL(DOC_HTML, test "${enable_doc_html}" = "yes")
cbcd9bfc 1424
7ea487bc 1425dnl --------------------
1426dnl Daemon disable check
1427dnl --------------------
64d44794 1428AM_CONDITIONAL(ZEBRA, test "${enable_zebra}" != "no")
7ea487bc 1429
1430if test "${enable_bgpd}" = "no";then
1431 BGPD=""
1432else
1433 BGPD="bgpd"
1434fi
f027d331 1435AM_CONDITIONAL(BGPD, test "x$BGPD" = "xbgpd")
7ea487bc 1436
7f269117 1437AM_CONDITIONAL(RIPD, test "${enable_ripd}" != "no")
afca0690 1438AM_CONDITIONAL(OSPFD, test "${enable_ospfd}" != "no")
30237d29 1439AM_CONDITIONAL(LDPD, test "${enable_ldpd}" != "no")
7ea487bc 1440
30237d29 1441AS_IF([test "${enable_ldpd}" != "no"], [
87ab4aec 1442 AC_DEFINE(HAVE_LDPD, 1, ldpd)
30237d29 1443])
eac6e3f0 1444
7134904b
RZ
1445if test "$enable_bfdd" = "no"; then
1446 AC_DEFINE(HAVE_BFDD, 0, bfdd)
1447 BFDD=""
1448else
1449 AC_DEFINE(HAVE_BFDD, 1, bfdd)
1450 BFDD="bfdd"
1451
1452 case $host_os in
1453 linux*)
1454 AC_DEFINE(BFD_LINUX, 1, bfdd)
1455 ;;
1456
1457 *)
1458 AC_DEFINE(BFD_BSD, 1, bfdd)
1459 ;;
1460 esac
1461fi
1462
1463AM_CONDITIONAL(BFDD, [test "x$BFDD" = "xbfdd"])
1464
39d3cc4e 1465if test "$ac_cv_lib_json_c_json_object_get" = no -a "x$BFDD" = "xbfdd"; then
7134904b
RZ
1466 AC_MSG_ERROR(["you must use json-c library to use bfdd"])
1467fi
1468
42350cfc 1469NHRPD=""
ddfeb486
DL
1470case "$host_os" in
1471 linux*)
1472 if test "${enable_nhrpd}" != "no"; then
1473 NHRPD="nhrpd"
1474 fi
1475 ;;
1476 *)
1477 if test "${enable_nhrpd}" = "yes"; then
1478 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1479 fi
1480 ;;
1481esac
2fb975da
TT
1482AM_CONDITIONAL(NHRPD, test "x$NHRPD" = "xnhrpd")
1483
b6f5781c 1484AM_CONDITIONAL(EIGRPD, test "${enable_eigrpd}" != "no")
7f57883e 1485
9473e340
DS
1486if test "${enable_watchfrr}" = "no";then
1487 WATCHFRR=""
d0199430 1488else
9473e340 1489 WATCHFRR="watchfrr"
d0199430 1490fi
9473e340 1491AM_CONDITIONAL(WATCHFRR, test "x$WATCHFRR" = "xwatchfrr")
d0199430 1492
1ef74ef7 1493OSPFCLIENT=""
cd66cd4c 1494if test "${enable_ospfapi}" != "no";then
9a569848 1495 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1ef74ef7 1496
cd66cd4c 1497 if test "${enable_ospfclient}" != "no";then
1ef74ef7 1498 OSPFCLIENT="ospfclient"
1ef74ef7 1499 fi
7ea487bc 1500fi
cd66cd4c 1501
f027d331 1502AM_CONDITIONAL(OSPFCLIENT, test "x$OSPFCLIENT" = "xospfclient")
7f269117 1503AM_CONDITIONAL(RIPNGD, test "${enable_ripngd}" != "no")
b6f5781c 1504AM_CONDITIONAL(BABELD, test "${enable_babeld}" != "no")
afca0690 1505AM_CONDITIONAL(OSPF6D, test "${enable_ospf6d}" != "no")
86e463cf 1506AM_CONDITIONAL(ISISD, test "${enable_isisd}" != "no")
35a3c3c1 1507AM_CONDITIONAL(PIMD, test "${enable_pimd}" != "no")
e5c83d9b 1508AM_CONDITIONAL(PBRD, test "${enable_pbrd}" != "no")
2222a716 1509AM_CONDITIONAL(SHARPD, test "${enable_sharpd}" = "yes")
7e24fdf3 1510AM_CONDITIONAL(STATICD, test "${enable_staticd}" != "no")
7c0cbd0e 1511AM_CONDITIONAL(FABRICD, test "${enable_fabricd}" != "no")
12e41d03 1512
7ea487bc 1513if test "${enable_bgp_announce}" = "no";then
750e8146
PJ
1514 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1515else
1516 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
7ea487bc 1517fi
1518
f95f2ad9 1519if test "${enable_bgp_vnc}" != "no";then
65efcfce 1520 AC_DEFINE(ENABLE_BGP_VNC,1,Enable BGP VNC support)
65efcfce 1521fi
f95f2ad9 1522AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
65efcfce 1523
97cee877 1524AC_SUBST(SOLARIS)
f9e75524
JAG
1525AC_CHECK_LIB(crypt, crypt, [],
1526 [AC_CHECK_LIB(crypto, DES_crypt)])
7ea487bc 1527AC_CHECK_LIB(resolv, res_init)
7ea487bc 1528
25f45887
JJ
1529dnl ---------------------------
1530dnl check system has PCRE regexp
1531dnl ---------------------------
1532if test "x$enable_pcreposix" = "xyes"; then
ad9a0825
DL
1533 AC_CHECK_LIB(pcreposix, regexec, [], [
1534 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1535 ])
25f45887 1536fi
25f45887 1537AC_SUBST(HAVE_LIBPCREPOSIX)
7ea487bc 1538
2fb975da
TT
1539dnl ------------------
1540dnl check C-Ares library
1541dnl ------------------
42350cfc 1542if test "${NHRPD}" != ""; then
92e50261
DL
1543 PKG_CHECK_MODULES([CARES], [libcares], , [
1544 AC_MSG_ERROR([trying to build nhrpd, but libcares not found. install c-ares and its -dev headers.])
1545 ])
2fb975da
TT
1546fi
1547
1548
7ea487bc 1549dnl ------------------
b1fc9acb 1550dnl check Net-SNMP library
7ea487bc 1551dnl ------------------
53b99735 1552if test "${enable_snmp}" != "" -a "${enable_snmp}" != "no"; then
08d7f653
VB
1553 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1554 if test x"$NETSNMP_CONFIG" = x"no"; then
1555 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1556 fi
46081234
DL
1557 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1558 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
e5563f87
DL
1559 # net-snmp lists all of its own dependencies. we absolutely do not want that
1560 # among other things we avoid a GPL vs. OpenSSL license conflict here
1561 for removelib in crypto ssl sensors pci wrap; do
1562 SNMP_LIBS="`echo $SNMP_LIBS | sed -e 's/\(^\|\s\)-l'$removelib'\b/ /g' -e 's/\(^\|\s\)\([^\s]*\/\)\?lib'$removelib'\.[^\s]\+\b/ /g'`"
1563 done
08d7f653 1564 AC_MSG_CHECKING([whether we can link to Net-SNMP])
92e50261 1565 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
08d7f653
VB
1566int main(void);
1567],
1568[
1569{
1570 return 0;
1571}
92e50261 1572])], [
08d7f653 1573 AC_MSG_ERROR([--enable-snmp given but not usable])])
d6be5fb9
VB
1574 case "${enable_snmp}" in
1575 yes)
1576 SNMP_METHOD=agentx
1577 ;;
807ed4e9 1578 agentx)
d6be5fb9
VB
1579 SNMP_METHOD="${enable_snmp}"
1580 ;;
1581 *)
807ed4e9 1582 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use yes or agentx])
d6be5fb9
VB
1583 ;;
1584 esac
d6be5fb9
VB
1585 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1586 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,SNMP method to interface with snmpd)
6cf9df08 1587fi
46081234
DL
1588AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
1589AC_SUBST(SNMP_LIBS)
1590AC_SUBST(SNMP_CFLAGS)
6cf9df08 1591
1c2facd1
RW
1592dnl ---------------
1593dnl libyang
1594dnl ---------------
1595PKG_CHECK_MODULES(libyang, [libyang >= 0.16.7], , [
1596 AC_MSG_ERROR([libyang (>= 0.16.7) was not found on your system.])
1597])
397b1dff
CF
1598AC_CHECK_MEMBER([struct lyd_node.priv], [], [
1599 AC_MSG_ERROR([m4_normalize([
1600 libyang needs to be compiled with ENABLE_LYD_PRIV=ON.
1601 See http://docs.frrouting.org/projects/dev-guide/en/latest/building-libyang.html for details.])
1602 ])
1603], [[#include <libyang/libyang.h>]])
1c2facd1
RW
1604
1605dnl ---------------
1606dnl configuration rollbacks
1607dnl ---------------
1608SQLITE3=false
1609if test "$enable_config_rollbacks" = "yes"; then
1610 PKG_CHECK_MODULES(sqlite3,[sqlite3], [
1611 AC_DEFINE(HAVE_CONFIG_ROLLBACKS,1,Enable configuration rollbacks)
1612 AC_DEFINE(HAVE_SQLITE3,1,Enable sqlite3 database)
1613 SQLITE3=true
1614 ], [
1615 AC_MSG_ERROR([--enable-config-rollbacks given but sqlite3 was not found on your system.])
1616 ])
1617fi
1618AM_CONDITIONAL(SQLITE3, $SQLITE3)
1619
5bce33b3
RW
1620dnl ---------------
1621dnl confd
1622dnl ---------------
1623if test "$enable_confd" != "" -a "$enable_confd" != "no"; then
1624 AC_CHECK_PROG([CONFD], [confd], [confd], [/bin/false])
1625 if test "x$CONFD" = "x/bin/false"; then
1626 AC_MSG_ERROR([confd was not found on your system.])]
1627 fi
1628 CONFD_CFLAGS="-I${enable_confd}/include -L${enable_confd}/lib"
1629 AC_SUBST(CONFD_CFLAGS)
1630 AC_DEFINE(HAVE_CONFD,1,Enable confd integration)
1631fi
1632AM_CONDITIONAL([CONFD], [test "x$enable_confd" != "x"])
1633
a7ca2199
RW
1634dnl ---------------
1635dnl sysrepo
1636dnl ---------------
1637if test "$enable_sysrepo" = "yes"; then
1638 PKG_CHECK_MODULES(sysrepo,[libsysrepo],
1639 [AC_DEFINE(HAVE_SYSREPO,1,Enable sysrepo integration)
1640 SYSREPO=true],
1641 [SYSREPO=false
1642 AC_MSG_ERROR([sysrepo was not found on your system.])]
1643 )
1644fi
1645AM_CONDITIONAL([SYSREPO], [test "x$enable_sysrepo" = "xyes"])
1646
4db0cff1
QY
1647dnl ---------------
1648dnl math
1649dnl ---------------
1650AC_SEARCH_LIBS([sqrt], [m])
1651
b249c083
DL
1652dnl ---------------
1653dnl dlopen & dlinfo
1654dnl ---------------
30771d65
DL
1655AC_SEARCH_LIBS(dlopen, [dl dld], [], [
1656 AC_MSG_ERROR([unable to find the dlopen()])
1657])
1658
b249c083
DL
1659AC_CHECK_HEADERS([link.h])
1660
2a636b43
DL
1661AC_CACHE_CHECK([for dlinfo(RTLD_DI_ORIGIN)], [frr_cv_rtld_di_origin], [
1662 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
b249c083
DL
1663#include <stdlib.h>
1664#ifdef HAVE_LINK_H
1665#include <link.h>
1666#endif
1667#include <dlfcn.h>
1668]], [[
1669 char origin[1];
1670 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1671]])], [
2a636b43
DL
1672 frr_cv_rtld_di_origin=yes
1673 ], [
1674 frr_cv_rtld_di_origin=no
1675 ])
b249c083 1676])
2a636b43
DL
1677if test "$frr_cv_rtld_di_origin" = yes; then
1678 AC_DEFINE(HAVE_DLINFO_ORIGIN, 1, [Have dlinfo RTLD_DI_ORIGIN])
1679fi
b249c083 1680
2a636b43
DL
1681AC_CACHE_CHECK([for dlinfo(RTLD_DI_LINKMAP)], [frr_cv_rtld_di_linkmap], [
1682 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
b249c083
DL
1683#include <stdlib.h>
1684#ifdef HAVE_LINK_H
1685#include <link.h>
1686#endif
1687#include <dlfcn.h>
1688]], [[
1689 struct link_map *lm = NULL;
1690 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1691]])], [
2a636b43
DL
1692 frr_cv_rtld_di_linkmap=yes
1693 ], [
1694 frr_cv_rtld_di_linkmap=no
1695 ])
b249c083 1696])
2a636b43
DL
1697if test "$frr_cv_rtld_di_linkmap" = yes; then
1698 AC_DEFINE(HAVE_DLINFO_LINKMAP, 1, [Have dlinfo RTLD_DI_LINKMAP])
1699fi
6cf9df08 1700
62ff928b
DS
1701AM_CONDITIONAL(SNMP, test "x$SNMP_METHOD" = "xagentx")
1702
7ea487bc 1703dnl ---------------------------
6f0e3f6e 1704dnl sockaddr and netinet checks
7ea487bc 1705dnl ---------------------------
24f5e2fc
DL
1706AC_CHECK_TYPES([
1707 struct sockaddr_dl,
1708 struct vifctl, struct mfcctl, struct sioc_sg_req,
12e41d03 1709 vifi_t, struct sioc_vif_req, struct igmpmsg,
6f0e3f6e
PJ
1710 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1711 struct nd_opt_adv_interval, struct rt_addrinfo,
11770e10 1712 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
8e4da10b 1713 [], [], FRR_INCLUDES)
6f0e3f6e
PJ
1714
1715AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1716 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
ca3ccd87 1717 struct sockaddr_dl.sdl_len,
6f0e3f6e
PJ
1718 struct if6_aliasreq.ifra_lifetime,
1719 struct nd_opt_adv_interval.nd_opt_ai_type],
8e4da10b 1720 [], [], FRR_INCLUDES)
29c4c9bd 1721
6f0e3f6e 1722dnl ---------------------------
11770e10 1723dnl IRDP/pktinfo/icmphdr checks
6f0e3f6e 1724dnl ---------------------------
8dc1f7fc
DL
1725
1726AC_CHECK_TYPES([struct in_pktinfo], [
1727 AC_CHECK_TYPES([struct icmphdr], [
1728 IRDP=true
1729 ], [
1730 IRDP=false
1731 ], [FRR_INCLUDES])
1732], [
1733 IRDP=false
1734], [FRR_INCLUDES])
1735
1736case "${enable_irdp}" in
1737yes)
1738 $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1739 ;;
1740no)
1741 IRDP=false
1742 ;;
1743esac
1744
1745AM_CONDITIONAL(IRDP, $IRDP)
29c4c9bd 1746
12e41d03
DL
1747dnl -----------------------
1748dnl checking for IP_PKTINFO
1749dnl -----------------------
1750AC_MSG_CHECKING(for IP_PKTINFO)
1751AC_TRY_COMPILE([#include <netdb.h>], [
1752 int opt = IP_PKTINFO;
1753], [
1754 AC_MSG_RESULT(yes)
1755 AC_DEFINE(HAVE_IP_PKTINFO, 1, [Have IP_PKTINFO])
1756], [
1757 AC_MSG_RESULT(no)
1758])
1759
1760dnl ---------------------------
1761dnl checking for IP_RECVDSTADDR
1762dnl ---------------------------
1763AC_MSG_CHECKING(for IP_RECVDSTADDR)
1764AC_TRY_COMPILE([#include <netinet/in.h>], [
1765 int opt = IP_RECVDSTADDR;
1766], [
1767 AC_MSG_RESULT(yes)
1768 AC_DEFINE(HAVE_IP_RECVDSTADDR, 1, [Have IP_RECVDSTADDR])
1769], [
1770 AC_MSG_RESULT(no)
1771])
1772
1773dnl ----------------------
1774dnl checking for IP_RECVIF
1775dnl ----------------------
1776AC_MSG_CHECKING(for IP_RECVIF)
1777AC_TRY_COMPILE([#include <netinet/in.h>], [
1778 int opt = IP_RECVIF;
1779], [
1780 AC_MSG_RESULT(yes)
1781 AC_DEFINE(HAVE_IP_RECVIF, 1, [Have IP_RECVIF])
1782], [
1783 AC_MSG_RESULT(no)
1784])
1785
eac6e3f0
RW
1786dnl ----------------------
1787dnl checking for SO_BINDANY
1788dnl ----------------------
1789AC_MSG_CHECKING(for SO_BINDANY)
1790AC_TRY_COMPILE([#include <sys/socket.h>], [
1791 int opt = SO_BINDANY;
1792], [
1793 AC_MSG_RESULT(yes)
1794 AC_DEFINE(HAVE_SO_BINDANY, 1, [Have SO_BINDANY])
1795], [
1796 AC_MSG_RESULT(no)
1797])
1798
1799dnl ----------------------
1800dnl checking for IP_FREEBIND
1801dnl ----------------------
1802AC_MSG_CHECKING(for IP_FREEBIND)
1803AC_TRY_COMPILE([#include <netinet/in.h>], [
1804 int opt = IP_FREEBIND;
1805], [
1806 AC_MSG_RESULT(yes)
1807 AC_DEFINE(HAVE_IP_FREEBIND, 1, [Have IP_FREEBIND])
1808], [
1809 AC_MSG_RESULT(no)
1810])
1811
ba0cb3fe
DS
1812dnl --------------------------------------
1813dnl checking for be32dec existence or not
1814dnl --------------------------------------
1815AC_CHECK_DECLS([be32enc, be32dec], [], [],
1816 [#include <sys/endian.h>])
1817
c4376c9d
SH
1818dnl --------------------------------------
1819dnl checking for clock_time monotonic struct and call
1820dnl --------------------------------------
6511cab2
PJ
1821AC_CHECK_DECL(CLOCK_MONOTONIC,
1822 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
9964fcfc 1823 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
8e4da10b 1824], [AC_MSG_RESULT(no)], [FRR_INCLUDES])
c4376c9d 1825
bbf5ffa0
QY
1826dnl --------------------------------------
1827dnl checking for flex and bison
1828dnl --------------------------------------
4a06690f 1829
bbf5ffa0 1830AM_PROG_LEX
4a06690f 1831AC_MSG_CHECKING(version of flex)
1689cf7e
JAG
1832frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1833frr_ac_flex_version="${frr_ac_flex_version##* }"
1834AC_MSG_RESULT([$frr_ac_flex_version])
1835AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
4a06690f
DL
1836 LEX="$SHELL $missing_dir/missing flex"
1837 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1838 AC_MSG_WARN([using pregenerated flex output files])
1839 else
1840 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1841 fi
1842 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1843 AC_SUBST([LEXLIB], [''])
1844])
0d37f9f3 1845
bbf5ffa0 1846AC_PROG_YACC
0d37f9f3
DL
1847dnl thanks GNU bison for this b*llshit...
1848AC_MSG_CHECKING(version of bison)
1689cf7e
JAG
1849frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1850frr_ac_bison_version="${frr_ac_bison_version##* }"
1851frr_ac_bison_missing="false"
1852case "x${frr_ac_bison_version}" in
0d37f9f3
DL
1853 x2.7*)
1854 BISON_OPENBRACE='"'
1855 BISON_CLOSEBRACE='"'
05dbb7df 1856 BISON_VERBOSE=''
1689cf7e 1857 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
0d37f9f3
DL
1858 ;;
1859 x2.*|x1.*)
1689cf7e 1860 AC_MSG_RESULT([$frr_ac_bison_version])
0d37f9f3 1861 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1689cf7e 1862 frr_ac_bison_missing="true"
0d37f9f3
DL
1863 ;;
1864 x)
1865 AC_MSG_RESULT([none])
1866 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1689cf7e 1867 frr_ac_bison_missing="true"
0d37f9f3
DL
1868 ;;
1869 *)
1870 BISON_OPENBRACE='{'
1871 BISON_CLOSEBRACE='}'
05dbb7df 1872 BISON_VERBOSE='-Dparse.error=verbose'
1689cf7e 1873 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 or newer])
0d37f9f3
DL
1874 ;;
1875esac
1876AC_SUBST(BISON_OPENBRACE)
1877AC_SUBST(BISON_CLOSEBRACE)
05dbb7df 1878AC_SUBST(BISON_VERBOSE)
0d37f9f3 1879
1689cf7e 1880if $frr_ac_bison_missing; then
0d37f9f3
DL
1881 YACC="$SHELL $missing_dir/missing bison -y"
1882 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1883 AC_MSG_WARN([using pregenerated bison output files])
1884 else
1885 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1886 fi
1887fi
bbf5ffa0 1888
edd7c245 1889dnl -------------------
1890dnl capabilities checks
1891dnl -------------------
41d3fc96 1892if test "${enable_capabilities}" != "no"; then
1893 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1894 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1895 [AC_MSG_RESULT(yes)
1896 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
8e4da10b 1897 frr_ac_keepcaps="yes"],
41d3fc96 1898 AC_MSG_RESULT(no)
edd7c245 1899 )
8e4da10b 1900 if test x"${frr_ac_keepcaps}" = x"yes"; then
41d3fc96 1901 AC_CHECK_HEADERS(sys/capability.h)
1902 fi
1903 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1904 AC_CHECK_LIB(cap, cap_init,
1905 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1906 LIBCAP="-lcap"
8e4da10b 1907 frr_ac_lcaps="yes"]
41d3fc96 1908 )
ceacedba 1909 else
1910 AC_CHECK_HEADERS(priv.h,
1911 [AC_MSG_CHECKING(Solaris style privileges are available)
1912 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1913 [AC_MSG_RESULT(yes)
1914 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
8e4da10b 1915 frr_ac_scaps="yes"],
ceacedba 1916 AC_MSG_RESULT(no)
1917 )
1918 ]
1919 )
1920 fi
8e4da10b
DL
1921 if test x"${frr_ac_scaps}" = x"yes" \
1922 -o x"${frr_ac_lcaps}" = x"yes"; then
ceacedba 1923 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
41d3fc96 1924 fi
edd7c245 1925fi
1926AC_SUBST(LIBCAP)
1927
fb2d1502 1928dnl ---------------------------
1929dnl check for glibc 'backtrace'
1930dnl ---------------------------
8c99b4c1
DL
1931if test x"${enable_backtrace}" != x"no" ; then
1932 backtrace_ok=no
68b8a15f
DL
1933 PKG_CHECK_MODULES([UNWIND], [libunwind], [
1934 AC_DEFINE(HAVE_LIBUNWIND, 1, [libunwind])
1935 backtrace_ok=yes
1936 ], [
1937 case "$host_os" in
1938 sunos* | solaris2*)
1939 AC_CHECK_FUNCS([printstack], [
1940 AC_DEFINE([HAVE_PRINTSTACK], 1, [Solaris printstack])
1941 backtrace_ok=yes
1942 ])
1943 ;;
1944 esac
1945 if test "$backtrace_ok" = no; then
1946 AC_CHECK_HEADER([execinfo.h], [
1947 AC_SEARCH_LIBS([backtrace], [execinfo], [
1948 AC_DEFINE(HAVE_GLIBC_BACKTRACE, 1, [Glibc backtrace])
1949 backtrace_ok=yes
1950 ],, [-lm])
1951 ])
1952 fi
eda3529e 1953 ])
8c99b4c1
DL
1954
1955 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1956 dnl user explicitly requested backtrace but we failed to find support
68b8a15f 1957 AC_MSG_FAILURE([failed to find backtrace or libunwind support])
8c99b4c1
DL
1958 fi
1959fi
fb2d1502 1960
41be32bf
PJ
1961dnl -----------------------------------------
1962dnl check for malloc mallinfo struct and call
1963dnl this must try and link using LIBS, in
1964dnl order to check no alternative allocator
1965dnl has been specified, which might not provide
1966dnl mallinfo, e.g. such as Umem on Solaris.
1967dnl -----------------------------------------
324be174 1968AC_CHECK_HEADERS([malloc.h malloc_np.h malloc/malloc.h],,, [FRR_INCLUDES])
fa896a1d 1969
2a636b43
DL
1970AC_CACHE_CHECK([whether mallinfo is available], [frr_cv_mallinfo], [
1971 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
fa896a1d
DL
1972#ifdef HAVE_MALLOC_H
1973#include <malloc.h>
1974#endif
324be174
DL
1975#ifdef HAVE_MALLOC_NP_H
1976#include <malloc_np.h>
1977#endif
fa896a1d
DL
1978#ifdef HAVE_MALLOC_MALLOC_H
1979#include <malloc/malloc.h>
1980#endif
1981]], [[
1982struct mallinfo ac_x; ac_x = mallinfo ();
1983]])], [
2a636b43
DL
1984 frr_cv_mallinfo=yes
1985 ], [
1986 frr_cv_mallinfo=no
1987 ])
fa896a1d 1988])
2a636b43
DL
1989if test "$frr_cv_mallinfo" = yes; then
1990 AC_DEFINE(HAVE_MALLINFO,,mallinfo)
1991fi
fa896a1d
DL
1992
1993AC_MSG_CHECKING(whether malloc_usable_size is available)
1994AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
1995#ifdef HAVE_MALLOC_H
1996#include <malloc.h>
1997#endif
1998#ifdef HAVE_MALLOC_MALLOC_H
1999#include <malloc/malloc.h>
2000#endif
2001]], [[
2002size_t ac_x; ac_x = malloc_usable_size(NULL);
2003]])], [
2004 AC_MSG_RESULT(yes)
2005 AC_DEFINE(HAVE_MALLOC_USABLE_SIZE,,malloc_usable_size)
2006], [
2007 AC_MSG_RESULT(no)
2008
2009 AC_MSG_CHECKING(whether malloc_size is available)
2010 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
2011#ifdef HAVE_MALLOC_H
2012#include <malloc.h>
2013#endif
2014#ifdef HAVE_MALLOC_MALLOC_H
2015#include <malloc/malloc.h>
2016#endif
2017]], [[
2018size_t ac_x; ac_x = malloc_size(NULL);
2019]])], [
2020 AC_MSG_RESULT(yes)
2021 AC_DEFINE(HAVE_MALLOC_SIZE,,malloc_size)
2022 ], [
2023 AC_MSG_RESULT(no)
2024 ])
2025])
41be32bf 2026
b6116506
DL
2027dnl ------
2028dnl ZeroMQ
2029dnl ------
2030if test "x$enable_zeromq" != "xno"; then
2031 PKG_CHECK_MODULES(ZEROMQ, [libzmq >= 4.0.0], [
2032 AC_DEFINE(HAVE_ZEROMQ, 1, [Enable ZeroMQ support])
2033 ZEROMQ=true
2034 ], [
2035 if test "x$enable_zeromq" = "xyes"; then
2036 AC_MSG_ERROR([configuration specifies --enable-zeromq but libzmq was not found])
2037 fi
2038 ])
2039fi
2040AM_CONDITIONAL([ZEROMQ], test "x$ZEROMQ" = "xtrue")
2041
408ad943 2042dnl ----------
2043dnl configure date
2044dnl ----------
5e2dd3fa
LB
2045dev_version=`echo $VERSION | grep dev`
2046#don't expire deprecated code in non 'dev' branch
2047if test "${dev_version}" = ""; then
2048 CONFDATE=0
2049else
2050 CONFDATE=`date '+%Y%m%d'`
2051fi
408ad943 2052AC_SUBST(CONFDATE)
2053
7ea487bc 2054dnl ------------------------------
a159ed93 2055dnl set paths for state directory
23bd12c3 2056dnl ------------------------------
e84999d9 2057AC_MSG_CHECKING(directory to use for state file)
23bd12c3 2058if test "${prefix}" = "NONE"; then
b2f36157 2059 frr_statedir_prefix="";
23bd12c3 2060else
b2f36157 2061 frr_statedir_prefix=${prefix}
23bd12c3 2062fi
2063if test "${localstatedir}" = '${prefix}/var'; then
8e4da10b 2064 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
b2f36157
DL
2065 ${frr_statedir_prefix}/var/adm dnl
2066 ${frr_statedir_prefix}/etc dnl
a159ed93 2067 /var/run dnl
2068 /var/adm dnl
2069 /etc dnl
2070 /dev/null;
23bd12c3 2071 do
8e4da10b 2072 test -d $FRR_STATE_DIR && break
23bd12c3 2073 done
8e4da10b 2074 frr_statedir=$FRR_STATE_DIR
23bd12c3 2075else
b2f36157 2076 frr_statedir=${localstatedir}
a159ed93 2077fi
b2f36157 2078if test $frr_statedir = "/dev/null"; then
a159ed93 2079 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
2080fi
b2f36157
DL
2081AC_MSG_RESULT(${frr_statedir})
2082AC_SUBST(frr_statedir)
2083
b2f36157 2084AC_DEFINE_UNQUOTED(LDPD_SOCKET, "$frr_statedir/ldpd.sock",ldpd control socket)
b2f36157 2085AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$frr_statedir/zserv.api",zebra api socket)
7134904b 2086AC_DEFINE_UNQUOTED(BFDD_CONTROL_SOCKET, "$frr_statedir/bfdd.sock", bfdd control socket)
b2f36157 2087AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$frr_statedir",daemon vty directory)
1c2facd1 2088AC_DEFINE_UNQUOTED(DAEMON_DB_DIR, "$frr_statedir",daemon database directory)
7ea487bc 2089
95c4aff2
DL
2090dnl autoconf does this, but it does it too late...
2091test "x$prefix" = xNONE && prefix=$ac_default_prefix
2092test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
2093
2094dnl get the full path, recursing through variables...
2095vtysh_bin="$bindir/vtysh"
2096for I in 1 2 3 4 5 6 7 8 9 10; do
2097 eval vtysh_bin="\"$vtysh_bin\""
2098done
2099AC_DEFINE_UNQUOTED(VTYSH_BIN_PATH, "$vtysh_bin",path to vtysh binary)
40da52d8 2100AC_SUBST(vtysh_bin)
95c4aff2 2101
a07169b1
DL
2102CFG_SYSCONF="$sysconfdir"
2103CFG_SBIN="$sbindir"
2104CFG_STATE="$frr_statedir"
30771d65 2105CFG_MODULE="$moduledir"
1c2facd1
RW
2106CFG_YANGMODELS="$yangmodelsdir"
2107CFG_LIBYANG_PLUGINS="$libyang_pluginsdir"
a07169b1
DL
2108for I in 1 2 3 4 5 6 7 8 9 10; do
2109 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
2110 eval CFG_SBIN="\"$CFG_SBIN\""
2111 eval CFG_STATE="\"$CFG_STATE\""
30771d65 2112 eval CFG_MODULE="\"$CFG_MODULE\""
1c2facd1
RW
2113 eval CFG_YANGMODELS="\"$CFG_YANGMODELS\""
2114 eval CFG_LIBYANG_PLUGINS="\"$CFG_LIBYANG_PLUGINS\""
a07169b1
DL
2115done
2116AC_SUBST(CFG_SYSCONF)
2117AC_SUBST(CFG_SBIN)
2118AC_SUBST(CFG_STATE)
30771d65 2119AC_SUBST(CFG_MODULE)
1c2facd1
RW
2120AC_SUBST(CFG_YANGMODELS)
2121AC_SUBST(CFG_LIBYANG_PLUGINS)
30771d65 2122AC_DEFINE_UNQUOTED(MODULE_PATH, "$CFG_MODULE", path to modules)
1c2facd1
RW
2123AC_DEFINE_UNQUOTED(YANG_MODELS_PATH, "$CFG_YANGMODELS", path to YANG data models)
2124AC_DEFINE_UNQUOTED(LIBYANG_PLUGINS_PATH, "$CFG_LIBYANG_PLUGINS", path to libyang plugins)
a07169b1 2125
dabecd7c
MR
2126dnl ------------------------------------
2127dnl Enable RPKI and add librtr to libs
2128dnl ------------------------------------
2129if test "${enable_rpki}" = "yes"; then
2130 PKG_CHECK_MODULES(RTRLIB,[rtrlib >= 0.5.0],
086aec2a 2131 [RPKI=true],
dabecd7c
MR
2132 [RPKI=false
2133 AC_MSG_ERROR([rtrlib was not found on your system or is too old.])]
2134 )
2135fi
2136AM_CONDITIONAL([RPKI], test "x$RPKI" = "xtrue")
2137
2138dnl ------------------------------------------
2139dnl Check whether rtrlib was build with ssh support
2140dnl ------------------------------------------
2141AC_MSG_CHECKING([whether the RTR Library is compiled with SSH])
2142AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "rtrlib/rtrlib.h"]],
2143 [[struct tr_ssh_config config;]])],
2144 [AC_MSG_RESULT(yes)
2145 AC_DEFINE(FOUND_SSH,,found_ssh)],
2146 AC_MSG_RESULT(no)
2147)
2148
7ea487bc 2149dnl ---------------------------
2150dnl Check htonl works correctly
2151dnl ---------------------------
2152AC_MSG_CHECKING(for working htonl)
6f0e3f6e 2153AC_CACHE_VAL(ac_cv_htonl_works,
8e4da10b 2154 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
6f0e3f6e
PJ
2155 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
2156 ]
2157)
7ea487bc 2158AC_MSG_RESULT($ac_cv_htonl_works)
2159
892d21b1
DL
2160AC_CONFIG_FILES([Makefile],[sed -e 's/^#AUTODERP# //' -i Makefile])
2161
2162AC_CONFIG_FILES([
06871ed9 2163 config.version
22ea387f 2164 redhat/frr.spec
e3863245 2165 solaris/Makefile
5eee7099 2166 debianpkg/changelog
c737c7ba 2167 alpine/APKBUILD
3ab11ecc 2168 snapcraft/snapcraft.yaml
b7a97f82 2169 lib/version.h
8efe88ea 2170 tests/lib/cli/test_cli.refout
cbd04084 2171 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
7f57883e
DS
2172 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
2173 pkgsrc/eigrpd.sh])
65efcfce 2174
670bbf19 2175AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
40da52d8 2176AC_CONFIG_FILES([tools/frr],[chmod +x tools/frr])
65efcfce 2177
306ed681
DL
2178AC_CONFIG_COMMANDS([lib/route_types.h], [
2179 dst="${ac_abs_top_builddir}/lib/route_types.h"
2180 ${PERL} "${ac_abs_top_srcdir}/lib/route_types.pl" \
2181 < "${ac_abs_top_srcdir}/lib/route_types.txt" \
2182 > "${dst}.tmp"
2183 test -f "${dst}" \
2184 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2185 && rm "${dst}.tmp" \
2186 || mv "${dst}.tmp" "${dst}"
2187], [
2188 PERL="$PERL"
2189])
2190
2191AS_IF([test "x$with_pkg_git_version" = "xyes"], [
2192 AC_CONFIG_COMMANDS([lib/gitversion.h], [
2193 dst="${ac_abs_top_builddir}/lib/gitversion.h"
2194 ${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
2195 "${ac_abs_top_srcdir}" \
2196 > "${dst}.tmp"
2197 test -f "${dst}" \
2198 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2199 && rm "${dst}.tmp" \
2200 || mv "${dst}.tmp" "${dst}"
2201 ], [
2202 PERL="$PERL"
2203 ])
2204])
2205
1689cf7e 2206## Hack, but working solution to avoid rebuilding of frr.info.
48577196 2207## It's already in CVS until texinfo 4.7 is more common.
14c17fd8 2208AC_OUTPUT
7ea487bc 2209
2210echo "
447a8fe9 2211FRRouting configuration
b2f36157
DL
2212------------------------------
2213FRR version : ${PACKAGE_VERSION}
1080c13f 2214host operating system : ${host_os}
7ea487bc 2215source code location : ${srcdir}
2216compiler : ${CC}
dbac691d 2217compiler flags : ${CFLAGS} ${SAN_FLAGS}
6f0e3f6e 2218make : ${MAKE-make}
dbac691d 2219linker flags : ${LDFLAGS} ${SAN_FLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
b2f36157 2220state file directory : ${frr_statedir}
dc7a2bf1 2221config file directory : `eval echo \`echo ${sysconfdir}\``
d6b72f7a 2222example directory : `eval echo \`echo ${exampledir}\``
30771d65 2223module directory : ${CFG_MODULE}
b2f36157
DL
2224user to run as : ${enable_user}
2225group to run as : ${enable_group}
2226group for vty sockets : ${enable_vty_group}
aa593d5e 2227config file mask : ${enable_configfile_mask}
2228log file mask : ${enable_logfile_mask}
2b2f275e 2229zebra protobuf enabled : ${enable_protobuf:-no}
dc7a2bf1 2230
2231The above user and group must have read/write access to the state file
105b8239 2232directory and to the config files in the config file directory."
410a2492
JAG
2233
2234if test "${enable_doc}" != "no";then
f4f2f2cc 2235 AS_IF([test "$SPHINXBUILD" = /bin/false],
410a2492
JAG
2236 AC_MSG_WARN(sphinx-build is missing but required to build documentation))
2237fi