]> git.proxmox.com Git - mirror_frr.git/blame - configure.ac
Merge pull request #3502 from donaldsharp/socket_to_me_baby
[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
99e9f424 10AC_INIT([frr], [6.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])
349if $AR crD conftest.a; then
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])
363if $RANLIB -D conftest.a; then
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
99e9f424 590 AC_DEFINE([HAVE_SHELL_ACCESS], [1], [Allow user to use ssh/telnet/bash])
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
DL
819AC_CHECK_TOOL([OBJCOPY], [objcopy], [:])
820AC_CACHE_CHECK([for .interp value to use], [frr_cv_interp], [
821 frr_cv_interp=""
822 AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])], [
823 if $OBJCOPY -j.interp -Obinary conftest conftest.interp; then
824 frr_cv_interp="`xargs -0 echo < conftest.interp`"
825 fi
826 test -f conftest.interp && rm conftest.interp
827 ])
828])
829if test -n "$frr_cv_interp"; then
99e9f424 830 AC_DEFINE_UNQUOTED([INTERP], ["$frr_cv_interp"], [.interp value])
42efb0d4
DL
831fi
832
6f0e3f6e
PJ
833dnl ------------------------------------
834dnl Check C keywords and standard types
835dnl ------------------------------------
836AC_C_CONST
837AC_C_INLINE
6f0e3f6e 838AC_C_VOLATILE
dc7a2bf1 839AC_HEADER_STDC
6f0e3f6e
PJ
840dnl AC_TYPE_PID_T
841AC_TYPE_UID_T
842AC_TYPE_MODE_T
843AC_TYPE_SIZE_T
6f0e3f6e 844AC_STRUCT_TM
dc7a2bf1 845
6f0e3f6e
PJ
846dnl -------------------------
847dnl Check other header files.
848dnl -------------------------
24f5e2fc
DL
849AC_CHECK_HEADERS([stropts.h sys/ksym.h \
850 linux/version.h asm/types.h \
851 sys/cdefs.h])
6f0e3f6e 852
899a4fd2 853ac_stdatomic_ok=false
99e9f424 854AC_DEFINE([FRR_AUTOCONF_ATOMIC], [1], [did autoconf checks for atomic funcs])
899a4fd2
DL
855AC_CHECK_HEADER([stdatomic.h],[
856
857 AC_MSG_CHECKING([whether _Atomic qualifier works])
858 AC_LINK_IFELSE([AC_LANG_SOURCE([[
859#include <stdatomic.h>
860int main(int argc, char **argv) {
861 _Atomic int i = 0;
862 return i;
863}
864]])], [
99e9f424 865 AC_DEFINE([HAVE_STDATOMIC_H], [1], [found stdatomic.h])
899a4fd2
DL
866 AC_MSG_RESULT([yes])
867 ac_stdatomic_ok=true
868 ], [
869 AC_MSG_RESULT([no])
870 ])
871])
872
873AS_IF([$ac_stdatomic_ok], [true], [
874 AC_MSG_CHECKING([for __atomic_* builtins])
875 AC_LINK_IFELSE([AC_LANG_SOURCE([[
876int main(int argc, char **argv) {
877 volatile int i = 1;
878 __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
879 return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
880}
881]])], [
99e9f424 882 AC_DEFINE([HAVE___ATOMIC], [1], [found __atomic builtins])
899a4fd2
DL
883 AC_MSG_RESULT([yes])
884 ], [
885 AC_MSG_RESULT([no])
886
887 dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
888 AC_MSG_CHECKING([for __sync_* builtins])
889 AC_LINK_IFELSE([AC_LANG_SOURCE([[
890int main(int argc, char **argv) {
891 volatile int i = 1;
892 __sync_fetch_and_sub (&i, 1);
893 return __sync_val_compare_and_swap (&i, 0, 1);
894}
895]])], [
99e9f424 896 AC_DEFINE([HAVE___SYNC], [1], [found __sync builtins])
899a4fd2
DL
897 AC_MSG_RESULT([yes])
898
899 AC_MSG_CHECKING([for __sync_swap builtin])
900 AC_LINK_IFELSE([AC_LANG_SOURCE([[
901int main(int argc, char **argv) {
902 volatile int i = 1;
903 return __sync_swap (&i, 2);
904}
905]])], [
99e9f424 906 AC_DEFINE([HAVE___SYNC_SWAP], 1, [found __sync_swap builtin])
899a4fd2
DL
907 AC_MSG_RESULT([yes])
908 ], [
909 AC_MSG_RESULT([no])
910 ])
911
912 ], [
913 AC_MSG_RESULT([no])
914 AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
915 ])
916 ])
917])
918
324be174
DL
919AC_CHECK_HEADERS([pthread_np.h],,, [
920#include <pthread.h>
921])
e9d938b8 922AC_CHECK_FUNCS([pthread_setname_np pthread_set_name_np])
324be174 923
6f0e3f6e 924dnl Utility macro to avoid retyping includes all the time
8e4da10b 925m4_define([FRR_INCLUDES],
6f0e3f6e 926[#ifdef SUNOS_5
0718b562 927#define _POSIX_C_SOURCE 200809L
6f0e3f6e
PJ
928#define __EXTENSIONS__
929#endif
930#include <stdio.h>
24f5e2fc
DL
931#include <stdlib.h>
932#include <stddef.h>
933#include <sys/types.h>
6f0e3f6e 934/* sys/conf.h depends on param.h on FBSD at least */
24f5e2fc 935#include <sys/param.h>
6f0e3f6e 936/* Required for MAXSIG */
24f5e2fc
DL
937#include <signal.h>
938#include <sys/socket.h>
ea057677
HT
939#ifdef __APPLE__
940# define __APPLE_USE_RFC_3542
941#endif
24f5e2fc
DL
942#include <netinet/in.h>
943#include <sys/time.h>
944#include <time.h>
945#include <net/if.h>
2b43bf23
DO
946])dnl
947
948dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
949dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
950dnl an additional round for it.
951
99e9f424 952AC_CHECK_HEADERS([net/if_var.h], [], [], [FRR_INCLUDES])
2b43bf23 953
8e4da10b
DL
954m4_define([FRR_INCLUDES],
955FRR_INCLUDES
2b43bf23
DO
956[#if HAVE_NET_IF_VAR_H
957# include <net/if_var.h>
958#endif
959])dnl
960
24f5e2fc
DL
961AC_CHECK_HEADERS([netinet/in_var.h \
962 net/if_dl.h net/netopt.h \
963 inet/nd.h netinet/ip_icmp.h \
6f0e3f6e 964 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
99e9f424 965 [], [], [FRR_INCLUDES])
6f0e3f6e
PJ
966
967AC_CHECK_HEADERS([ucontext.h], [], [],
968[#ifndef __USE_GNU
969#define __USE_GNU
970#endif /* __USE_GNU */
8e4da10b 971FRR_INCLUDES
6f0e3f6e
PJ
972])
973
bccbd141
JT
974m4_define([UCONTEXT_INCLUDES],
975[#include <ucontext.h>])dnl
976
977AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
978 [], [], [UCONTEXT_INCLUDES])
979AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
980 [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
981 [], [], [UCONTEXT_INCLUDES])],
982 [], [UCONTEXT_INCLUDES])
983AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
984 [], [], [UCONTEXT_INCLUDES])
985
8e4da10b
DL
986m4_define([FRR_INCLUDES],
987FRR_INCLUDES
24f5e2fc
DL
988[
989#include <sys/un.h>
990#include <netinet/in_systm.h>
6f0e3f6e
PJ
991#if HAVE_NETINET_IN_VAR_H
992# include <netinet/in_var.h>
993#endif
994#if HAVE_NET_IF_DL_H
995# include <net/if_dl.h>
996#endif
6f0e3f6e
PJ
997#if HAVE_NET_NETOPT_H
998# include <net/netopt.h>
999#endif
24f5e2fc 1000#include <net/route.h>
6f0e3f6e
PJ
1001#if HAVE_INET_ND_H
1002# include <inet/nd.h>
1003#endif
24f5e2fc 1004#include <arpa/inet.h>
11770e10
PJ
1005/* Required for IDRP */
1006#if HAVE_NETINET_IP_ICMP_H
1007# include <netinet/ip_icmp.h>
1008#endif
6f0e3f6e 1009])dnl
dc7a2bf1 1010
fa3232e1 1011dnl V6 headers are checked below, after we check for v6
7ea487bc 1012
ddfeb486
DL
1013AC_MSG_CHECKING([which operating system interface to use])
1014case "$host_os" in
1015 sunos* | solaris2*)
1016 AC_MSG_RESULT([Solaris])
1017
99e9f424
RK
1018 AC_DEFINE([SUNOS_5], [1], [SunOS 5])
1019 AC_DEFINE([SOLARIS_IPV6], [1], Solaris IPv6)
1020 AC_DEFINE([_POSIX_C_SOURCE], [200809L], [enable POSIX.1-2008 and XPG7/SUSv4])
ddfeb486 1021
99e9f424
RK
1022 AC_CHECK_LIB([socket], [main])
1023 AC_CHECK_LIB([nsl], [main])
1024 AC_CHECK_LIB([umem], [main])
ddfeb486
DL
1025 SOLARIS="solaris"
1026 ;;
1027 linux*)
1028 AC_MSG_RESULT([Linux])
1029
99e9f424
RK
1030 AC_DEFINE([GNU_LINUX], [1], [GNU Linux])
1031 AC_DEFINE([HAVE_NETLINK], [1], [netlink])
1032 AC_DEFINE([LINUX_IPV6], [1], [Linux IPv6 stack])
ddfeb486
DL
1033
1034 dnl Linux has a compilation problem with mixing
1035 dnl netinet/in.h and linux/in6.h they are not
1036 dnl compatible. There has been discussion on
1037 dnl how to fix it but no real progress on implementation
1038 dnl when they fix it, remove this
99e9f424 1039 AC_DEFINE([IPV6_MINHOPCOUNT], [73], [Linux ipv6 Min Hop Count])
ddfeb486
DL
1040 ;;
1041 openbsd*)
1042 AC_MSG_RESULT([OpenBSD])
1043
99e9f424
RK
1044 AC_DEFINE([OPEN_BSD], [1], [OpenBSD])
1045 AC_DEFINE([KAME], [1], [KAME IPv6])
1046 AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
004174c7
JAG
1047
1048 if test "x${enable_pimd}" != "xno"; then
1049 case "$host_os" in
1050 openbsd6.0)
1051 ;;
1052 openbsd[6-9]*)
1053 AC_MSG_FAILURE([pimd cannot be enabled as PIM support has been removed from OpenBSD 6.1])
1054 ;;
1055 esac
1056 fi
ddfeb486
DL
1057 ;;
1058 *)
1059 AC_MSG_RESULT([BSD])
1060
99e9f424
RK
1061 AC_DEFINE([HAVE_NET_RT_IFLIST], [1], [NET_RT_IFLIST])
1062 AC_DEFINE([KAME], [1], [KAME IPv6])
1063 AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
ddfeb486 1064 ;;
7ea487bc 1065esac
99e9f424 1066AM_CONDITIONAL([SOLARIS], [test "${SOLARIS}" = "solaris"])
7ea487bc 1067
62c9f504
PJ
1068AC_SYS_LARGEFILE
1069
4e40b6d6
KK
1070dnl ------------------------
1071dnl Integrated REALMS option
1072dnl ------------------------
1073if test "${enable_realms}" = "yes"; then
1074 case "$host_os" in
1075 linux*)
99e9f424 1076 AC_DEFINE([SUPPORT_REALMS], [1], [Realms support])
4e40b6d6
KK
1077 ;;
1078 *)
1079 echo "Sorry, only Linux has REALMS support"
1080 exit 1
1081 ;;
1082 esac
1083fi
1084AM_CONDITIONAL([SUPPORT_REALMS], [test "${enable_realms}" = "yes"])
1085
7ea487bc 1086dnl ---------------------
1087dnl Integrated VTY option
1088dnl ---------------------
1089case "${enable_vtysh}" in
64537bc4
DL
1090"no")
1091 VTYSH="";;
1092*)
1093 VTYSH="vtysh";
99e9f424 1094 AC_DEFINE([VTYSH], [1], [VTY shell])
64537bc4
DL
1095
1096 prev_libs="$LIBS"
99e9f424 1097 AC_CHECK_LIB([readline], [main], [
64537bc4
DL
1098 LIBREADLINE="-lreadline"
1099 ], [
1100 dnl readline failed - it might be incorrectly linked and missing its
1101 dnl termcap/tinfo/curses dependency. see if we can fix that...
99e9f424 1102 AC_SEARCH_LIBS([tputs], [termcap tinfo curses ncurses], [
64537bc4
DL
1103 LIBREADLINE="$ac_cv_search_tputs"
1104 ], [
1105 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1106 ])
1107
1108 dnl re-try with the lib we found above
1109 unset ac_cv_lib_readline_main
99e9f424 1110 AC_CHECK_LIB([readline], [main], [
64537bc4
DL
1111 LIBREADLINE="-lreadline $LIBREADLINE"
1112 ], [
1113 AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1114 ], [$LIBREADLINE])
1115 ], [])
1116 LIBS="$prev_libs"
1117
99e9f424 1118 AC_CHECK_HEADER([readline/history.h])
64537bc4
DL
1119 if test $ac_cv_header_readline_history_h = no;then
1120 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
1121 fi
99e9f424 1122 AC_CHECK_LIB([readline], [rl_completion_matches], [true], [], [$LIBREADLINE])
64537bc4 1123 if test $ac_cv_lib_readline_rl_completion_matches = no; then
99e9f424 1124 AC_DEFINE([rl_completion_matches], [completion_matches], [Old readline])
64537bc4 1125 fi
99e9f424 1126 AC_CHECK_LIB([readline], [append_history], [frr_cv_append_history=yes], [frr_cv_append_history=no], [$LIBREADLINE])
64537bc4 1127 if test "$frr_cv_append_history" = yes; then
99e9f424 1128 AC_DEFINE([HAVE_APPEND_HISTORY], [1], [Have history.h append_history])
64537bc4
DL
1129 fi
1130 ;;
7ea487bc 1131esac
99e9f424
RK
1132AC_SUBST([LIBREADLINE])
1133AM_CONDITIONAL([VTYSH], test "x$VTYSH" = "xvtysh")
7ea487bc 1134
1135dnl ----------
1136dnl PAM module
6159928d 1137dnl
1689cf7e 1138dnl FRR detects the PAM library it is built against by checking for a
6159928d
DO
1139dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
1140dnl is known to #include pam_appl.h, the standard header of a PAM library, and
1141dnl openpam.h doesn't do that, although depends on the header too. Hence a
1142dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
1143dnl of OpenPAM.
7ea487bc 1144dnl ----------
24cd435b 1145if test "$with_libpam" = "yes"; then
6f0e3f6e 1146 AC_CHECK_HEADER([security/pam_misc.h],
99e9f424
RK
1147 [AC_DEFINE([HAVE_PAM_MISC_H], [1], [Have pam_misc.h])
1148 AC_DEFINE([PAM_CONV_FUNC], [misc_conv], [Have misc_conv])
6f0e3f6e
PJ
1149 pam_conv_func="misc_conv"
1150 ],
8e4da10b 1151 [], FRR_INCLUDES)
6f0e3f6e 1152 AC_CHECK_HEADER([security/openpam.h],
99e9f424
RK
1153 [AC_DEFINE([HAVE_OPENPAM_H], [1], [Have openpam.h])
1154 AC_DEFINE([PAM_CONV_FUNC], [openpam_ttyconv], [Have openpam_ttyconv])
6f0e3f6e
PJ
1155 pam_conv_func="openpam_ttyconv"
1156 ],
8e4da10b 1157 [], FRR_INCLUDES[#include <security/pam_appl.h>])
24cd435b 1158 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
1159 AC_MSG_WARN([*** pam support will not be built ***])
1160 with_libpam="no"
1161 fi
1162fi
1163
7ea487bc 1164if test "$with_libpam" = "yes"; then
6f0e3f6e 1165dnl took this test from proftpds configure.in and suited to our needs
7ea487bc 1166dnl -------------------------------------------------------------------------
1167dnl
1168dnl This next check looks funky due to a linker problem with some versions
1169dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
1170dnl omitted requiring libdl linking information. PAM-0.72 or better ships
1171dnl with RedHat 6.2 and Debian 2.2 or better.
99e9f424
RK
1172AC_CHECK_LIB([pam], [pam_start],
1173 [AC_CHECK_LIB([pam], [$pam_conv_func],
1174 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
7ea487bc 1175 LIBPAM="-lpam"],
99e9f424 1176 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
7ea487bc 1177 LIBPAM="-lpam -lpam_misc"]
1178 )
1179 ],
1180
99e9f424
RK
1181 [AC_CHECK_LIB([pam], [pam_end],
1182 [AC_CHECK_LIB([pam], [$pam_conv_func],
1183 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
7ea487bc 1184 LIBPAM="-lpam -ldl"],
99e9f424 1185 [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
7ea487bc 1186 LIBPAM="-lpam -ldl -lpam_misc"]
1187 )
1188 ],AC_MSG_WARN([*** pam support will not be built ***]),
1189 [-ldl])
1190 ]
1191)
1192fi
99e9f424 1193AC_SUBST([LIBPAM])
7ea487bc 1194
1195dnl -------------------------------
1196dnl Endian-ness check
1197dnl -------------------------------
1198AC_WORDS_BIGENDIAN
1199
1200dnl -------------------------------
1201dnl check the size in byte of the C
1202dnl -------------------------------
1203dnl AC_CHECK_SIZEOF(char)
1204dnl AC_CHECK_SIZEOF(int)
1205dnl AC_CHECK_SIZEOF(short)
1206dnl AC_CHECK_SIZEOF(long)
1207
1208dnl ----------------------------
1209dnl check existance of functions
1210dnl ----------------------------
6f0e3f6e
PJ
1211AC_FUNC_FNMATCH
1212AC_FUNC_FORK
6f0e3f6e 1213AC_FUNC_MKTIME
6f0e3f6e 1214AC_FUNC_STAT
6f0e3f6e
PJ
1215
1216dnl -------------------------------
1217dnl bgpd needs pow() and hence libm
1218dnl -------------------------------
1219TMPLIBS="$LIBS"
1220AC_CHECK_HEADER([math.h],
1221 [AC_CHECK_LIB([m], [pow],
1222 [LIBM="-lm"
1223 LIBS="$LIBS $LIBM"
6f0e3f6e
PJ
1224 AC_CHECK_FUNCS(pow,[],[LIBM=""])
1225 ])
1226])
1227if test x"$LIBM" = x ; then
1228 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1229fi
1230LIBS="$TMPLIBS"
634949ae 1231
99e9f424 1232AC_SUBST([LIBM])
6f0e3f6e 1233
154b9e8f 1234AC_CHECK_FUNCS([ppoll], [
99e9f424 1235 AC_DEFINE([HAVE_PPOLL], [1], [have Linux/BSD ppoll()])
154b9e8f
DL
1236])
1237AC_CHECK_FUNCS([pollts], [
99e9f424 1238 AC_DEFINE([HAVE_POLLTS], [1], [have NetBSD pollts()])
154b9e8f
DL
1239])
1240
6f0e3f6e
PJ
1241dnl ---------------
1242dnl other functions
1243dnl ---------------
24f5e2fc
DL
1244AC_CHECK_FUNCS([ \
1245 strlcat strlcpy \
316d0ae5 1246 getgrouplist])
6f0e3f6e 1247
13460c44
FL
1248AC_CHECK_HEADER([asm-generic/unistd.h],
1249 [AC_CHECK_DECL(__NR_setns,
99e9f424 1250 AC_DEFINE([HAVE_NETNS], [1], [Have netns]),,
8e4da10b 1251 FRR_INCLUDES [#include <asm-generic/unistd.h>
13460c44 1252 ])
99e9f424 1253 AC_CHECK_FUNCS([setns])]
13460c44
FL
1254 )
1255
238497fc
PJ
1256dnl --------------------------
1257dnl Determine IS-IS I/O method
1258dnl --------------------------
99e9f424
RK
1259AC_DEFINE([ISIS_METHOD_PFPACKET], [1], [constant value for isis method pfpacket])
1260AC_DEFINE([ISIS_METHOD_DLPI], [2], [constant value for isis method dlpi])
1261AC_DEFINE([ISIS_METHOD_BPF], [3], [constant value for isis method bpf])
1262AC_CHECK_HEADER([net/bpf.h])
1263AC_CHECK_HEADER([sys/dlpi.h])
1264AC_MSG_CHECKING([zebra IS-IS I/O method])
ddfeb486
DL
1265
1266case "$host_os" in
1267 linux*)
99e9f424 1268 AC_MSG_RESULT([pfpacket])
ddfeb486
DL
1269 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1270 ;;
1271 solaris* | sunos*)
99e9f424 1272 AC_MSG_RESULT([DLPI])
ddfeb486
DL
1273 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1274 ;;
1275 *)
1276 if test $ac_cv_header_net_bpf_h = no; then
1277 if test $ac_cv_header_sys_dlpi_h = no; then
99e9f424 1278 AC_MSG_RESULT([none])
7c0cbd0e 1279 if test "${enable_isisd}" = yes -o "${enable_fabricd}" = yes; then
86e463cf
DL
1280 AC_MSG_FAILURE([IS-IS support requested but no packet backend found])
1281 fi
ddfeb486 1282 AC_MSG_WARN([*** IS-IS support will not be built ***])
86e463cf 1283 enable_isisd="no"
7c0cbd0e 1284 enable_fabricd="no"
ddfeb486 1285 else
99e9f424 1286 AC_MSG_RESULT([DLPI])
ddfeb486
DL
1287 fi
1288 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
238497fc 1289 else
99e9f424 1290 AC_MSG_RESULT([BPF])
ddfeb486 1291 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
238497fc 1292 fi
ddfeb486
DL
1293 ;;
1294esac
99e9f424 1295AC_DEFINE_UNQUOTED([ISIS_METHOD], [$ISIS_METHOD_MACRO], [selected method for isis, == one of the constants])
238497fc 1296
42c98199 1297dnl ---------------------------------------------------------------
1298dnl figure out how to specify an interface in multicast sockets API
1299dnl ---------------------------------------------------------------
8e4da10b 1300AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
42c98199 1301
b3f2bf7c 1302AC_CHECK_HEADERS([linux/mroute.h], [], [],[
24f5e2fc
DL
1303 #include <sys/socket.h>
1304 #include <netinet/in.h>
b3f2bf7c
RW
1305 #define _LINUX_IN_H /* For Linux <= 2.6.25 */
1306 #include <linux/types.h>
1307])
1308
8e4da10b
DL
1309m4_define([FRR_INCLUDES],
1310FRR_INCLUDES
b3f2bf7c
RW
1311[#if HAVE_LINUX_MROUTE_H
1312# include <linux/mroute.h>
1313#endif
1314])dnl
1315
1316AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
24f5e2fc
DL
1317 #include <sys/socket.h>
1318 #include <sys/types.h>
1319 #include <netinet/in.h>
1320 #include <net/route.h>
b3f2bf7c
RW
1321])
1322
8e4da10b
DL
1323m4_define([FRR_INCLUDES],
1324FRR_INCLUDES
b3f2bf7c
RW
1325[#if HAVE_NETINET_IP_MROUTE_H
1326# include <netinet/ip_mroute.h>
1327#endif
1328])dnl
1329
42c98199 1330AC_MSG_CHECKING([for BSD struct ip_mreq hack])
24f5e2fc
DL
1331AC_TRY_COMPILE([#include <sys/param.h>],
1332[#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 1333 return (0);
1334#else
1335 #error No support for BSD struct ip_mreq hack detected
99e9f424
RK
1336#endif],[AC_MSG_RESULT([yes])
1337AC_DEFINE([HAVE_BSD_STRUCT_IP_MREQ_HACK], [1], [Can pass ifindex in struct ip_mreq])],
1338AC_MSG_RESULT([no]))
42c98199 1339
10d04cdb
DT
1340AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1341AC_TRY_COMPILE([
1342#include <sys/types.h>
1343#include <netinet/in.h>
1344], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
99e9f424
RK
1345], [AC_MSG_RESULT([yes])
1346AC_DEFINE([HAVE_RFC3678], [1], [Have RFC3678 protocol-independed API])],
1347AC_MSG_RESULT([no]))
10d04cdb 1348
c543a173
AS
1349dnl ---------------------------------------------------------------
1350dnl figure out how to check link-state
1351dnl ---------------------------------------------------------------
99e9f424 1352AC_CHECK_HEADER([net/if_media.h],
24f5e2fc 1353 [m4_define([LINK_DETECT_INCLUDES],
8e4da10b 1354 FRR_INCLUDES
24f5e2fc
DL
1355 [#include <net/if_media.h>
1356 ])
99e9f424
RK
1357 AC_CHECK_MEMBERS([struct ifmediareq.ifm_status],
1358 AC_DEFINE([HAVE_BSD_LINK_DETECT], [1], [BSD link-detect]),
24f5e2fc
DL
1359 [], LINK_DETECT_INCLUDES)],
1360 [],
8e4da10b 1361 FRR_INCLUDES)
c543a173 1362
9234b382
DV
1363dnl ---------------------------------------------------------------
1364dnl Additional, newer way to check link-state using ifi_link_state.
1365dnl Not available in all BSD's when ifmediareq available
1366dnl ---------------------------------------------------------------
24f5e2fc 1367AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
99e9f424 1368 AC_DEFINE([HAVE_BSD_IFI_LINK_STATE], [1], [BSD ifi_link_state available]),
8e4da10b 1369 [], FRR_INCLUDES)
9234b382 1370
0df7c91f
PJ
1371dnl ------------------------
1372dnl TCP_MD5SIG socket option
1373dnl ------------------------
1374
1375AC_CHECK_HEADER([netinet/tcp.h],
1376 [m4_define([MD5_INCLUDES],
8e4da10b 1377 FRR_INCLUDES
0df7c91f
PJ
1378 [#include <netinet/tcp.h>
1379 ])
1380 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1381 [],
8e4da10b 1382 FRR_INCLUDES)
0df7c91f
PJ
1383if test $ac_cv_have_decl_TCP_MD5SIG = no; then
1384 AC_CHECK_HEADER([linux/tcp.h],
1385 [m4_define([MD5_INCLUDES],
8e4da10b 1386 FRR_INCLUDES
0df7c91f
PJ
1387 [#include <linux/tcp.h>
1388 ])
1389 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1390fi
1391
60060acc
RW
1392dnl ----------------------------------------------------------------------------
1393dnl figure out if domainname is available in the utsname struct (GNU extension).
1394dnl ----------------------------------------------------------------------------
1395AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1396
fa3232e1 1397dnl ------------------
1398dnl IPv6 header checks
1399dnl ------------------
24f5e2fc 1400AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
6f0e3f6e 1401 netinet6/in6_var.h netinet6/nd6.h], [], [],
8e4da10b 1402 FRR_INCLUDES)
fa3232e1 1403
8e4da10b
DL
1404m4_define([FRR_INCLUDES],dnl
1405FRR_INCLUDES
6f0e3f6e
PJ
1406[#if HAVE_NETINET6_IN6_H
1407#include <netinet6/in6.h>
1408#endif
1409#if HAVE_NETINET_IN6_VAR_H
1410#include <netinet/in6_var.h>
1411#endif
24f5e2fc 1412#include <netinet/icmp6.h>
6f0e3f6e
PJ
1413#if HAVE_NETINET6_IN6_VAR_H
1414# include <netinet6/in6_var.h>
1415#endif
1416#if HAVE_NETINET6_ND6_H
fbf24544 1417# include <netinet6/nd6.h>
6f0e3f6e
PJ
1418#endif
1419])dnl
1420
cbcd9bfc 1421dnl disable doc check
f4f2f2cc
DL
1422AC_CHECK_PROGS([SPHINXBUILD], [sphinx-build sphinx-build3 sphinx-build2], [/bin/false])
1423if test "$SPHINXBUILD" = "/bin/false"; then
1424 if test "${enable_doc}" = "yes"; then
1425 AC_MSG_ERROR([Documentation was explicitly requested with --enable-doc but sphinx-build is not available. Please disable docs or install sphinx.])
1426 fi
1427fi
99e9f424
RK
1428AM_CONDITIONAL([DOC], [test "${enable_doc}" != "no" -a "$SPHINXBUILD" != "/bin/false"])
1429AM_CONDITIONAL([DOC_HTML], [test "${enable_doc_html}" = "yes"])
cbcd9bfc 1430
7ea487bc 1431dnl --------------------
1432dnl Daemon disable check
1433dnl --------------------
99e9f424 1434AM_CONDITIONAL([ZEBRA], [test "${enable_zebra}" != "no"])
7ea487bc 1435
1436if test "${enable_bgpd}" = "no";then
1437 BGPD=""
1438else
1439 BGPD="bgpd"
1440fi
99e9f424 1441AM_CONDITIONAL([BGPD], [test "x$BGPD" = "xbgpd"])
7ea487bc 1442
99e9f424
RK
1443AM_CONDITIONAL([RIPD], [test "${enable_ripd}" != "no"])
1444AM_CONDITIONAL([OSPFD], [test "${enable_ospfd}" != "no"])
1445AM_CONDITIONAL([LDPD], [test "${enable_ldpd}" != "no"])
7ea487bc 1446
30237d29 1447AS_IF([test "${enable_ldpd}" != "no"], [
99e9f424 1448 AC_DEFINE([HAVE_LDPD], [1], [ldpd])
30237d29 1449])
eac6e3f0 1450
7134904b 1451if test "$enable_bfdd" = "no"; then
99e9f424 1452 AC_DEFINE([HAVE_BFDD], [0], [bfdd])
7134904b
RZ
1453 BFDD=""
1454else
99e9f424 1455 AC_DEFINE([HAVE_BFDD], [1], [bfdd])
7134904b
RZ
1456 BFDD="bfdd"
1457
1458 case $host_os in
1459 linux*)
99e9f424 1460 AC_DEFINE([BFD_LINUX], [1], [bfdd])
7134904b
RZ
1461 ;;
1462
1463 *)
99e9f424 1464 AC_DEFINE([BFD_BSD], [1], [bfdd])
7134904b
RZ
1465 ;;
1466 esac
1467fi
1468
99e9f424 1469AM_CONDITIONAL([BFDD], [test "x$BFDD" = "xbfdd"])
7134904b 1470
39d3cc4e 1471if test "$ac_cv_lib_json_c_json_object_get" = no -a "x$BFDD" = "xbfdd"; then
7134904b
RZ
1472 AC_MSG_ERROR(["you must use json-c library to use bfdd"])
1473fi
1474
42350cfc 1475NHRPD=""
ddfeb486
DL
1476case "$host_os" in
1477 linux*)
1478 if test "${enable_nhrpd}" != "no"; then
1479 NHRPD="nhrpd"
1480 fi
1481 ;;
1482 *)
1483 if test "${enable_nhrpd}" = "yes"; then
1484 AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1485 fi
1486 ;;
1487esac
99e9f424 1488AM_CONDITIONAL([NHRPD], [test "x$NHRPD" = "xnhrpd"])
2fb975da 1489
99e9f424 1490AM_CONDITIONAL([EIGRPD], [test "${enable_eigrpd}" != "no"])
7f57883e 1491
9473e340
DS
1492if test "${enable_watchfrr}" = "no";then
1493 WATCHFRR=""
d0199430 1494else
9473e340 1495 WATCHFRR="watchfrr"
d0199430 1496fi
99e9f424 1497AM_CONDITIONAL([WATCHFRR], [test "x$WATCHFRR" = "xwatchfrr"])
d0199430 1498
1ef74ef7 1499OSPFCLIENT=""
cd66cd4c 1500if test "${enable_ospfapi}" != "no";then
99e9f424 1501 AC_DEFINE([SUPPORT_OSPF_API], [1], [OSPFAPI])
1ef74ef7 1502
cd66cd4c 1503 if test "${enable_ospfclient}" != "no";then
1ef74ef7 1504 OSPFCLIENT="ospfclient"
1ef74ef7 1505 fi
7ea487bc 1506fi
cd66cd4c 1507
99e9f424
RK
1508AM_CONDITIONAL([OSPFCLIENT], [test "x$OSPFCLIENT" = "xospfclient"])
1509AM_CONDITIONAL([RIPNGD], [test "${enable_ripngd}" != "no"])
1510AM_CONDITIONAL([BABELD], [test "${enable_babeld}" != "no"])
1511AM_CONDITIONAL([OSPF6D], [test "${enable_ospf6d}" != "no"])
1512AM_CONDITIONAL([ISISD], [test "${enable_isisd}" != "no"])
1513AM_CONDITIONAL([PIMD], [test "${enable_pimd}" != "no"])
1514AM_CONDITIONAL([PBRD], [test "${enable_pbrd}" != "no"])
1515AM_CONDITIONAL([SHARPD], [test "${enable_sharpd}" = "yes"])
1516AM_CONDITIONAL([STATICD], [test "${enable_staticd}" != "no"])
1517AM_CONDITIONAL([FABRICD], [test "${enable_fabricd}" != "no"])
12e41d03 1518
7ea487bc 1519if test "${enable_bgp_announce}" = "no";then
99e9f424 1520 AC_DEFINE([DISABLE_BGP_ANNOUNCE], [1], [Disable BGP installation to zebra])
750e8146 1521else
99e9f424 1522 AC_DEFINE([DISABLE_BGP_ANNOUNCE], [0], [Disable BGP installation to zebra])
7ea487bc 1523fi
1524
f95f2ad9 1525if test "${enable_bgp_vnc}" != "no";then
99e9f424 1526 AC_DEFINE([ENABLE_BGP_VNC], [1], [Enable BGP VNC support])
65efcfce 1527fi
f95f2ad9 1528AM_CONDITIONAL([ENABLE_BGP_VNC], [test x${enable_bgp_vnc} != xno])
65efcfce 1529
99e9f424
RK
1530AC_SUBST([SOLARIS])
1531AC_CHECK_LIB([crypt], [crypt], [],
1532 [AC_CHECK_LIB([crypto], [DES_crypt])])
1533AC_CHECK_LIB([resolv], [res_init])
7ea487bc 1534
25f45887
JJ
1535dnl ---------------------------
1536dnl check system has PCRE regexp
1537dnl ---------------------------
1538if test "x$enable_pcreposix" = "xyes"; then
99e9f424 1539 AC_CHECK_LIB([pcreposix], [regexec], [], [
ad9a0825
DL
1540 AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1541 ])
25f45887 1542fi
99e9f424 1543AC_SUBST([HAVE_LIBPCREPOSIX])
7ea487bc 1544
2fb975da
TT
1545dnl ------------------
1546dnl check C-Ares library
1547dnl ------------------
42350cfc 1548if test "${NHRPD}" != ""; then
99e9f424 1549 PKG_CHECK_MODULES([CARES], [libcares], ,[
92e50261
DL
1550 AC_MSG_ERROR([trying to build nhrpd, but libcares not found. install c-ares and its -dev headers.])
1551 ])
2fb975da
TT
1552fi
1553
1554
7ea487bc 1555dnl ------------------
b1fc9acb 1556dnl check Net-SNMP library
7ea487bc 1557dnl ------------------
53b99735 1558if test "${enable_snmp}" != "" -a "${enable_snmp}" != "no"; then
08d7f653
VB
1559 AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1560 if test x"$NETSNMP_CONFIG" = x"no"; then
1561 AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1562 fi
46081234
DL
1563 SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1564 SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
e5563f87
DL
1565 # net-snmp lists all of its own dependencies. we absolutely do not want that
1566 # among other things we avoid a GPL vs. OpenSSL license conflict here
1567 for removelib in crypto ssl sensors pci wrap; do
1568 SNMP_LIBS="`echo $SNMP_LIBS | sed -e 's/\(^\|\s\)-l'$removelib'\b/ /g' -e 's/\(^\|\s\)\([^\s]*\/\)\?lib'$removelib'\.[^\s]\+\b/ /g'`"
1569 done
08d7f653 1570 AC_MSG_CHECKING([whether we can link to Net-SNMP])
92e50261 1571 AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
08d7f653
VB
1572int main(void);
1573],
1574[
1575{
1576 return 0;
1577}
92e50261 1578])], [
08d7f653 1579 AC_MSG_ERROR([--enable-snmp given but not usable])])
d6be5fb9
VB
1580 case "${enable_snmp}" in
1581 yes)
1582 SNMP_METHOD=agentx
1583 ;;
807ed4e9 1584 agentx)
d6be5fb9
VB
1585 SNMP_METHOD="${enable_snmp}"
1586 ;;
1587 *)
807ed4e9 1588 AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use yes or agentx])
d6be5fb9
VB
1589 ;;
1590 esac
d6be5fb9 1591 AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
99e9f424 1592 AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,[SNMP method to interface with snmpd])
6cf9df08 1593fi
46081234 1594AM_CONDITIONAL([SNMP], [test "x${SNMP_METHOD}" != "x"])
99e9f424
RK
1595AC_SUBST([SNMP_LIBS])
1596AC_SUBST([SNMP_CFLAGS])
6cf9df08 1597
1c2facd1
RW
1598dnl ---------------
1599dnl libyang
1600dnl ---------------
99e9f424 1601PKG_CHECK_MODULES([libyang], [libyang >= 0.16.7], , [
1c2facd1
RW
1602 AC_MSG_ERROR([libyang (>= 0.16.7) was not found on your system.])
1603])
397b1dff
CF
1604AC_CHECK_MEMBER([struct lyd_node.priv], [], [
1605 AC_MSG_ERROR([m4_normalize([
1606 libyang needs to be compiled with ENABLE_LYD_PRIV=ON.
1607 See http://docs.frrouting.org/projects/dev-guide/en/latest/building-libyang.html for details.])
1608 ])
1609], [[#include <libyang/libyang.h>]])
1c2facd1
RW
1610
1611dnl ---------------
1612dnl configuration rollbacks
1613dnl ---------------
1614SQLITE3=false
1615if test "$enable_config_rollbacks" = "yes"; then
99e9f424
RK
1616 PKG_CHECK_MODULES([sqlite3], [sqlite3], [
1617 AC_DEFINE([HAVE_CONFIG_ROLLBACKS], [1], [Enable configuration rollbacks])
1618 AC_DEFINE([HAVE_SQLITE3], [1], [Enable sqlite3 database])
1c2facd1
RW
1619 SQLITE3=true
1620 ], [
1621 AC_MSG_ERROR([--enable-config-rollbacks given but sqlite3 was not found on your system.])
1622 ])
1623fi
99e9f424 1624AM_CONDITIONAL([SQLITE3], [$SQLITE3])
1c2facd1 1625
5bce33b3
RW
1626dnl ---------------
1627dnl confd
1628dnl ---------------
1629if test "$enable_confd" != "" -a "$enable_confd" != "no"; then
76ca5356 1630 AC_CHECK_PROG([CONFD], [confd], [confd], [/bin/false], "${enable_confd}/bin")
5bce33b3
RW
1631 if test "x$CONFD" = "x/bin/false"; then
1632 AC_MSG_ERROR([confd was not found on your system.])]
1633 fi
1634 CONFD_CFLAGS="-I${enable_confd}/include -L${enable_confd}/lib"
99e9f424
RK
1635 AC_SUBST([CONFD_CFLAGS])
1636 AC_DEFINE([HAVE_CONFD], [1], [Enable confd integration])
5bce33b3
RW
1637fi
1638AM_CONDITIONAL([CONFD], [test "x$enable_confd" != "x"])
1639
a7ca2199
RW
1640dnl ---------------
1641dnl sysrepo
1642dnl ---------------
1643if test "$enable_sysrepo" = "yes"; then
99e9f424
RK
1644 PKG_CHECK_MODULES([sysrepo], [libsysrepo],
1645 [AC_DEFINE([HAVE_SYSREPO], [1], [Enable sysrepo integration])
a7ca2199
RW
1646 SYSREPO=true],
1647 [SYSREPO=false
1648 AC_MSG_ERROR([sysrepo was not found on your system.])]
1649 )
1650fi
1651AM_CONDITIONAL([SYSREPO], [test "x$enable_sysrepo" = "xyes"])
1652
4db0cff1
QY
1653dnl ---------------
1654dnl math
1655dnl ---------------
1656AC_SEARCH_LIBS([sqrt], [m])
1657
b249c083
DL
1658dnl ---------------
1659dnl dlopen & dlinfo
1660dnl ---------------
99e9f424 1661AC_SEARCH_LIBS([dlopen], [dl dld], [], [
30771d65
DL
1662 AC_MSG_ERROR([unable to find the dlopen()])
1663])
1664
b249c083
DL
1665AC_CHECK_HEADERS([link.h])
1666
2a636b43
DL
1667AC_CACHE_CHECK([for dlinfo(RTLD_DI_ORIGIN)], [frr_cv_rtld_di_origin], [
1668 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
b249c083
DL
1669#include <stdlib.h>
1670#ifdef HAVE_LINK_H
1671#include <link.h>
1672#endif
1673#include <dlfcn.h>
1674]], [[
1675 char origin[1];
1676 dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1677]])], [
2a636b43
DL
1678 frr_cv_rtld_di_origin=yes
1679 ], [
1680 frr_cv_rtld_di_origin=no
1681 ])
b249c083 1682])
2a636b43 1683if test "$frr_cv_rtld_di_origin" = yes; then
99e9f424 1684 AC_DEFINE([HAVE_DLINFO_ORIGIN], [1], [Have dlinfo RTLD_DI_ORIGIN])
2a636b43 1685fi
b249c083 1686
2a636b43
DL
1687AC_CACHE_CHECK([for dlinfo(RTLD_DI_LINKMAP)], [frr_cv_rtld_di_linkmap], [
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 struct link_map *lm = NULL;
1696 dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1697]])], [
2a636b43
DL
1698 frr_cv_rtld_di_linkmap=yes
1699 ], [
1700 frr_cv_rtld_di_linkmap=no
1701 ])
b249c083 1702])
2a636b43 1703if test "$frr_cv_rtld_di_linkmap" = yes; then
99e9f424 1704 AC_DEFINE([HAVE_DLINFO_LINKMAP], [1], [Have dlinfo RTLD_DI_LINKMAP])
2a636b43 1705fi
6cf9df08 1706
99e9f424 1707AM_CONDITIONAL([SNMP], [test "x$SNMP_METHOD" = "xagentx"])
62ff928b 1708
7ea487bc 1709dnl ---------------------------
6f0e3f6e 1710dnl sockaddr and netinet checks
7ea487bc 1711dnl ---------------------------
24f5e2fc
DL
1712AC_CHECK_TYPES([
1713 struct sockaddr_dl,
1714 struct vifctl, struct mfcctl, struct sioc_sg_req,
12e41d03 1715 vifi_t, struct sioc_vif_req, struct igmpmsg,
6f0e3f6e
PJ
1716 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1717 struct nd_opt_adv_interval, struct rt_addrinfo,
11770e10 1718 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
8e4da10b 1719 [], [], FRR_INCLUDES)
6f0e3f6e
PJ
1720
1721AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1722 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
ca3ccd87 1723 struct sockaddr_dl.sdl_len,
6f0e3f6e
PJ
1724 struct if6_aliasreq.ifra_lifetime,
1725 struct nd_opt_adv_interval.nd_opt_ai_type],
8e4da10b 1726 [], [], FRR_INCLUDES)
29c4c9bd 1727
6f0e3f6e 1728dnl ---------------------------
11770e10 1729dnl IRDP/pktinfo/icmphdr checks
6f0e3f6e 1730dnl ---------------------------
8dc1f7fc
DL
1731
1732AC_CHECK_TYPES([struct in_pktinfo], [
1733 AC_CHECK_TYPES([struct icmphdr], [
1734 IRDP=true
1735 ], [
1736 IRDP=false
1737 ], [FRR_INCLUDES])
1738], [
1739 IRDP=false
1740], [FRR_INCLUDES])
1741
1742case "${enable_irdp}" in
1743yes)
1744 $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1745 ;;
1746no)
1747 IRDP=false
1748 ;;
1749esac
1750
99e9f424 1751AM_CONDITIONAL([IRDP], [$IRDP])
29c4c9bd 1752
12e41d03
DL
1753dnl -----------------------
1754dnl checking for IP_PKTINFO
1755dnl -----------------------
99e9f424 1756AC_MSG_CHECKING([for IP_PKTINFO])
12e41d03
DL
1757AC_TRY_COMPILE([#include <netdb.h>], [
1758 int opt = IP_PKTINFO;
1759], [
99e9f424
RK
1760 AC_MSG_RESULT([yes])
1761 AC_DEFINE([HAVE_IP_PKTINFO], [1], [Have IP_PKTINFO])
12e41d03 1762], [
99e9f424 1763 AC_MSG_RESULT([no])
12e41d03
DL
1764])
1765
1766dnl ---------------------------
1767dnl checking for IP_RECVDSTADDR
1768dnl ---------------------------
99e9f424 1769AC_MSG_CHECKING([for IP_RECVDSTADDR])
12e41d03
DL
1770AC_TRY_COMPILE([#include <netinet/in.h>], [
1771 int opt = IP_RECVDSTADDR;
1772], [
99e9f424
RK
1773 AC_MSG_RESULT([yes])
1774 AC_DEFINE([HAVE_IP_RECVDSTADDR], [1], [Have IP_RECVDSTADDR])
12e41d03 1775], [
99e9f424 1776 AC_MSG_RESULT([no])
12e41d03
DL
1777])
1778
1779dnl ----------------------
1780dnl checking for IP_RECVIF
1781dnl ----------------------
99e9f424 1782AC_MSG_CHECKING([for IP_RECVIF])
12e41d03
DL
1783AC_TRY_COMPILE([#include <netinet/in.h>], [
1784 int opt = IP_RECVIF;
1785], [
99e9f424
RK
1786 AC_MSG_RESULT([yes])
1787 AC_DEFINE([HAVE_IP_RECVIF], [1], [Have IP_RECVIF])
12e41d03 1788], [
99e9f424 1789 AC_MSG_RESULT([no])
12e41d03
DL
1790])
1791
eac6e3f0
RW
1792dnl ----------------------
1793dnl checking for SO_BINDANY
1794dnl ----------------------
99e9f424 1795AC_MSG_CHECKING([for SO_BINDANY])
eac6e3f0
RW
1796AC_TRY_COMPILE([#include <sys/socket.h>], [
1797 int opt = SO_BINDANY;
1798], [
99e9f424
RK
1799 AC_MSG_RESULT([yes])
1800 AC_DEFINE([HAVE_SO_BINDANY], [1], [Have SO_BINDANY])
eac6e3f0 1801], [
99e9f424 1802 AC_MSG_RESULT([no])
eac6e3f0
RW
1803])
1804
1805dnl ----------------------
1806dnl checking for IP_FREEBIND
1807dnl ----------------------
99e9f424 1808AC_MSG_CHECKING([for IP_FREEBIND])
eac6e3f0
RW
1809AC_TRY_COMPILE([#include <netinet/in.h>], [
1810 int opt = IP_FREEBIND;
1811], [
99e9f424
RK
1812 AC_MSG_RESULT([yes])
1813 AC_DEFINE([HAVE_IP_FREEBIND], [1], [Have IP_FREEBIND])
eac6e3f0 1814], [
99e9f424 1815 AC_MSG_RESULT([no])
eac6e3f0
RW
1816])
1817
ba0cb3fe
DS
1818dnl --------------------------------------
1819dnl checking for be32dec existence or not
1820dnl --------------------------------------
1821AC_CHECK_DECLS([be32enc, be32dec], [], [],
1822 [#include <sys/endian.h>])
1823
c4376c9d
SH
1824dnl --------------------------------------
1825dnl checking for clock_time monotonic struct and call
1826dnl --------------------------------------
99e9f424
RK
1827AC_CHECK_DECL([CLOCK_MONOTONIC],
1828 [AC_CHECK_LIB([rt], [clock_gettime], [LIBS="$LIBS -lrt"])
1829 AC_DEFINE([HAVE_CLOCK_MONOTONIC], [1], [Have monotonic clock])
1830], [AC_MSG_RESULT([no])], [FRR_INCLUDES])
c4376c9d 1831
bbf5ffa0
QY
1832dnl --------------------------------------
1833dnl checking for flex and bison
1834dnl --------------------------------------
4a06690f 1835
bbf5ffa0 1836AM_PROG_LEX
99e9f424 1837AC_MSG_CHECKING([version of flex])
1689cf7e
JAG
1838frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
1839frr_ac_flex_version="${frr_ac_flex_version##* }"
1840AC_MSG_RESULT([$frr_ac_flex_version])
1841AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
4a06690f
DL
1842 LEX="$SHELL $missing_dir/missing flex"
1843 if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
1844 AC_MSG_WARN([using pregenerated flex output files])
1845 else
1846 AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
1847 fi
1848 AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
1849 AC_SUBST([LEXLIB], [''])
1850])
0d37f9f3 1851
bbf5ffa0 1852AC_PROG_YACC
0d37f9f3 1853dnl thanks GNU bison for this b*llshit...
99e9f424 1854AC_MSG_CHECKING([version of bison])
1689cf7e
JAG
1855frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
1856frr_ac_bison_version="${frr_ac_bison_version##* }"
1857frr_ac_bison_missing="false"
1858case "x${frr_ac_bison_version}" in
0d37f9f3
DL
1859 x2.7*)
1860 BISON_OPENBRACE='"'
1861 BISON_CLOSEBRACE='"'
05dbb7df 1862 BISON_VERBOSE=''
1689cf7e 1863 AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
0d37f9f3
DL
1864 ;;
1865 x2.*|x1.*)
1689cf7e 1866 AC_MSG_RESULT([$frr_ac_bison_version])
0d37f9f3 1867 AC_MSG_WARN([installed bison is too old. Please install GNU bison 2.7.x or newer.])
1689cf7e 1868 frr_ac_bison_missing="true"
0d37f9f3
DL
1869 ;;
1870 x)
1871 AC_MSG_RESULT([none])
1872 AC_MSG_WARN([could not determine bison version. Please install GNU bison 2.7.x or newer.])
1689cf7e 1873 frr_ac_bison_missing="true"
0d37f9f3
DL
1874 ;;
1875 *)
1876 BISON_OPENBRACE='{'
1877 BISON_CLOSEBRACE='}'
05dbb7df 1878 BISON_VERBOSE='-Dparse.error=verbose'
1689cf7e 1879 AC_MSG_RESULT([$frr_ac_bison_version - 3.0 or newer])
0d37f9f3
DL
1880 ;;
1881esac
99e9f424
RK
1882AC_SUBST([BISON_OPENBRACE])
1883AC_SUBST([BISON_CLOSEBRACE])
1884AC_SUBST([BISON_VERBOSE])
0d37f9f3 1885
1689cf7e 1886if $frr_ac_bison_missing; then
0d37f9f3
DL
1887 YACC="$SHELL $missing_dir/missing bison -y"
1888 if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
1889 AC_MSG_WARN([using pregenerated bison output files])
1890 else
1891 AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
1892 fi
1893fi
bbf5ffa0 1894
edd7c245 1895dnl -------------------
1896dnl capabilities checks
1897dnl -------------------
41d3fc96 1898if test "${enable_capabilities}" != "no"; then
99e9f424
RK
1899 AC_MSG_CHECKING([whether prctl PR_SET_KEEPCAPS is available])
1900 AC_TRY_COMPILE([#include <sys/prctl.h>], [prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1901 [AC_MSG_RESULT([yes])
1902 AC_DEFINE([HAVE_PR_SET_KEEPCAPS], [1], [prctl])
8e4da10b 1903 frr_ac_keepcaps="yes"],
99e9f424 1904 AC_MSG_RESULT([no])
edd7c245 1905 )
8e4da10b 1906 if test x"${frr_ac_keepcaps}" = x"yes"; then
99e9f424 1907 AC_CHECK_HEADERS([sys/capability.h])
41d3fc96 1908 fi
1909 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
99e9f424
RK
1910 AC_CHECK_LIB([cap], [cap_init],
1911 [AC_DEFINE([HAVE_LCAPS], [1], [Capabilities])
41d3fc96 1912 LIBCAP="-lcap"
8e4da10b 1913 frr_ac_lcaps="yes"]
41d3fc96 1914 )
ceacedba 1915 else
99e9f424
RK
1916 AC_CHECK_HEADERS([priv.h],
1917 [AC_MSG_CHECKING([Solaris style privileges are available])
1918 AC_TRY_COMPILE([#include <priv.h>], [getpflags(PRIV_AWARE);],
1919 [AC_MSG_RESULT([yes])
1920 AC_DEFINE([HAVE_SOLARIS_CAPABILITIES], [1], [getpflags])
8e4da10b 1921 frr_ac_scaps="yes"],
ceacedba 1922 AC_MSG_RESULT(no)
1923 )
1924 ]
1925 )
1926 fi
8e4da10b
DL
1927 if test x"${frr_ac_scaps}" = x"yes" \
1928 -o x"${frr_ac_lcaps}" = x"yes"; then
99e9f424 1929 AC_DEFINE([HAVE_CAPABILITIES], [1], [capabilities])
41d3fc96 1930 fi
edd7c245 1931fi
99e9f424 1932AC_SUBST([LIBCAP])
edd7c245 1933
fb2d1502 1934dnl ---------------------------
1935dnl check for glibc 'backtrace'
1936dnl ---------------------------
8c99b4c1
DL
1937if test x"${enable_backtrace}" != x"no" ; then
1938 backtrace_ok=no
68b8a15f 1939 PKG_CHECK_MODULES([UNWIND], [libunwind], [
99e9f424 1940 AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
68b8a15f
DL
1941 backtrace_ok=yes
1942 ], [
1943 case "$host_os" in
1944 sunos* | solaris2*)
1945 AC_CHECK_FUNCS([printstack], [
99e9f424 1946 AC_DEFINE([HAVE_PRINTSTACK], [1], [Solaris printstack])
68b8a15f
DL
1947 backtrace_ok=yes
1948 ])
1949 ;;
1950 esac
1951 if test "$backtrace_ok" = no; then
1952 AC_CHECK_HEADER([execinfo.h], [
1953 AC_SEARCH_LIBS([backtrace], [execinfo], [
99e9f424 1954 AC_DEFINE([HAVE_GLIBC_BACKTRACE], [1], [Glibc backtrace])
68b8a15f
DL
1955 backtrace_ok=yes
1956 ],, [-lm])
1957 ])
1958 fi
eda3529e 1959 ])
8c99b4c1
DL
1960
1961 if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then
1962 dnl user explicitly requested backtrace but we failed to find support
68b8a15f 1963 AC_MSG_FAILURE([failed to find backtrace or libunwind support])
8c99b4c1
DL
1964 fi
1965fi
fb2d1502 1966
41be32bf
PJ
1967dnl -----------------------------------------
1968dnl check for malloc mallinfo struct and call
1969dnl this must try and link using LIBS, in
1970dnl order to check no alternative allocator
1971dnl has been specified, which might not provide
1972dnl mallinfo, e.g. such as Umem on Solaris.
1973dnl -----------------------------------------
324be174 1974AC_CHECK_HEADERS([malloc.h malloc_np.h malloc/malloc.h],,, [FRR_INCLUDES])
fa896a1d 1975
2a636b43
DL
1976AC_CACHE_CHECK([whether mallinfo is available], [frr_cv_mallinfo], [
1977 AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
fa896a1d
DL
1978#ifdef HAVE_MALLOC_H
1979#include <malloc.h>
1980#endif
324be174
DL
1981#ifdef HAVE_MALLOC_NP_H
1982#include <malloc_np.h>
1983#endif
fa896a1d
DL
1984#ifdef HAVE_MALLOC_MALLOC_H
1985#include <malloc/malloc.h>
1986#endif
1987]], [[
1988struct mallinfo ac_x; ac_x = mallinfo ();
1989]])], [
2a636b43
DL
1990 frr_cv_mallinfo=yes
1991 ], [
1992 frr_cv_mallinfo=no
1993 ])
fa896a1d 1994])
2a636b43 1995if test "$frr_cv_mallinfo" = yes; then
99e9f424 1996 AC_DEFINE([HAVE_MALLINFO], [1], [mallinfo])
2a636b43 1997fi
fa896a1d 1998
99e9f424 1999AC_MSG_CHECKING([whether malloc_usable_size is available])
fa896a1d
DL
2000AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2001#ifdef HAVE_MALLOC_H
2002#include <malloc.h>
2003#endif
2004#ifdef HAVE_MALLOC_MALLOC_H
2005#include <malloc/malloc.h>
2006#endif
2007]], [[
2008size_t ac_x; ac_x = malloc_usable_size(NULL);
2009]])], [
99e9f424
RK
2010 AC_MSG_RESULT([yes])
2011 AC_DEFINE([HAVE_MALLOC_USABLE_SIZE], [1], [malloc_usable_size])
fa896a1d 2012], [
99e9f424 2013 AC_MSG_RESULT([no])
fa896a1d 2014
99e9f424 2015 AC_MSG_CHECKING([whether malloc_size is available])
fa896a1d
DL
2016 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
2017#ifdef HAVE_MALLOC_H
2018#include <malloc.h>
2019#endif
2020#ifdef HAVE_MALLOC_MALLOC_H
2021#include <malloc/malloc.h>
2022#endif
2023]], [[
2024size_t ac_x; ac_x = malloc_size(NULL);
2025]])], [
99e9f424
RK
2026 AC_MSG_RESULT([yes])
2027 AC_DEFINE([HAVE_MALLOC_SIZE], [1], [malloc_size])
fa896a1d 2028 ], [
99e9f424 2029 AC_MSG_RESULT([no])
fa896a1d
DL
2030 ])
2031])
41be32bf 2032
b6116506
DL
2033dnl ------
2034dnl ZeroMQ
2035dnl ------
2036if test "x$enable_zeromq" != "xno"; then
99e9f424
RK
2037 PKG_CHECK_MODULES([ZEROMQ], [libzmq >= 4.0.0], [
2038 AC_DEFINE([HAVE_ZEROMQ], [1], [Enable ZeroMQ support])
b6116506
DL
2039 ZEROMQ=true
2040 ], [
2041 if test "x$enable_zeromq" = "xyes"; then
2042 AC_MSG_ERROR([configuration specifies --enable-zeromq but libzmq was not found])
2043 fi
2044 ])
2045fi
99e9f424 2046AM_CONDITIONAL([ZEROMQ], [test "x$ZEROMQ" = "xtrue"])
b6116506 2047
408ad943 2048dnl ----------
2049dnl configure date
2050dnl ----------
5e2dd3fa
LB
2051dev_version=`echo $VERSION | grep dev`
2052#don't expire deprecated code in non 'dev' branch
2053if test "${dev_version}" = ""; then
2054 CONFDATE=0
2055else
2056 CONFDATE=`date '+%Y%m%d'`
2057fi
99e9f424 2058AC_SUBST([CONFDATE])
408ad943 2059
7ea487bc 2060dnl ------------------------------
a159ed93 2061dnl set paths for state directory
23bd12c3 2062dnl ------------------------------
99e9f424 2063AC_MSG_CHECKING([directory to use for state file])
23bd12c3 2064if test "${prefix}" = "NONE"; then
b2f36157 2065 frr_statedir_prefix="";
23bd12c3 2066else
b2f36157 2067 frr_statedir_prefix=${prefix}
23bd12c3 2068fi
2069if test "${localstatedir}" = '${prefix}/var'; then
8e4da10b 2070 for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
b2f36157
DL
2071 ${frr_statedir_prefix}/var/adm dnl
2072 ${frr_statedir_prefix}/etc dnl
a159ed93 2073 /var/run dnl
2074 /var/adm dnl
2075 /etc dnl
2076 /dev/null;
23bd12c3 2077 do
8e4da10b 2078 test -d $FRR_STATE_DIR && break
23bd12c3 2079 done
8e4da10b 2080 frr_statedir=$FRR_STATE_DIR
23bd12c3 2081else
b2f36157 2082 frr_statedir=${localstatedir}
a159ed93 2083fi
b2f36157 2084if test $frr_statedir = "/dev/null"; then
99e9f424 2085 AC_MSG_ERROR([STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!])
a159ed93 2086fi
99e9f424
RK
2087AC_MSG_RESULT([${frr_statedir}])
2088AC_SUBST([frr_statedir])
b2f36157 2089
99e9f424
RK
2090AC_DEFINE_UNQUOTED([LDPD_SOCKET], ["$frr_statedir/ldpd.sock"], [ldpd control socket])
2091AC_DEFINE_UNQUOTED([ZEBRA_SERV_PATH], ["$frr_statedir/zserv.api"], [zebra api socket])
2092AC_DEFINE_UNQUOTED([BFDD_CONTROL_SOCKET], ["$frr_statedir/bfdd.sock"], [bfdd control socket])
2093AC_DEFINE_UNQUOTED([DAEMON_VTY_DIR], ["$frr_statedir"], [daemon vty directory])
2094AC_DEFINE_UNQUOTED([DAEMON_DB_DIR], ["$frr_statedir"], [daemon database directory])
7ea487bc 2095
95c4aff2
DL
2096dnl autoconf does this, but it does it too late...
2097test "x$prefix" = xNONE && prefix=$ac_default_prefix
2098test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
2099
2100dnl get the full path, recursing through variables...
2101vtysh_bin="$bindir/vtysh"
2102for I in 1 2 3 4 5 6 7 8 9 10; do
2103 eval vtysh_bin="\"$vtysh_bin\""
2104done
99e9f424
RK
2105AC_DEFINE_UNQUOTED([VTYSH_BIN_PATH], ["$vtysh_bin"], [path to vtysh binary])
2106AC_SUBST([vtysh_bin])
95c4aff2 2107
a07169b1
DL
2108CFG_SYSCONF="$sysconfdir"
2109CFG_SBIN="$sbindir"
2110CFG_STATE="$frr_statedir"
30771d65 2111CFG_MODULE="$moduledir"
1c2facd1
RW
2112CFG_YANGMODELS="$yangmodelsdir"
2113CFG_LIBYANG_PLUGINS="$libyang_pluginsdir"
a07169b1
DL
2114for I in 1 2 3 4 5 6 7 8 9 10; do
2115 eval CFG_SYSCONF="\"$CFG_SYSCONF\""
2116 eval CFG_SBIN="\"$CFG_SBIN\""
2117 eval CFG_STATE="\"$CFG_STATE\""
30771d65 2118 eval CFG_MODULE="\"$CFG_MODULE\""
1c2facd1
RW
2119 eval CFG_YANGMODELS="\"$CFG_YANGMODELS\""
2120 eval CFG_LIBYANG_PLUGINS="\"$CFG_LIBYANG_PLUGINS\""
a07169b1 2121done
99e9f424
RK
2122AC_SUBST([CFG_SYSCONF])
2123AC_SUBST([CFG_SBIN])
2124AC_SUBST([CFG_STATE])
2125AC_SUBST([CFG_MODULE])
2126AC_SUBST([CFG_YANGMODELS])
2127AC_SUBST([CFG_LIBYANG_PLUGINS])
2128AC_DEFINE_UNQUOTED([MODULE_PATH], ["$CFG_MODULE"], [path to modules])
2129AC_DEFINE_UNQUOTED([YANG_MODELS_PATH], ["$CFG_YANGMODELS"], [path to YANG data models])
2130AC_DEFINE_UNQUOTED([LIBYANG_PLUGINS_PATH], ["$CFG_LIBYANG_PLUGINS"], [path to libyang plugins])
a07169b1 2131
dabecd7c
MR
2132dnl ------------------------------------
2133dnl Enable RPKI and add librtr to libs
2134dnl ------------------------------------
2135if test "${enable_rpki}" = "yes"; then
99e9f424 2136 PKG_CHECK_MODULES([RTRLIB], [rtrlib >= 0.5.0],
086aec2a 2137 [RPKI=true],
dabecd7c
MR
2138 [RPKI=false
2139 AC_MSG_ERROR([rtrlib was not found on your system or is too old.])]
2140 )
2141fi
99e9f424 2142AM_CONDITIONAL([RPKI], [test "x$RPKI" = "xtrue"])
dabecd7c
MR
2143
2144dnl ------------------------------------------
2145dnl Check whether rtrlib was build with ssh support
2146dnl ------------------------------------------
2147AC_MSG_CHECKING([whether the RTR Library is compiled with SSH])
2148AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "rtrlib/rtrlib.h"]],
2149 [[struct tr_ssh_config config;]])],
99e9f424
RK
2150 [AC_MSG_RESULT([yes])
2151 AC_DEFINE([FOUND_SSH], [1], [found_ssh])],
2152 AC_MSG_RESULT([no])
dabecd7c
MR
2153)
2154
7ea487bc 2155dnl ---------------------------
2156dnl Check htonl works correctly
2157dnl ---------------------------
99e9f424 2158AC_MSG_CHECKING([for working htonl])
6f0e3f6e 2159AC_CACHE_VAL(ac_cv_htonl_works,
8e4da10b 2160 [AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES],[htonl (0);])],
6f0e3f6e
PJ
2161 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
2162 ]
2163)
99e9f424 2164AC_MSG_RESULT([$ac_cv_htonl_works])
7ea487bc 2165
892d21b1
DL
2166AC_CONFIG_FILES([Makefile],[sed -e 's/^#AUTODERP# //' -i Makefile])
2167
2168AC_CONFIG_FILES([
06871ed9 2169 config.version
22ea387f 2170 redhat/frr.spec
e3863245 2171 solaris/Makefile
5eee7099 2172 debianpkg/changelog
c737c7ba 2173 alpine/APKBUILD
3ab11ecc 2174 snapcraft/snapcraft.yaml
b7a97f82 2175 lib/version.h
8efe88ea 2176 tests/lib/cli/test_cli.refout
cbd04084 2177 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
7f57883e
DS
2178 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
2179 pkgsrc/eigrpd.sh])
65efcfce 2180
99e9f424
RK
2181AC_CONFIG_FILES([vtysh/extract.pl], [chmod +x vtysh/extract.pl])
2182AC_CONFIG_FILES([tools/frr], [chmod +x tools/frr])
ea4d91bf
DL
2183AC_CONFIG_FILES([tools/watchfrr.sh], [chmod +x tools/watchfrr.sh])
2184AC_CONFIG_FILES([tools/frrinit.sh], [chmod +x tools/frrinit.sh])
2185AC_CONFIG_FILES([tools/frrcommon.sh])
65efcfce 2186
306ed681
DL
2187AC_CONFIG_COMMANDS([lib/route_types.h], [
2188 dst="${ac_abs_top_builddir}/lib/route_types.h"
2189 ${PERL} "${ac_abs_top_srcdir}/lib/route_types.pl" \
2190 < "${ac_abs_top_srcdir}/lib/route_types.txt" \
2191 > "${dst}.tmp"
2192 test -f "${dst}" \
2193 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2194 && rm "${dst}.tmp" \
2195 || mv "${dst}.tmp" "${dst}"
2196], [
2197 PERL="$PERL"
2198])
2199
2200AS_IF([test "x$with_pkg_git_version" = "xyes"], [
2201 AC_CONFIG_COMMANDS([lib/gitversion.h], [
2202 dst="${ac_abs_top_builddir}/lib/gitversion.h"
2203 ${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
2204 "${ac_abs_top_srcdir}" \
2205 > "${dst}.tmp"
2206 test -f "${dst}" \
2207 && diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2208 && rm "${dst}.tmp" \
2209 || mv "${dst}.tmp" "${dst}"
2210 ], [
2211 PERL="$PERL"
2212 ])
2213])
2214
1689cf7e 2215## Hack, but working solution to avoid rebuilding of frr.info.
48577196 2216## It's already in CVS until texinfo 4.7 is more common.
14c17fd8 2217AC_OUTPUT
7ea487bc 2218
2219echo "
447a8fe9 2220FRRouting configuration
b2f36157
DL
2221------------------------------
2222FRR version : ${PACKAGE_VERSION}
1080c13f 2223host operating system : ${host_os}
7ea487bc 2224source code location : ${srcdir}
2225compiler : ${CC}
dbac691d 2226compiler flags : ${CFLAGS} ${SAN_FLAGS}
6f0e3f6e 2227make : ${MAKE-make}
dbac691d 2228linker flags : ${LDFLAGS} ${SAN_FLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
b2f36157 2229state file directory : ${frr_statedir}
dc7a2bf1 2230config file directory : `eval echo \`echo ${sysconfdir}\``
d6b72f7a 2231example directory : `eval echo \`echo ${exampledir}\``
30771d65 2232module directory : ${CFG_MODULE}
b2f36157
DL
2233user to run as : ${enable_user}
2234group to run as : ${enable_group}
2235group for vty sockets : ${enable_vty_group}
aa593d5e 2236config file mask : ${enable_configfile_mask}
2237log file mask : ${enable_logfile_mask}
2b2f275e 2238zebra protobuf enabled : ${enable_protobuf:-no}
dc7a2bf1 2239
2240The above user and group must have read/write access to the state file
105b8239 2241directory and to the config files in the config file directory."
410a2492
JAG
2242
2243if test "${enable_doc}" != "no";then
f4f2f2cc 2244 AS_IF([test "$SPHINXBUILD" = /bin/false],
99e9f424 2245 AC_MSG_WARN([sphinx-build is missing but required to build documentation]))
410a2492 2246fi