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