1##
2## Configure template file for FRRouting.
3## autoconf will generate a configure script.
4##
5##  Copyright (c) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro <kunihiro@zebra.org>
6##  Portions Copyright (c) 2003 Paul Jakma <paul@dishone.st>
7##
8AC_PREREQ([2.60])
9
10AC_INIT([frr], [7.5.1], [https://github.com/frrouting/frr/issues])
11PACKAGE_URL="https://frrouting.org/"
12AC_SUBST([PACKAGE_URL])
13PACKAGE_FULLNAME="FRRouting"
14AC_SUBST([PACKAGE_FULLNAME])
15
16CONFIG_ARGS="`echo $ac_configure_args | sed -e \"s% '[[A-Z]]*FLAGS=[[^']]\+'%%g\"`"
17AC_SUBST([CONFIG_ARGS])
18
19AC_CONFIG_SRCDIR([lib/zebra.h])
20AC_CONFIG_MACRO_DIR([m4])
21
22dnl -----------------------------------
23dnl Get hostname and other information.
24dnl -----------------------------------
25AC_CANONICAL_BUILD()
26AC_CANONICAL_HOST()
27
28hosttools_clippy="false"
29build_clippy="true"
30
31dnl case 1: external clippy
32if test -n "$with_clippy" -a "$with_clippy" != "no" -a "$with_clippy" != "yes"; then
33  if test "$enable_clippy_only" = "yes"; then
34    AC_MSG_ERROR([--enable-clippy-only does not make sense with --with-clippy])
35  fi
36
37  CLIPPY="$with_clippy"
38  build_clippy="false"
39  if test ! -x "$with_clippy"; then
40    AC_MSG_ERROR([clippy tool ($with_clippy) is not executable])
41  fi
42
43dnl case 2: cross-compiling internal clippy
44elif test "$host" != "$build"; then
45  if test "$srcdir" = "."; then
46    AC_MSG_ERROR([cross-compilation is only possible with builddir separate from srcdir or by building clippy separately and using the --with-clippy option.  create a separate directory and run as .../path-to-frr/configure.])
47  fi
48  test -d hosttools || mkdir hosttools
49  abssrc="`cd \"${srcdir}\"; pwd`"
50
51  AC_MSG_NOTICE([...])
52  AC_MSG_NOTICE([... cross-compilation: creating hosttools directory and self-configuring for build platform tools])
53  AC_MSG_NOTICE([... use HOST_CPPFLAGS / HOST_CFLAGS / HOST_LDFLAGS if neccessary])
54  AC_MSG_NOTICE([...])
55
56  (
57    for var in $ac_precious_vars; do
58      dnl special cases
59      case "$var" in
60      YACC|YFLAGS) continue;;
61      PYTHON*)     retain=true;;
62      *)           retain=false;
63      esac
64
65      eval "hostvar=\"\${HOST_$var}\""
66      eval "targetvar=\"\${$var}\""
67      if test -n "$hostvar"; then
68        eval "$var='$hostvar'"
69        _AS_ECHO_LOG([host $var='$hostvar'])
70      elif $retain; then
71        _AS_ECHO_LOG([host retain $var='$targetvar'])
72      else
73        eval "unset $var"
74        _AS_ECHO_LOG([host unset $var])
75      fi
76    done
77    cd hosttools
78    "${abssrc}/configure" "--host=$build" "--build=$build" "--enable-clippy-only" "--disable-nhrpd" "--disable-vtysh"
79  ) || exit 1
80
81  AC_MSG_NOTICE([...])
82  AC_MSG_NOTICE([... cross-compilation: finished self-configuring for build platform tools])
83  AC_MSG_NOTICE([...])
84
85  build_clippy="false"
86  hosttools_clippy="true"
87  CLIPPY="hosttools/lib/clippy"
88
89dnl case 3: normal build internal clippy
90else
91  CLIPPY="lib/clippy\$(EXEEXT)"
92fi
93AC_SUBST([CLIPPY])
94AM_CONDITIONAL([BUILD_CLIPPY], [$build_clippy])
95AM_CONDITIONAL([HOSTTOOLS_CLIPPY], [$hosttools_clippy])
96AM_CONDITIONAL([ONLY_CLIPPY], [test "$enable_clippy_only" = "yes"])
97
98# Disable portability warnings -- our automake code (in particular
99# common.am) uses some constructs specific to gmake.
100AM_INIT_AUTOMAKE([1.12 -Wno-portability foreign])
101m4_ifndef([AM_SILENT_RULES], [m4_define([AM_SILENT_RULES],[])])
102AM_SILENT_RULES([yes])
103AC_CONFIG_HEADERS([config.h])
104
105AC_PATH_PROG([PERL], [perl])
106PKG_PROG_PKG_CONFIG
107
108dnl default is to match previous behavior
109exampledir=${sysconfdir}
110AC_ARG_ENABLE([exampledir],
111	  AS_HELP_STRING([--enable-exampledir],
112			 [specify alternate directory for examples]),
113			 exampledir="$enableval",)
114dnl XXX add --exampledir to autoconf standard directory list somehow
115AC_SUBST([exampledir])
116
117dnl default is to match previous behavior
118pkgsrcrcdir=""
119AC_ARG_ENABLE([pkgsrcrcdir],
120	  AS_HELP_STRING([--enable-pkgsrcrcdir],
121			 [specify directory for rc.d scripts]),
122			 pkgsrcrcdir="$enableval",)
123dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
124AC_SUBST([pkgsrcrcdir])
125AM_CONDITIONAL([PKGSRC], [test "$pkgsrcrcdir" != ""])
126
127AC_ARG_WITH([moduledir], [AS_HELP_STRING([--with-moduledir=DIR], [module directory (${libdir}/frr/modules)])], [
128	moduledir="$withval"
129], [
130	moduledir="\${libdir}/frr/modules"
131])
132AC_SUBST([moduledir], [$moduledir])
133
134
135AC_ARG_WITH([yangmodelsdir], [AS_HELP_STRING([--with-yangmodelsdir=DIR], [yang models directory (${datarootdir}/yang)])], [
136	yangmodelsdir="$withval"
137], [
138	yangmodelsdir="\${datarootdir}/yang"
139])
140AC_SUBST([yangmodelsdir])
141
142AC_ARG_ENABLE(tcmalloc,
143	AS_HELP_STRING([--enable-tcmalloc], [Turn on tcmalloc]),
144[case "${enableval}" in
145  yes) tcmalloc_enabled=true
146LIBS="$LIBS -ltcmalloc_minimal"
147 ;;
148  no)  tcmalloc_enabled=false ;;
149  *) AC_MSG_ERROR([bad value ${enableval} for --enable-tcmalloc]) ;;
150esac],[tcmalloc_enabled=false])
151
152
153dnl Thanks autoconf, but we don't want a default -g -O2.  We have our own
154dnl flag determination logic.
155CFLAGS="${CFLAGS:-}"
156
157dnl --------------------
158dnl Check CC and friends
159dnl --------------------
160dnl note orig_cflags is also used further down
161orig_cflags="$CFLAGS"
162orig_cxxflags="$CXXFLAGS"
163AC_LANG([C])
164AC_PROG_CC
165AC_PROG_CPP
166AC_PROG_CXX
167AM_PROG_CC_C_O
168dnl remove autoconf default "-g -O2"
169CFLAGS="$orig_cflags"
170CXXFLAGS="$orig_cxxflags"
171AC_PROG_CC_C99
172dnl NB: see C11 below
173
174PKG_PROG_PKG_CONFIG
175
176dnl it's 2019, sed is sed.
177SED=sed
178AC_SUBST([SED])
179
180dnl try and enable CFLAGS that are useful for FRR
181dnl - specifically, options to control warnings
182
183AC_USE_SYSTEM_EXTENSIONS
184AC_DEFUN([AC_C_FLAG], [{
185    m4_pushdef([cachename],[m4_translit([frr_cv_$1],[ =-+/{}$],[________])])
186    AC_CACHE_CHECK([[whether $CC supports $1]], cachename, [
187	AC_LANG_PUSH([C])
188	ac_c_flag_save="$CFLAGS"
189	CFLAGS="$CFLAGS $1"
190	AC_COMPILE_IFELSE(
191		[AC_LANG_PROGRAM([[$4]])],
192		[
193			cachename=yes
194		], [
195			cachename=no
196		])
197	CFLAGS="$ac_c_flag_save"
198	AC_LANG_POP([C])
199    ])
200    if test "$cachename" = "yes"; then
201	m4_if([$3], [], [CFLAGS="$CFLAGS $1"], [$3])
202    else
203	:
204	$2
205    fi
206    m4_popdef([cachename])
207}])
208
209AC_DEFUN([AC_LINK_IFELSE_FLAGS], [{
210	AC_LANG_PUSH([C])
211	ac_cflags_save="$CFLAGS"
212	ac_libs_save="$LIBS"
213	CFLAGS="$CFLAGS $1"
214	LIBS="$LIBS $2"
215	AC_LINK_IFELSE(
216		[$3],
217		[
218			CFLAGS="$ac_cflags_save"
219			LIBS="$ac_libs_save"
220			m4_default([$5], [
221				AC_MSG_RESULT([yes])
222			])
223		], [
224			CFLAGS="$ac_cflags_save"
225			LIBS="$ac_libs_save"
226			m4_default([$4], [
227				AC_MSG_RESULT([no])
228			])
229		])
230	AC_LANG_POP([C])
231	}])
232
233dnl ICC won't bail on unknown options without -diag-error 10006
234dnl need to do this first so we get useful results for the other options
235AC_C_FLAG([-diag-error 10006])
236
237dnl AC_PROG_CC_C99 may change CC to include -std=gnu99 or something
238ac_cc="$CC"
239CC="${CC% -std=gnu99}"
240CC="${CC% -std=c99}"
241
242AC_C_FLAG([-std=gnu11], [CC="$ac_cc"], [CC="$CC -std=gnu11"])
243
244dnl if the user has specified any CFLAGS, override our settings
245if test "$enable_gcov" = "yes"; then
246   if test "$orig_cflags" = ""; then
247      AC_C_FLAG([-coverage])
248      AC_C_FLAG([-O0])
249   fi
250
251   LDFLAGS="${LDFLAGS} -lgcov"
252fi
253
254if test "$enable_clang_coverage" = "yes"; then
255   AC_C_FLAG([-fprofile-instr-generate], [
256     AC_MSG_ERROR([$CC does not support -fprofile-instr-generate.])
257   ])
258   AC_C_FLAG([-fcoverage-mapping], [
259     AC_MSG_ERROR([$CC does not support -fcoverage-mapping.])
260   ])
261fi
262
263if test "$enable_dev_build" = "yes"; then
264   AC_DEFINE([DEV_BUILD], [1], [Build for development])
265   if test "$orig_cflags" = ""; then
266      AC_C_FLAG([-g3])
267      AC_C_FLAG([-O0])
268   fi
269   if test "$enable_lua" = "yes"; then
270      AX_PROG_LUA([5.3])
271      AX_LUA_HEADERS
272      AX_LUA_LIBS([
273         AC_DEFINE([HAVE_LUA], [1], [Have support for Lua interpreter])
274         LIBS="$LIBS $LUA_LIB"
275      ])
276   fi
277else
278   if test "$enable_lua" = "yes"; then
279      AC_MSG_ERROR([Lua is not meant to be built/used outside of development at this time])
280   fi
281   if test "$orig_cflags" = ""; then
282      AC_C_FLAG([-g])
283      AC_C_FLAG([-O2])
284   fi
285fi
286AM_CONDITIONAL([DEV_BUILD], [test "$enable_dev_build" = "yes"])
287
288dnl always want these CFLAGS
289AC_C_FLAG([-fno-omit-frame-pointer])
290AC_C_FLAG([-funwind-tables])
291AC_C_FLAG([-Wall])
292AC_C_FLAG([-Wextra])
293AC_C_FLAG([-Wmissing-prototypes])
294AC_C_FLAG([-Wmissing-declarations])
295AC_C_FLAG([-Wpointer-arith])
296AC_C_FLAG([-Wbad-function-cast])
297AC_C_FLAG([-Wwrite-strings])
298AC_C_FLAG([-Wundef])
299if test "$enable_gcc_ultra_verbose" = "yes" ; then
300  AC_C_FLAG([-Wcast-qual])
301  AC_C_FLAG([-Wstrict-prototypes])
302  AC_C_FLAG([-Wmissing-noreturn])
303  AC_C_FLAG([-Wmissing-format-attribute])
304  AC_C_FLAG([-Wunreachable-code])
305  AC_C_FLAG([-Wpacked])
306  AC_C_FLAG([-Wpadded])
307  AC_C_FLAG([-Wshadow])
308else
309  AC_C_FLAG([-Wno-unused-result])
310fi
311AC_C_FLAG([-Wno-unused-parameter])
312AC_C_FLAG([-Wno-missing-field-initializers])
313
314AC_C_FLAG([-Wc++-compat], [], [CXX_COMPAT_CFLAGS="-Wc++-compat"])
315AC_SUBST([CXX_COMPAT_CFLAGS])
316
317dnl ICC emits a broken warning for const char *x = a ? "b" : "c";
318dnl for some reason the string consts get 'promoted' to char *,
319dnl triggering a const to non-const conversion warning.
320AC_C_FLAG([-diag-disable 3179])
321
322if test "$enable_werror" = "yes" ; then
323  WERROR="-Werror"
324fi
325AC_SUBST([WERROR])
326
327SAN_FLAGS=""
328if test "$enable_address_sanitizer" = "yes"; then
329  AC_C_FLAG([-fsanitize=address], [
330    AC_MSG_ERROR([$CC does not support Address Sanitizer.])
331  ], [
332    SAN_FLAGS="$SAN_FLAGS -fsanitize=address"
333  ])
334fi
335if test "$enable_thread_sanitizer" = "yes"; then
336  AC_C_FLAG([-fsanitize=thread], [
337    AC_MSG_ERROR([$CC does not support Thread Sanitizer.])
338  ], [
339    SAN_FLAGS="$SAN_FLAGS -fsanitize=thread"
340  ])
341fi
342if test "$enable_memory_sanitizer" = "yes"; then
343  AC_C_FLAG([-fsanitize=memory -fPIE -pie], [
344    AC_MSG_ERROR([$CC does not support Memory Sanitizer.])
345  ], [
346    SAN_FLAGS="$SAN_FLAGS -fsanitize=memory -fPIE -pie"
347  ])
348fi
349if test "$enable_undefined_sanitizer" = "yes"; then
350  AC_C_FLAG([-fsanitize=undefined], [
351    AC_MSG_ERROR([$CC does not support UndefinedBehaviorSanitizer.])
352  ], [
353    SAN_FLAGS="$SAN_FLAGS -fsanitize=undefined"
354  ])
355fi
356AC_SUBST([SAN_FLAGS])
357
358dnl frr-format.so
359if test "$with_frr_format" != "no" -a "$with_frr_format" != "yes" -a -n "$with_frr_format"; then
360  AC_C_FLAG([-fplugin=${with_frr_format}], [
361    AC_MSG_ERROR([specified frr-format plugin ($with_frr_format) does not work])
362  ],,[
363#ifndef _FRR_ATTRIBUTE_PRINTFRR
364#error plugin not loaded
365#endif
366#if _FRR_ATTRIBUTE_PRINTFRR < 0x10000
367#error plugin too old
368#endif
369  ])
370elif test "$with_frr_format" = "no"; then
371  : #nothing
372else
373  AC_C_FLAG([-fplugin=tools/gcc-plugins/frr-format.so],[
374    AC_C_FLAG([-fplugin=frr-format],[
375      if test "$with_frr_format" = "yes"; then
376        AC_MSG_ERROR([frr-format plugin requested but not found])
377      fi
378    ],,[
379#ifndef _FRR_ATTRIBUTE_PRINTFRR
380#error plugin not loaded
381#endif
382#if _FRR_ATTRIBUTE_PRINTFRR < 0x10000
383#error plugin too old
384#endif
385    ])
386  ],,[
387#ifndef _FRR_ATTRIBUTE_PRINTFRR
388#error plugin not loaded
389#endif
390#if _FRR_ATTRIBUTE_PRINTFRR < 0x10000
391#error plugin too old
392#endif
393  ])
394fi
395
396dnl ----------
397dnl Essentials
398dnl ----------
399
400AX_PTHREAD([
401  CC="$PTHREAD_CC"
402  CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
403  LIBS="$PTHREAD_LIBS $LIBS"
404], [
405  AC_MSG_FAILURE([This FRR version needs pthreads])
406])
407
408AC_SEARCH_LIBS([pthread_condattr_setclock], [],
409		[frr_cv_pthread_condattr_setclock=yes],
410		[frr_cv_pthread_condattr_setclock=no])
411if test "$frr_cv_pthread_condattr_setclock" = "yes"; then
412  AC_DEFINE([HAVE_PTHREAD_CONDATTR_SETCLOCK], [1], [Have pthread.h pthread_condattr_setclock])
413fi
414
415dnl --------------
416dnl Check programs
417dnl --------------
418AC_PROG_INSTALL
419AC_PROG_LN_S
420AC_CHECK_TOOL([AR], [ar])
421
422dnl -------
423dnl libtool
424dnl -------
425AC_ARG_ENABLE([static-bin],
426  AS_HELP_STRING([--enable-static-bin], [link binaries statically]))
427LT_INIT
428_LT_CONFIG_LIBTOOL([
429  patch -N -i "${srcdir}/m4/libtool-whole-archive.patch" libtool >&AS_MESSAGE_LOG_FD || \
430    AC_MSG_WARN([Could not patch libtool for static linking support.  Loading modules into a statically linked daemon will fail.])
431  sed -e 's%func_warning "relinking%true #\0%' -i libtool || true
432  sed -e 's%func_warning "remember to run%true #\0%' -i libtool || true
433  sed -e 's%func_warning ".*has not been installed in%true #\0%' -i libtool || true
434])
435if test "$enable_static_bin" = "yes"; then
436  AC_LDFLAGS="-static"
437  if test "$enable_static" != "yes"; then
438    AC_MSG_ERROR([The --enable-static-bin option must be combined with --enable-static.])
439  fi
440fi
441if test "$enable_shared" != "yes"; then
442  AC_MSG_ERROR([FRR cannot be built with --disable-shared.  If you want statically linked daemons, use --enable-shared --enable-static --enable-static-bin])
443fi
444AC_SUBST([AC_LDFLAGS])
445AM_CONDITIONAL([STATIC_BIN], [test "$enable_static_bin" = "yes"])
446
447dnl $AR and $RANLIB are set by LT_INIT above
448AC_MSG_CHECKING([whether $AR supports D option])
449if $AR crD conftest.a >/dev/null 2>/dev/null; then
450  AC_MSG_RESULT([yes])
451  dnl ARFLAGS is for automake, AR_FLAGS for libtool m-(
452  ARFLAGS="crD"
453  AR_FLAGS="crD"
454else
455  AC_MSG_RESULT([no])
456  ARFLAGS="cru"
457  AR_FLAGS="cru"
458fi
459AC_SUBST([ARFLAGS])
460AC_SUBST([AR_FLAGS])
461
462AC_MSG_CHECKING([whether $RANLIB supports D option])
463if $RANLIB -D conftest.a >conftest.err 2>&1; then
464  if grep -q -- '-D' conftest.err; then
465    AC_MSG_RESULT([no])
466  else
467    AC_MSG_RESULT([yes])
468    RANLIB="$RANLIB -D"
469  fi
470else
471  AC_MSG_RESULT([no])
472fi
473AC_SUBST([RANLIB])
474
475test -f conftest.err && rm conftest.err
476test -f conftest.a && rm conftest.a
477
478dnl ----------------------
479dnl Packages configuration
480dnl ----------------------
481if test -f config.version; then
482  . ./config.version
483elif test -f "${srcdir}/config.version"; then
484  . "${srcdir}/config.version"
485fi
486AC_ARG_WITH([pkg-extra-version],
487  AS_HELP_STRING([--with-pkg-extra-version=VER], [add extra version field, for packagers/distributions]), [
488  if test "$withval" = "no"; then
489    EXTRAVERSION=
490  else
491    EXTRAVERSION=$withval
492  fi
493], [])
494AC_ARG_WITH([pkg-git-version],
495	AS_HELP_STRING([--with-pkg-git-version], [add git information to MOTD and build version string]),
496	[ test "$withval" != "no" && with_pkg_git_version="yes" ])
497AC_ARG_WITH([clippy],
498  AS_HELP_STRING([--with-clippy=PATH], [use external clippy helper program]))
499AC_ARG_WITH([vtysh_pager],
500	AS_HELP_STRING([--with-vtysh-pager=PAGER], [control what pager is compiled in as default]),
501	VTYSH_PAGER=$withval, VTYSH_PAGER="more")
502AC_ARG_ENABLE([vtysh],
503  AS_HELP_STRING([--disable-vtysh], [do not build integrated vty shell for FRR]))
504AC_ARG_ENABLE([doc],
505  AS_HELP_STRING([--disable-doc], [do not build docs]))
506AC_ARG_ENABLE([doc-html],
507  AS_HELP_STRING([--enable-doc-html], [build HTML docs]))
508AC_ARG_ENABLE([zebra],
509  AS_HELP_STRING([--disable-zebra], [do not build zebra daemon]))
510AC_ARG_ENABLE([bgpd],
511  AS_HELP_STRING([--disable-bgpd], [do not build bgpd]))
512AC_ARG_ENABLE([ripd],
513  AS_HELP_STRING([--disable-ripd], [do not build ripd]))
514AC_ARG_ENABLE([ripngd],
515  AS_HELP_STRING([--disable-ripngd], [do not build ripngd]))
516AC_ARG_ENABLE([ospfd],
517  AS_HELP_STRING([--disable-ospfd], [do not build ospfd]))
518AC_ARG_ENABLE([ospf6d],
519  AS_HELP_STRING([--disable-ospf6d], [do not build ospf6d]))
520AC_ARG_ENABLE([ldpd],
521  AS_HELP_STRING([--disable-ldpd], [do not build ldpd]))
522AC_ARG_ENABLE([nhrpd],
523  AS_HELP_STRING([--disable-nhrpd], [do not build nhrpd]))
524AC_ARG_ENABLE([eigrpd],
525  AS_HELP_STRING([--disable-eigrpd], [do not build eigrpd]))
526AC_ARG_ENABLE([babeld],
527  AS_HELP_STRING([--disable-babeld], [do not build babeld]))
528AC_ARG_ENABLE([watchfrr],
529  AS_HELP_STRING([--disable-watchfrr], [do not build watchfrr]))
530AC_ARG_ENABLE([isisd],
531  AS_HELP_STRING([--disable-isisd], [do not build isisd]))
532AC_ARG_ENABLE([pimd],
533  AS_HELP_STRING([--disable-pimd], [do not build pimd]))
534AC_ARG_ENABLE([pbrd],
535  AS_HELP_STRING([--disable-pbrd], [do not build pbrd]))
536AC_ARG_ENABLE([sharpd],
537  AS_HELP_STRING([--enable-sharpd], [build sharpd]))
538AC_ARG_ENABLE([staticd],
539  AS_HELP_STRING([--disable-staticd], [do not build staticd]))
540AC_ARG_ENABLE([fabricd],
541  AS_HELP_STRING([--disable-fabricd], [do not build fabricd]))
542AC_ARG_ENABLE([vrrpd],
543  AS_HELP_STRING([--disable-vrrpd], [do not build vrrpd]))
544AC_ARG_ENABLE([bgp-announce],
545  AS_HELP_STRING([--disable-bgp-announce], [turn off BGP route announcement]))
546AC_ARG_ENABLE([bgp-vnc],
547  AS_HELP_STRING([--disable-bgp-vnc],[turn off BGP VNC support]))
548AC_ARG_ENABLE([bgp-bmp],
549  AS_HELP_STRING([--disable-bgp-bmp],[turn off BGP BMP support]))
550AC_ARG_ENABLE([snmp],
551  AS_HELP_STRING([--enable-snmp], [enable SNMP support for agentx]))
552AC_ARG_ENABLE([config_rollbacks],
553  AS_HELP_STRING([--enable-config-rollbacks], [enable configuration rollbacks (requires sqlite3)]))
554AC_ARG_ENABLE([confd],
555  AS_HELP_STRING([--enable-confd=ARG], [enable confd integration]))
556AC_ARG_ENABLE([sysrepo],
557  AS_HELP_STRING([--enable-sysrepo], [enable sysrepo integration]))
558AC_ARG_ENABLE([grpc],
559  AS_HELP_STRING([--enable-grpc], [enable the gRPC northbound plugin]))
560AC_ARG_ENABLE([zeromq],
561  AS_HELP_STRING([--enable-zeromq], [enable ZeroMQ handler (libfrrzmq)]))
562AC_ARG_WITH([libpam],
563  AS_HELP_STRING([--with-libpam], [use libpam for PAM support in vtysh]))
564AC_ARG_ENABLE([ospfapi],
565  AS_HELP_STRING([--disable-ospfapi], [do not build OSPFAPI to access the OSPF LSA Database]))
566AC_ARG_ENABLE([ospfclient],
567  AS_HELP_STRING([--disable-ospfclient], [do not build OSPFAPI client for OSPFAPI,
568                          (this is the default if --disable-ospfapi is set)]))
569AC_ARG_ENABLE([multipath],
570  AS_HELP_STRING([--enable-multipath=ARG], [enable multipath function, ARG must be digit]))
571AC_ARG_ENABLE([user],
572  AS_HELP_STRING([--enable-user=USER], [user to run FRR suite as (default frr)]))
573AC_ARG_ENABLE([group],
574  AS_HELP_STRING([--enable-group=GROUP], [group to run FRR suite as (default frr)]))
575AC_ARG_ENABLE([vty_group],
576  AS_HELP_STRING([--enable-vty-group=ARG], [set vty sockets to have specified group as owner]))
577AC_ARG_ENABLE([configfile_mask],
578  AS_HELP_STRING([--enable-configfile-mask=ARG], [set mask for config files]))
579AC_ARG_ENABLE([logfile_mask],
580  AS_HELP_STRING([--enable-logfile-mask=ARG], [set mask for log files]))
581AC_ARG_ENABLE([shell_access],
582  AS_HELP_STRING([--enable-shell-access], [Allow users to access shell/telnet/ssh]))
583AC_ARG_ENABLE([realms],
584  AS_HELP_STRING([--enable-realms], [enable REALMS support under Linux]))
585AC_ARG_ENABLE([rtadv],
586  AS_HELP_STRING([--disable-rtadv], [disable IPV6 router advertisement feature]))
587AC_ARG_ENABLE([irdp],
588  AS_HELP_STRING([--disable-irdp], [disable IRDP server support in zebra (enabled by default if supported)]))
589AC_ARG_ENABLE([capabilities],
590  AS_HELP_STRING([--disable-capabilities], [disable using POSIX capabilities]))
591AC_ARG_ENABLE([rusage],
592  AS_HELP_STRING([--disable-rusage], [disable using getrusage]))
593AC_ARG_ENABLE([gcc_ultra_verbose],
594  AS_HELP_STRING([--enable-gcc-ultra-verbose], [enable ultra verbose GCC warnings]))
595AC_ARG_ENABLE([backtrace],
596  AS_HELP_STRING([--disable-backtrace], [disable crash backtraces (default autodetect)]))
597AC_ARG_ENABLE([time-check],
598  AS_HELP_STRING([--disable-time-check], [disable slow thread warning messages]))
599AC_ARG_ENABLE([cpu-time],
600  AS_HELP_STRING([--disable-cpu-time], [disable cpu usage data gathering]))
601AC_ARG_ENABLE([pcreposix],
602  AS_HELP_STRING([--enable-pcreposix], [enable using PCRE Posix libs for regex functions]))
603AC_ARG_ENABLE([fpm],
604  AS_HELP_STRING([--enable-fpm], [enable Forwarding Plane Manager support]))
605AC_ARG_ENABLE([systemd],
606  AS_HELP_STRING([--enable-systemd], [enable Systemd support]))
607AC_ARG_ENABLE([werror],
608  AS_HELP_STRING([--enable-werror], [enable -Werror (recommended for developers only)]))
609AC_ARG_ENABLE([cumulus],
610  AS_HELP_STRING([--enable-cumulus], [enable Cumulus Switch Special Extensions]))
611AC_ARG_ENABLE([datacenter],
612  AS_HELP_STRING([--enable-datacenter], [enable Compilation for Data Center Extensions]))
613AC_ARG_ENABLE([rr-semantics],
614  AS_HELP_STRING([--disable-rr-semantics], [disable the v6 Route Replace semantics]))
615AC_ARG_ENABLE([protobuf],
616  AS_HELP_STRING([--enable-protobuf], [Enable experimental protobuf support]))
617AC_ARG_ENABLE([oldvpn_commands],
618  AS_HELP_STRING([--enable-oldvpn-commands], [Keep old vpn commands]))
619AC_ARG_ENABLE([rpki],
620  AS_HELP_STRING([--enable-rpki], [enable RPKI prefix validation support]))
621AC_ARG_ENABLE([clippy-only],
622  AS_HELP_STRING([--enable-clippy-only], [Only build clippy]))
623AC_ARG_ENABLE([numeric_version],
624  AS_HELP_STRING([--enable-numeric-version], [Only numeric digits allowed in version (for Alpine)]))
625AC_ARG_ENABLE([gcov],
626  AS_HELP_STRING([--enable-gcov], [Collect coverage information with gcov]))
627AC_ARG_ENABLE([clang_coverage],
628  AS_HELP_STRING([--enable-clang-coverage], [Collect coverage information with Clang Coverage]))
629AC_ARG_ENABLE([bfdd],
630  AS_HELP_STRING([--disable-bfdd], [do not build bfdd]))
631AC_ARG_ENABLE([address-sanitizer],
632  AS_HELP_STRING([--enable-address-sanitizer], [enable AddressSanitizer support for detecting a wide variety of memory allocation and deallocation errors]))
633AC_ARG_ENABLE([thread-sanitizer],
634  AS_HELP_STRING([--enable-thread-sanitizer], [enable ThreadSanitizer support for detecting data races]))
635AC_ARG_ENABLE([memory-sanitizer],
636  AS_HELP_STRING([--enable-memory-sanitizer], [enable MemorySanitizer support for detecting uninitialized memory reads]))
637AC_ARG_ENABLE([undefined-sanitizer],
638  AS_HELP_STRING([--undefined-sanitizer], [enable UndefinedBehaviorSanitizer support for detecting undefined behavior]))
639AC_ARG_WITH([crypto],
640  AS_HELP_STRING([--with-crypto=<internal|openssl>], [choose between different implementations of cryptographic functions(default value is --with-crypto=internal)]))
641AC_ARG_WITH([frr-format],
642  AS_HELP_STRING([--with-frr-format[=<.../frr-format.so>]], [use frr-format GCC plugin]))
643
644AC_ARG_ENABLE([version-build-config],
645  AS_HELP_STRING([--disable-version-build-config], [do not include build configs in show version command]))
646
647#if openssl, else use the internal
648AS_IF([test "$with_crypto" = "openssl"], [
649AC_CHECK_LIB([crypto], [EVP_DigestInit], [LIBS="$LIBS -lcrypto"], [], [])
650if test "$ac_cv_lib_crypto_EVP_DigestInit" = "no"; then
651  AC_MSG_ERROR([build with openssl has been specified but openssl library was not found on your system])
652else
653  AC_DEFINE([CRYPTO_OPENSSL], [1], [Compile with openssl support])
654fi
655], [test "$with_crypto" = "internal" || test "$with_crypto" = "" ], [AC_DEFINE([CRYPTO_INTERNAL], [1], [Compile with internal cryptographic implementation])
656], [AC_MSG_ERROR([Unknown value for --with-crypto])]
657)
658
659AS_IF([test "$enable_clippy_only" != "yes"], [
660AC_CHECK_HEADERS([json-c/json.h])
661AC_CHECK_LIB([json-c], [json_object_get], [LIBS="$LIBS -ljson-c"], [], [-lm])
662if test "$ac_cv_lib_json_c_json_object_get" = "no"; then
663  AC_CHECK_LIB([json], [json_object_get], [LIBS="$LIBS -ljson"])
664  if test "$ac_cv_lib_json_json_object_get" = "no"; then
665      AC_MSG_ERROR([libjson is needed to compile])
666  fi
667fi
668])
669
670AC_ARG_ENABLE([dev_build],
671    AS_HELP_STRING([--enable-dev-build], [build for development]))
672
673AC_ARG_ENABLE([lua],
674    AS_HELP_STRING([--enable-lua], [Build Lua scripting]))
675
676if test "$enable_time_check" != "no" ; then
677  if test "$enable_time_check" = "yes" -o "$enable_time_check" = "" ; then
678    AC_DEFINE([CONSUMED_TIME_CHECK], [5000000], [Consumed Time Check])
679  else
680    AC_DEFINE_UNQUOTED([CONSUMED_TIME_CHECK], [$enable_time_check], [Consumed Time Check])
681  fi
682fi
683
684case "${enable_cpu_time}" in
685  "no")
686  AC_DEFINE([EXCLUDE_CPU_TIME], [1], [Exclude getrusage data gathering])
687  ;;
688  "*")
689  ;;
690esac
691
692case "${enable_systemd}" in
693  "no") ;;
694  "yes")
695  AC_CHECK_LIB([systemd], [sd_notify], [LIBS="$LIBS -lsystemd"])
696  if test "$ac_cv_lib_systemd_sd_notify" = "no"; then
697    AC_MSG_ERROR([enable systemd has been specified but systemd development env not found on your system])
698  else
699    AC_DEFINE([HAVE_SYSTEMD], [1], [Compile systemd support in])
700  fi
701  ;;
702  "*") ;;
703esac
704
705if test "$enable_rr_semantics" != "no" ; then
706  AC_DEFINE([HAVE_V6_RR_SEMANTICS], [1], [Compile in v6 Route Replacement Semantics])
707fi
708
709if test "$enable_datacenter" = "yes" ; then
710  AC_DEFINE([HAVE_DATACENTER], [1], [Compile extensions for a DataCenter])
711  AC_MSG_WARN([The --enable-datacenter compile time option is deprecated.  Please modify the init script to pass -F datacenter to the daemons instead.])
712  DFLT_NAME="datacenter"
713else
714  DFLT_NAME="traditional"
715fi
716
717if test "$enable_cumulus" = "yes" ; then
718  AC_DEFINE([HAVE_CUMULUS], [1], [Compile Special Cumulus Code in])
719fi
720
721AC_SUBST([DFLT_NAME])
722AC_DEFINE_UNQUOTED([DFLT_NAME], ["$DFLT_NAME"], [Name of the configuration default set])
723
724if test "$enable_shell_access" = "yes"; then
725   AC_DEFINE([HAVE_SHELL_ACCESS], [1], [Allow user to use ssh/telnet/bash, be aware this is considered insecure])
726fi
727
728#
729# Python for clippy
730#
731
732AS_IF([test "$host" = "$build"], [
733  FRR_PYTHON_DEV
734], [
735  FRR_PYTHON
736])
737
738FRR_PYTHON_MODULES([pytest])
739
740if test "$enable_doc" != "no"; then
741  FRR_PYTHON_MODULES([sphinx], , [
742    if test "$enable_doc" = "yes"; then
743      AC_MSG_ERROR([Documentation was explicitly requested with --enable-doc but sphinx is not available for $PYTHON. Please disable docs or install sphinx.])
744    fi
745  ])
746fi
747AM_CONDITIONAL([DOC], [test "$enable_doc" != "no" -a "$frr_py_mod_sphinx" != "false"])
748AM_CONDITIONAL([DOC_HTML], [test "$enable_doc_html" = "yes"])
749
750FRR_PYTHON_MOD_EXEC([sphinx], [--version], [
751  PYSPHINX="-m sphinx"
752], [
753  PYSPHINX="-c 'import sys; from sphinx import main; sys.exit(main(sys.argv))'"
754])
755AC_SUBST([PYSPHINX])
756
757#
758# Logic for old vpn commands support.
759#
760if test "$enable_oldvpn_commands" = "yes"; then
761   AC_DEFINE([KEEP_OLD_VPN_COMMANDS], [1], [Define for compiling with old vpn commands])
762fi
763
764#
765# End of logic for protobuf support.
766#
767
768AC_MSG_CHECKING([if zebra should be configurable to send Route Advertisements])
769if test "$enable_rtadv" != "no"; then
770  AC_MSG_RESULT([yes])
771  AC_DEFINE([HAVE_RTADV], [1], [Enable IPv6 Routing Advertisement support])
772else
773  AC_MSG_RESULT([no])
774fi
775
776if test "$enable_user" = "no"; then
777  enable_user=""
778else
779  if test "$enable_user" = "yes" || test "$enable_user" = ""; then
780    enable_user="frr"
781  fi
782  AC_DEFINE_UNQUOTED([FRR_USER], ["${enable_user}"], [frr User])
783fi
784
785if test "$enable_group" = "no"; then
786  enable_group=""
787else
788  if test "$enable_group" = "yes" || test "$enable_group" = ""; then
789    enable_group="frr"
790  fi
791  AC_DEFINE_UNQUOTED([FRR_GROUP], ["${enable_group}"], [frr Group])
792fi
793
794if test "$enable_vty_group" = "yes" ; then
795  AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
796elif test "$enable_vty_group" != ""; then
797  if test "$enable_vty_group" != "no"; then
798    AC_DEFINE_UNQUOTED([VTY_GROUP], ["${enable_vty_group}"], [VTY Sockets Group])
799  fi
800fi
801AC_SUBST([enable_user])
802AC_SUBST([enable_group])
803AC_SUBST([enable_vty_group])
804
805enable_configfile_mask=${enable_configfile_mask:-0600}
806AC_DEFINE_UNQUOTED([CONFIGFILE_MASK], [${enable_configfile_mask}], [Mask for config files])
807AC_SUBST([enable_configfile_mask])
808
809enable_logfile_mask=${enable_logfile_mask:-0600}
810AC_DEFINE_UNQUOTED([LOGFILE_MASK], [${enable_logfile_mask}], [Mask for log files])
811
812MPATH_NUM=16
813
814case "${enable_multipath}" in
815  0)
816    MPATH_NUM=64
817    ;;
818  [[1-9]|[1-9][0-9]|[1-9][0-9][0-9]])
819    MPATH_NUM="${enable_multipath}"
820    ;;
821  "")
822    ;;
823  *)
824    AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
825    ;;
826esac
827
828AC_DEFINE_UNQUOTED([MULTIPATH_NUM], [$MPATH_NUM], [Maximum number of paths for a route])
829
830AC_DEFINE_UNQUOTED([VTYSH_PAGER], ["$VTYSH_PAGER"], [What pager to use])
831
832dnl --------------------
833dnl Enable code coverage
834dnl --------------------
835AM_CONDITIONAL([HAVE_GCOV], [test "$enable_gcov" != "no"])
836
837dnl ------------------------------------
838dnl Alpine only accepts numeric versions
839dnl ------------------------------------
840if test "$enable_numeric_version" != "" ; then
841  VERSION="`echo ${VERSION} | tr -c -d '[[.0-9]]'`"
842  PACKAGE_VERSION="`echo ${PACKAGE_VERSION} | tr -c -d '[[.0-9]]'`"
843fi
844
845dnl -----------------------------------
846dnl Add extra version string to package
847dnl name, string and version fields.
848dnl -----------------------------------
849if test "$EXTRAVERSION" != "" ; then
850  VERSION="${VERSION}${EXTRAVERSION}"
851  PACKAGE_VERSION="${PACKAGE_VERSION}${EXTRAVERSION}"
852  AC_SUBST(PACKAGE_EXTRAVERSION, ["${EXTRAVERSION}"])
853  PACKAGE_STRING="${PACKAGE_STRING}${EXTRAVERSION}"
854fi
855AC_SUBST([EXTRAVERSION])
856
857if test "$with_pkg_git_version" = "yes"; then
858	if test -e "${srcdir}/.git"; then
859		AC_DEFINE([GIT_VERSION], [1], [include git version info])
860	else	with_pkg_git_version="no"
861		AC_MSG_WARN([--with-pkg-git-version given, but this is not a git checkout])
862	fi
863fi
864AM_CONDITIONAL([GIT_VERSION], [test "$with_pkg_git_version" = "yes"])
865
866AC_CHECK_TOOL([OBJCOPY], [objcopy], [:])
867if test "$OBJCOPY" != ":"; then
868  AC_CACHE_CHECK([for .interp value to use], [frr_cv_interp], [
869    frr_cv_interp=""
870    AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])], [
871      if $OBJCOPY -j.interp -Obinary conftest conftest.interp; then
872        frr_cv_interp="`xargs -0 echo < conftest.interp`"
873      fi
874      test -f conftest.interp && rm conftest.interp
875    ])
876  ])
877fi
878if test -n "$frr_cv_interp"; then
879  AC_DEFINE_UNQUOTED([INTERP], ["$frr_cv_interp"], [.interp value])
880fi
881
882dnl -------------------------
883dnl Check other header files.
884dnl -------------------------
885AC_CHECK_HEADERS([stropts.h sys/ksym.h \
886	linux/version.h asm/types.h])
887
888ac_stdatomic_ok=false
889AC_DEFINE([FRR_AUTOCONF_ATOMIC], [1], [did autoconf checks for atomic funcs])
890AC_CHECK_HEADER([stdatomic.h],[
891
892  AC_MSG_CHECKING([whether _Atomic qualifier works])
893  AC_LINK_IFELSE([AC_LANG_SOURCE([[
894#include <stdatomic.h>
895int main(int argc, char **argv) {
896  _Atomic int i = 0;
897  return i;
898}
899]])], [
900    AC_DEFINE([HAVE_STDATOMIC_H], [1], [found stdatomic.h])
901    AC_MSG_RESULT([yes])
902    ac_stdatomic_ok=true
903  ], [
904    AC_MSG_RESULT([no])
905  ])
906])
907
908AS_IF([$ac_stdatomic_ok], [true], [
909  AC_MSG_CHECKING([for __atomic_* builtins])
910  AC_LINK_IFELSE([AC_LANG_SOURCE([[
911int main(int argc, char **argv) {
912  volatile int i = 1;
913  __atomic_store_n (&i, 0, __ATOMIC_RELEASE);
914  return __atomic_load_n (&i, __ATOMIC_ACQUIRE);
915}
916]])], [
917    AC_DEFINE([HAVE___ATOMIC], [1], [found __atomic builtins])
918    AC_MSG_RESULT([yes])
919  ], [
920    AC_MSG_RESULT([no])
921
922    dnl FreeBSD 9 has a broken stdatomic.h where _Atomic doesn't work
923    AC_MSG_CHECKING([for __sync_* builtins])
924    AC_LINK_IFELSE([AC_LANG_SOURCE([[
925int main(int argc, char **argv) {
926  volatile int i = 1;
927  __sync_fetch_and_sub (&i, 1);
928  return __sync_val_compare_and_swap (&i, 0, 1);
929}
930]])], [
931      AC_DEFINE([HAVE___SYNC], [1], [found __sync builtins])
932      AC_MSG_RESULT([yes])
933
934      AC_MSG_CHECKING([for __sync_swap builtin])
935      AC_LINK_IFELSE([AC_LANG_SOURCE([[
936int main(int argc, char **argv) {
937  volatile int i = 1;
938  return __sync_swap (&i, 2);
939}
940]])], [
941        AC_DEFINE([HAVE___SYNC_SWAP], 1, [found __sync_swap builtin])
942        AC_MSG_RESULT([yes])
943      ], [
944        AC_MSG_RESULT([no])
945      ])
946
947    ], [
948      AC_MSG_RESULT([no])
949      AC_MSG_FAILURE([stdatomic.h unavailable and $CC has neither __atomic nor __sync builtins])
950    ])
951  ])
952])
953
954AC_CHECK_HEADERS([pthread_np.h],,, [
955#include <pthread.h>
956])
957AC_CHECK_FUNCS([pthread_setname_np pthread_set_name_np pthread_getthreadid_np])
958
959needsync=true
960
961AS_IF([$needsync], [
962  dnl Linux
963  AC_MSG_CHECKING([for Linux futex() support])
964  AC_LINK_IFELSE([AC_LANG_PROGRAM([
965#ifndef _GNU_SOURCE
966#define _GNU_SOURCE
967#endif
968#include <unistd.h>
969#include <limits.h>
970#include <sys/time.h>
971#include <sys/syscall.h>
972#include <linux/futex.h>
973
974int main(void);
975],
976[
977{
978  return syscall(SYS_futex, NULL, FUTEX_WAIT, 0, NULL, NULL, 0);
979}
980])], [
981    AC_MSG_RESULT([yes])
982    AC_DEFINE(HAVE_SYNC_LINUX_FUTEX,,Have Linux futex support)
983    needsync=false
984  ], [
985    AC_MSG_RESULT([no])
986  ])
987])
988
989AS_IF([$needsync], [
990  dnl FreeBSD
991  AC_MSG_CHECKING([for FreeBSD _umtx_op() support])
992  AC_LINK_IFELSE([AC_LANG_PROGRAM([
993#include <errno.h>
994#include <stdlib.h>
995#include <sys/types.h>
996#include <sys/umtx.h>
997int main(void);
998],
999[
1000{
1001  return _umtx_op(NULL, UMTX_OP_WAIT_UINT, 0, NULL, NULL);
1002}
1003])], [
1004    AC_MSG_RESULT([yes])
1005    AC_DEFINE(HAVE_SYNC_UMTX_OP,,Have FreeBSD _umtx_op() support)
1006    needsync=false
1007  ], [
1008    AC_MSG_RESULT([no])
1009  ])
1010])
1011
1012AS_IF([$needsync], [
1013  dnl OpenBSD patch (not upstream at the time of writing this)
1014  dnl https://marc.info/?l=openbsd-tech&m=147299508409549&w=2
1015  AC_MSG_CHECKING([for OpenBSD futex() support])
1016  AC_LINK_IFELSE([AC_LANG_PROGRAM([
1017#include <sys/futex.h>
1018int main(void);
1019],
1020[
1021{
1022  return futex(NULL, FUTEX_WAIT, 0, NULL, NULL, 0);
1023}
1024])], [
1025    AC_MSG_RESULT([yes])
1026    AC_DEFINE(HAVE_SYNC_OPENBSD_FUTEX,,Have OpenBSD futex support)
1027    needsync=false
1028  ], [
1029    AC_MSG_RESULT([no])
1030  ])
1031])
1032
1033dnl Utility macro to avoid retyping includes all the time
1034m4_define([FRR_INCLUDES],
1035[#ifdef SUNOS_5
1036#define _POSIX_C_SOURCE 200809L
1037#define __EXTENSIONS__
1038#endif
1039#include <stdio.h>
1040#include <stdlib.h>
1041#include <stddef.h>
1042#include <sys/types.h>
1043/* sys/conf.h depends on param.h on FBSD at least */
1044#include <sys/param.h>
1045/* Required for MAXSIG */
1046#include <signal.h>
1047#include <sys/socket.h>
1048#ifdef __APPLE__
1049# define __APPLE_USE_RFC_3542
1050#endif
1051#include <netinet/in.h>
1052#include <sys/time.h>
1053#include <time.h>
1054#include <net/if.h>
1055])dnl
1056
1057dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
1058dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
1059dnl an additional round for it.
1060
1061AC_CHECK_HEADERS([net/if_var.h], [], [], [FRR_INCLUDES])
1062
1063m4_define([FRR_INCLUDES],
1064FRR_INCLUDES
1065[#ifdef HAVE_NET_IF_VAR_H
1066# include <net/if_var.h>
1067#endif
1068])dnl
1069
1070AC_CHECK_HEADERS([netinet/in_var.h \
1071	net/if_dl.h net/netopt.h \
1072	inet/nd.h netinet/ip_icmp.h \
1073	sys/sysctl.h sys/sockio.h sys/conf.h],
1074	[], [], [FRR_INCLUDES])
1075
1076AC_CHECK_HEADERS([ucontext.h], [], [],
1077[#ifndef __USE_GNU
1078#define __USE_GNU
1079#endif /* __USE_GNU */
1080FRR_INCLUDES
1081])
1082
1083m4_define([UCONTEXT_INCLUDES],
1084[#include <ucontext.h>])dnl
1085
1086AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.uc_regs],
1087  [], [], [UCONTEXT_INCLUDES])
1088AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs],
1089  [AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.regs.nip],
1090   [], [], [UCONTEXT_INCLUDES])],
1091  [], [UCONTEXT_INCLUDES])
1092AC_CHECK_MEMBERS([ucontext_t.uc_mcontext.gregs],
1093  [], [], [UCONTEXT_INCLUDES])
1094
1095m4_define([FRR_INCLUDES],
1096FRR_INCLUDES
1097[
1098#include <sys/un.h>
1099#include <netinet/in_systm.h>
1100#ifdef HAVE_NETINET_IN_VAR_H
1101# include <netinet/in_var.h>
1102#endif
1103#ifdef HAVE_NET_IF_DL_H
1104# include <net/if_dl.h>
1105#endif
1106#ifdef HAVE_NET_NETOPT_H
1107# include <net/netopt.h>
1108#endif
1109#include <net/route.h>
1110#ifdef HAVE_INET_ND_H
1111# include <inet/nd.h>
1112#endif
1113#include <arpa/inet.h>
1114/* Required for IDRP */
1115#ifdef HAVE_NETINET_IP_ICMP_H
1116# include <netinet/ip_icmp.h>
1117#endif
1118])dnl
1119
1120dnl V6 headers are checked below, after we check for v6
1121
1122is_linux=false
1123
1124AC_MSG_CHECKING([which operating system interface to use])
1125case "$host_os" in
1126  sunos* | solaris2*)
1127    AC_MSG_RESULT([Solaris])
1128
1129    AC_DEFINE([SUNOS_5], [1], [SunOS 5])
1130    AC_DEFINE([SOLARIS_IPV6], [1], Solaris IPv6)
1131    AC_DEFINE([_POSIX_C_SOURCE], [200809L], [enable POSIX.1-2008 and XPG7/SUSv4])
1132
1133    AC_CHECK_LIB([socket], [main])
1134    AC_CHECK_LIB([nsl], [main])
1135    AC_CHECK_LIB([umem], [main])
1136    SOLARIS="solaris"
1137    AC_MSG_WARN([--Solaris support is being considered for deprecation, please let us know if you are still using this--])
1138    ;;
1139  linux*)
1140    AC_MSG_RESULT([Linux])
1141
1142    AC_DEFINE([GNU_LINUX], [1], [GNU Linux])
1143    AC_DEFINE([HAVE_NETLINK], [1], [netlink])
1144    AC_DEFINE([LINUX_IPV6], [1], [Linux IPv6 stack])
1145
1146    dnl Linux has a compilation problem with mixing
1147    dnl netinet/in.h and linux/in6.h they are not
1148    dnl compatible.  There has been discussion on
1149    dnl how to fix it but no real progress on implementation
1150    dnl when they fix it, remove this
1151    AC_DEFINE([IPV6_MINHOPCOUNT], [73], [Linux ipv6 Min Hop Count])
1152
1153    is_linux=true
1154    ;;
1155  openbsd*)
1156    AC_MSG_RESULT([OpenBSD])
1157
1158    AC_DEFINE([OPEN_BSD], [1], [OpenBSD])
1159    AC_DEFINE([KAME], [1], [KAME IPv6])
1160    AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
1161    ;;
1162  *)
1163    AC_MSG_RESULT([BSD])
1164
1165    AC_DEFINE([HAVE_NET_RT_IFLIST], [1], [NET_RT_IFLIST])
1166    AC_DEFINE([KAME], [1], [KAME IPv6])
1167    AC_DEFINE([BSD_V6_SYSCTL], [1], [BSD v6 sysctl to turn on and off forwarding])
1168    ;;
1169esac
1170AM_CONDITIONAL([SOLARIS], [test "$SOLARIS" = "solaris"])
1171AM_CONDITIONAL([LINUX], [${is_linux}])
1172
1173AC_SYS_LARGEFILE
1174
1175dnl ------------------------
1176dnl Integrated REALMS option
1177dnl ------------------------
1178if test "$enable_realms" = "yes"; then
1179    case "$host_os" in
1180      linux*)
1181       AC_DEFINE([SUPPORT_REALMS], [1], [Realms support])
1182       ;;
1183      *)
1184       echo "Sorry, only Linux has REALMS support"
1185       exit 1
1186       ;;
1187    esac
1188fi
1189
1190dnl -------------------------------
1191dnl Endian-ness check
1192dnl -------------------------------
1193AC_WORDS_BIGENDIAN
1194
1195dnl ---------------
1196dnl other functions
1197dnl ---------------
1198AC_CHECK_FUNCS([ \
1199	strlcat strlcpy \
1200	getgrouplist \
1201	openat \
1202	unlinkat \
1203	posix_fallocate \
1204	])
1205
1206dnl ##########################################################################
1207dnl LARGE if block spans a lot of "configure"!
1208if test "$enable_clippy_only" != "yes"; then
1209dnl ##########################################################################
1210
1211#
1212# Logic for protobuf support.
1213#
1214PROTO3=false
1215if test "$enable_protobuf" = "yes"; then
1216  # Check for protoc & protoc-c
1217
1218  # protoc is not required, it's only for a "be nice" helper target
1219  AC_CHECK_PROGS([PROTOC], [protoc], [/bin/false])
1220
1221  AC_CHECK_PROGS([PROTOC_C], [protoc-c], [/bin/false])
1222  if test "$PROTOC_C" = "/bin/false"; then
1223    AC_MSG_FAILURE([protobuf requested but protoc-c not found.  Install protobuf-c.])
1224  fi
1225
1226  PKG_CHECK_MODULES([PROTOBUF_C], [libprotobuf-c >= 0.14],, [
1227    AC_MSG_FAILURE([protobuf requested but libprotobuf-c not found.  Install protobuf-c.])
1228  ])
1229
1230  PROTO3=true
1231  AC_CHECK_HEADER([google/protobuf-c/protobuf-c.h],
1232                  [AC_CHECK_DECLS(PROTOBUF_C_LABEL_NONE,
1233                                  AC_DEFINE([HAVE_PROTOBUF_VERSION_3],
1234                                            [1], [Have Protobuf version 3]),
1235                                  [PROTO3=false],
1236                                  [#include <google/protobuf-c/protobuf-c.h>])],
1237                  [PROTO3=false && AC_MSG_FAILURE([protobuf requested but protobuf-c.h not found.  Install protobuf-c.])])
1238
1239  AC_DEFINE([HAVE_PROTOBUF], [1], [protobuf])
1240fi
1241
1242
1243dnl ---------------------
1244dnl Integrated VTY option
1245dnl ---------------------
1246case "${enable_vtysh}" in
1247"no")
1248  VTYSH="";;
1249*)
1250  VTYSH="vtysh";
1251  AC_DEFINE([VTYSH], [1], [VTY shell])
1252
1253  prev_libs="$LIBS"
1254  AC_CHECK_LIB([readline], [main], [
1255    LIBREADLINE="-lreadline"
1256  ], [
1257    dnl readline failed - it might be incorrectly linked and missing its
1258    dnl termcap/tinfo/curses dependency.  see if we can fix that...
1259    AC_SEARCH_LIBS([tputs], [termcap tinfo curses ncurses], [
1260      LIBREADLINE="$ac_cv_search_tputs"
1261    ], [
1262      AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1263    ])
1264
1265    dnl re-try with the lib we found above
1266    unset ac_cv_lib_readline_main
1267    AC_CHECK_LIB([readline], [main], [
1268      LIBREADLINE="-lreadline $LIBREADLINE"
1269    ], [
1270      AC_MSG_ERROR([libreadline (needed for vtysh) not found and/or missing dependencies])
1271    ], [$LIBREADLINE])
1272  ], [])
1273  LIBS="$prev_libs"
1274
1275  AC_CHECK_HEADER([readline/history.h])
1276  if test "$ac_cv_header_readline_history_h" = "no"; then
1277    AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
1278  fi
1279  AC_CHECK_LIB([readline], [rl_completion_matches], [true], [], [$LIBREADLINE])
1280  if test "$ac_cv_lib_readline_rl_completion_matches" = "no"; then
1281    AC_DEFINE([rl_completion_matches], [completion_matches], [Old readline])
1282  fi
1283  AC_CHECK_LIB([readline], [append_history], [frr_cv_append_history=yes], [frr_cv_append_history=no], [$LIBREADLINE])
1284  if test "$frr_cv_append_history" = "yes"; then
1285    AC_DEFINE([HAVE_APPEND_HISTORY], [1], [Have history.h append_history])
1286  fi
1287  ;;
1288esac
1289AC_SUBST([LIBREADLINE])
1290
1291dnl ----------
1292dnl PAM module
1293dnl
1294dnl FRR detects the PAM library it is built against by checking for a
1295dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
1296dnl is known to #include pam_appl.h, the standard header of a PAM library, and
1297dnl openpam.h doesn't do that, although depends on the header too. Hence a
1298dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
1299dnl of OpenPAM.
1300dnl ----------
1301if test "$with_libpam" = "yes"; then
1302  AC_CHECK_HEADER([security/pam_misc.h],
1303    [AC_DEFINE([HAVE_PAM_MISC_H], [1], [Have pam_misc.h])
1304     AC_DEFINE([PAM_CONV_FUNC], [misc_conv], [Have misc_conv])
1305     pam_conv_func="misc_conv"
1306    ],
1307    [], FRR_INCLUDES)
1308  AC_CHECK_HEADER([security/openpam.h],
1309    [AC_DEFINE([HAVE_OPENPAM_H], [1], [Have openpam.h])
1310     AC_DEFINE([PAM_CONV_FUNC], [openpam_ttyconv], [Have openpam_ttyconv])
1311     pam_conv_func="openpam_ttyconv"
1312    ],
1313    [], FRR_INCLUDES[#include <security/pam_appl.h>])
1314  if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
1315    AC_MSG_WARN([*** pam support will not be built ***])
1316    with_libpam="no"
1317  fi
1318fi
1319
1320if test "$with_libpam" = "yes"; then
1321dnl took this test from proftpds configure.in and suited to our needs
1322dnl -------------------------------------------------------------------------
1323dnl
1324dnl This next check looks funky due to a linker problem with some versions
1325dnl of the PAM library.  Prior to 0.72 release, the Linux PAM shared library
1326dnl omitted requiring libdl linking information. PAM-0.72 or better ships
1327dnl with RedHat 6.2 and Debian 2.2 or better.
1328AC_CHECK_LIB([pam], [pam_start],
1329  [AC_CHECK_LIB([pam], [$pam_conv_func],
1330    [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1331     LIBPAM="-lpam"],
1332    [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1333     LIBPAM="-lpam -lpam_misc"]
1334    )
1335  ],
1336
1337  [AC_CHECK_LIB([pam], [pam_end],
1338    [AC_CHECK_LIB([pam], [$pam_conv_func],
1339      [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1340       LIBPAM="-lpam -ldl"],
1341      [AC_DEFINE([USE_PAM], [1], [Use PAM for authentication])
1342       LIBPAM="-lpam -ldl -lpam_misc"]
1343     )
1344  ],AC_MSG_WARN([*** pam support will not be built ***]),
1345  [-ldl])
1346  ]
1347)
1348fi
1349AC_SUBST([LIBPAM])
1350
1351dnl -------------------------------
1352dnl bgpd needs pow() and hence libm
1353dnl -------------------------------
1354TMPLIBS="$LIBS"
1355LIBS=""
1356AC_SEARCH_LIBS([pow], [m], [
1357  LIBM="$LIBS"
1358], [
1359  AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
1360])
1361LIBS="$TMPLIBS"
1362AC_SUBST([LIBM])
1363
1364AC_CHECK_FUNCS([ppoll], [
1365  AC_DEFINE([HAVE_PPOLL], [1], [have Linux/BSD ppoll()])
1366])
1367AC_CHECK_FUNCS([pollts], [
1368  AC_DEFINE([HAVE_POLLTS], [1], [have NetBSD pollts()])
1369])
1370
1371AC_CHECK_HEADER([asm-generic/unistd.h],
1372                [AC_CHECK_DECL(__NR_setns,
1373                               AC_DEFINE([HAVE_NETNS], [1], [Have netns]),,
1374                               FRR_INCLUDES [#include <asm-generic/unistd.h>
1375                               ])
1376                 AC_CHECK_FUNCS([setns])]
1377               )
1378
1379dnl --------------------------
1380dnl Determine IS-IS I/O method
1381dnl --------------------------
1382AC_DEFINE([ISIS_METHOD_PFPACKET], [1], [constant value for isis method pfpacket])
1383AC_DEFINE([ISIS_METHOD_DLPI], [2], [constant value for isis method dlpi])
1384AC_DEFINE([ISIS_METHOD_BPF], [3], [constant value for isis method bpf])
1385AC_CHECK_HEADER([net/bpf.h])
1386AC_CHECK_HEADER([sys/dlpi.h])
1387AC_MSG_CHECKING([zebra IS-IS I/O method])
1388
1389case "$host_os" in
1390  linux*)
1391    AC_MSG_RESULT([pfpacket])
1392    ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
1393    ;;
1394  solaris* | sunos*)
1395    AC_MSG_RESULT([DLPI])
1396    ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1397    ;;
1398  *)
1399    if test "$ac_cv_header_net_bpf_h" = "no"; then
1400      if test "$ac_cv_header_sys_dlpi_h" = "no"; then
1401        AC_MSG_RESULT([none])
1402        if test "$enable_isisd" = "yes" -o "$enable_fabricd" = "yes"; then
1403          AC_MSG_FAILURE([IS-IS support requested but no packet backend found])
1404        fi
1405        AC_MSG_WARN([*** IS-IS support will not be built ***])
1406        enable_isisd="no"
1407        enable_fabricd="no"
1408      else
1409        AC_MSG_RESULT([DLPI])
1410      fi
1411      ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
1412    else
1413      AC_MSG_RESULT([BPF])
1414      ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
1415    fi
1416    ;;
1417esac
1418AC_DEFINE_UNQUOTED([ISIS_METHOD], [$ISIS_METHOD_MACRO], [selected method for isis, == one of the constants])
1419
1420dnl ---------------------------------------------------------------
1421dnl figure out how to specify an interface in multicast sockets API
1422dnl ---------------------------------------------------------------
1423AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], FRR_INCLUDES)
1424
1425AC_CHECK_HEADERS([linux/mroute.h], [], [],[
1426	#include <sys/socket.h>
1427	#include <netinet/in.h>
1428	#define _LINUX_IN_H             /* For Linux <= 2.6.25 */
1429	#include <linux/types.h>
1430])
1431
1432m4_define([FRR_INCLUDES],
1433FRR_INCLUDES
1434[#ifdef HAVE_LINUX_MROUTE_H
1435# include <linux/mroute.h>
1436#endif
1437])dnl
1438
1439AC_CHECK_HEADERS([netinet/ip_mroute.h], [], [],[
1440	#include <sys/socket.h>
1441	#include <sys/types.h>
1442	#include <netinet/in.h>
1443	#include <net/route.h>
1444])
1445
1446m4_define([FRR_INCLUDES],
1447FRR_INCLUDES
1448[#ifdef HAVE_NETINET_IP_MROUTE_H
1449# include <netinet/ip_mroute.h>
1450#endif
1451])dnl
1452
1453AC_MSG_CHECKING([for BSD struct ip_mreq hack])
1454AC_TRY_COMPILE([#include <sys/param.h>],
1455[#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)
1456  return (0);
1457#else
1458  #error No support for BSD struct ip_mreq hack detected
1459#endif],[AC_MSG_RESULT([yes])
1460AC_DEFINE([HAVE_BSD_STRUCT_IP_MREQ_HACK], [1], [Can pass ifindex in struct ip_mreq])],
1461AC_MSG_RESULT([no]))
1462
1463AC_MSG_CHECKING([for RFC3678 protocol-independed API])
1464AC_TRY_COMPILE([
1465#include <sys/types.h>
1466#include <netinet/in.h>
1467], [struct group_req gr; int sock; setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (void*)&gr, sizeof(gr));
1468], [AC_MSG_RESULT([yes])
1469AC_DEFINE([HAVE_RFC3678], [1], [Have RFC3678 protocol-independed API])],
1470AC_MSG_RESULT([no]))
1471
1472dnl ---------------------------------------------------------------
1473dnl figure out how to check link-state
1474dnl ---------------------------------------------------------------
1475AC_CHECK_HEADER([net/if_media.h],
1476  [m4_define([LINK_DETECT_INCLUDES],
1477    FRR_INCLUDES
1478    [#include <net/if_media.h>
1479  ])
1480  AC_CHECK_MEMBERS([struct ifmediareq.ifm_status],
1481    AC_DEFINE([HAVE_BSD_LINK_DETECT], [1], [BSD link-detect]),
1482    [], LINK_DETECT_INCLUDES)],
1483  [],
1484  FRR_INCLUDES)
1485
1486dnl ---------------------------------------------------------------
1487dnl Additional, newer way to check link-state using ifi_link_state.
1488dnl Not available in all BSD's when ifmediareq available
1489dnl ---------------------------------------------------------------
1490AC_CHECK_MEMBERS([struct if_data.ifi_link_state],
1491  AC_DEFINE([HAVE_BSD_IFI_LINK_STATE], [1], [BSD ifi_link_state available]),
1492  [], FRR_INCLUDES)
1493
1494dnl ------------------------
1495dnl TCP_MD5SIG socket option
1496dnl ------------------------
1497
1498AC_CHECK_HEADER([netinet/tcp.h],
1499   [m4_define([MD5_INCLUDES],
1500      FRR_INCLUDES
1501      [#include <netinet/tcp.h>
1502    ])
1503    AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
1504   [],
1505   FRR_INCLUDES)
1506if test "$ac_cv_have_decl_TCP_MD5SIG" = "no"; then
1507  AC_CHECK_HEADER([linux/tcp.h],
1508       [m4_define([MD5_INCLUDES],
1509          FRR_INCLUDES
1510          [#include <linux/tcp.h>
1511        ])
1512       AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
1513fi
1514
1515AC_SUBST([SOLARIS])
1516AC_CHECK_LIB([crypt], [crypt], [],
1517		    [AC_CHECK_LIB([crypto], [DES_crypt])])
1518AC_CHECK_LIB([resolv], [res_init])
1519
1520dnl ---------------------------
1521dnl check system has PCRE regexp
1522dnl ---------------------------
1523if test "$enable_pcreposix" = "yes"; then
1524  AC_CHECK_LIB([pcreposix], [regexec], [], [
1525    AC_MSG_ERROR([--enable-pcreposix given but unable to find libpcreposix])
1526  ])
1527fi
1528AC_SUBST([HAVE_LIBPCREPOSIX])
1529
1530dnl ##########################################################################
1531dnl test "$enable_clippy_only" != "yes"
1532fi
1533dnl END OF LARGE if block
1534dnl ##########################################################################
1535
1536dnl ------------------
1537dnl check C-Ares library
1538dnl ------------------
1539PKG_CHECK_MODULES([CARES], [libcares], [
1540  c_ares_found=true
1541],[
1542  c_ares_found=false
1543])
1544AM_CONDITIONAL([CARES], [$c_ares_found])
1545
1546
1547dnl ----------------------------------------------------------------------------
1548dnl figure out if domainname is available in the utsname struct (GNU extension).
1549dnl ----------------------------------------------------------------------------
1550AC_CHECK_MEMBERS([struct utsname.domainname], [], [], [#include <sys/utsname.h>])
1551
1552dnl ------------------
1553dnl IPv6 header checks
1554dnl ------------------
1555AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h \
1556	netinet6/in6_var.h netinet6/nd6.h], [], [],
1557	FRR_INCLUDES)
1558
1559m4_define([FRR_INCLUDES],dnl
1560FRR_INCLUDES
1561[#ifdef HAVE_NETINET6_IN6_H
1562#include <netinet6/in6.h>
1563#endif
1564#ifdef HAVE_NETINET_IN6_VAR_H
1565#include <netinet/in6_var.h>
1566#endif
1567#include <netinet/icmp6.h>
1568#ifdef HAVE_NETINET6_IN6_VAR_H
1569# include <netinet6/in6_var.h>
1570#endif
1571#ifdef HAVE_NETINET6_ND6_H
1572# include <netinet6/nd6.h>
1573#endif
1574])dnl
1575
1576dnl --------------------
1577dnl Daemon disable check
1578dnl --------------------
1579
1580AS_IF([test "$enable_ldpd" != "no"], [
1581  AC_DEFINE([HAVE_LDPD], [1], [ldpd])
1582])
1583
1584if test "$enable_bfdd" = "no"; then
1585  AC_DEFINE([HAVE_BFDD], [0], [bfdd])
1586  BFDD=""
1587else
1588  AC_DEFINE([HAVE_BFDD], [1], [bfdd])
1589  BFDD="bfdd"
1590
1591  case $host_os in
1592    linux*)
1593      AC_DEFINE([BFD_LINUX], [1], [bfdd])
1594      ;;
1595
1596    *)
1597      AC_DEFINE([BFD_BSD], [1], [bfdd])
1598      ;;
1599  esac
1600fi
1601
1602if test "$ac_cv_lib_json_c_json_object_get" = "no" -a "$BFDD" = "bfdd"; then
1603  AC_MSG_ERROR(["you must use json-c library to use bfdd"])
1604fi
1605
1606NHRPD=""
1607case "$host_os" in
1608  linux*)
1609    case "${enable_nhrpd}" in
1610      no)
1611        ;;
1612      yes)
1613	if test "$enable_clippy_only" != "yes"; then
1614        if test "$c_ares_found" != "true" ; then
1615          AC_MSG_ERROR([nhrpd requires libcares.  Please install c-ares and its -dev headers.])
1616        fi
1617	fi
1618        NHRPD="nhrpd"
1619        ;;
1620      *)
1621        if test "$c_ares_found" = "true" ; then
1622          NHRPD="nhrpd"
1623        fi
1624        ;;
1625    esac
1626    ;;
1627  *)
1628    if test "$enable_nhrpd" = "yes"; then
1629      AC_MSG_ERROR([nhrpd requires kernel APIs that are only present on Linux.])
1630    fi
1631    ;;
1632esac
1633
1634if test "$enable_watchfrr" = "no";then
1635  WATCHFRR=""
1636else
1637  WATCHFRR="watchfrr"
1638fi
1639
1640OSPFCLIENT=""
1641if test "$enable_ospfapi" != "no";then
1642    AC_DEFINE([SUPPORT_OSPF_API], [1], [OSPFAPI])
1643
1644  if test "$enable_ospfclient" != "no";then
1645      OSPFCLIENT="ospfclient"
1646  fi
1647fi
1648
1649if test "$enable_bgp_announce" = "no";then
1650  AC_DEFINE([DISABLE_BGP_ANNOUNCE], [1], [Disable BGP installation to zebra])
1651else
1652  AC_DEFINE([DISABLE_BGP_ANNOUNCE], [0], [Disable BGP installation to zebra])
1653fi
1654
1655if test "$enable_bgp_vnc" != "no";then
1656  AC_DEFINE([ENABLE_BGP_VNC], [1], [Enable BGP VNC support])
1657fi
1658
1659bgpd_bmp=false
1660case "${enable_bmp}" in
1661  no)
1662    ;;
1663  yes)
1664    if test "$c_ares_found" != "true" ; then
1665      AC_MSG_ERROR([BMP support requires libcares.  Please install c-ares and its -dev headers.])
1666    fi
1667    bgpd_bmp=true
1668    ;;
1669  *)
1670    if test "$c_ares_found" = "true" ; then
1671      bgpd_bmp=true
1672    fi
1673    ;;
1674esac
1675
1676if test "$enable_version_build_config" != "no";then
1677  AC_DEFINE([ENABLE_VERSION_BUILD_CONFIG], [1], [Report build configs in show version])
1678fi
1679
1680dnl ##########################################################################
1681dnl LARGE if block
1682if test "$enable_clippy_only" != "yes"; then
1683dnl ##########################################################################
1684
1685dnl ------------------
1686dnl check Net-SNMP library
1687dnl ------------------
1688if test "$enable_snmp" != "" -a "$enable_snmp" != "no"; then
1689   AC_PATH_TOOL([NETSNMP_CONFIG], [net-snmp-config], [no])
1690   if test "$NETSNMP_CONFIG" = "no"; then
1691      AC_MSG_ERROR([--enable-snmp given but unable to find net-snmp-config])
1692   fi
1693   SNMP_LIBS="`${NETSNMP_CONFIG} --agent-libs`"
1694   SNMP_CFLAGS="`${NETSNMP_CONFIG} --base-cflags`"
1695   # net-snmp lists all of its own dependencies.  we absolutely do not want that
1696   # among other things we avoid a GPL vs. OpenSSL license conflict here
1697   for removelib in crypto ssl sensors pci wrap; do
1698     SNMP_LIBS="`echo $SNMP_LIBS | sed -e 's/\(^\|\s\)-l'$removelib'\b/ /g' -e 's/\(^\|\s\)\([^\s]*\/\)\?lib'$removelib'\.[^\s]\+\b/ /g'`"
1699   done
1700   AC_MSG_CHECKING([whether we can link to Net-SNMP])
1701   AC_LINK_IFELSE_FLAGS([$SNMP_CFLAGS], [$SNMP_LIBS], [AC_LANG_PROGRAM([
1702int main(void);
1703],
1704[
1705{
1706  return 0;
1707}
1708])], [
1709     AC_MSG_RESULT([no])
1710     AC_MSG_ERROR([--enable-snmp given but not usable])])
1711   case "${enable_snmp}" in
1712     yes)
1713      SNMP_METHOD=agentx
1714      ;;
1715     agentx)
1716      SNMP_METHOD="${enable_snmp}"
1717      ;;
1718     *)
1719      AC_MSG_ERROR([--enable-snmp given with an unknown method (${enable_snmp}). Use yes or agentx])
1720      ;;
1721   esac
1722   AH_TEMPLATE([SNMP_AGENTX], [Use SNMP AgentX to interface with snmpd])
1723   AC_DEFINE_UNQUOTED(AS_TR_CPP(SNMP_${SNMP_METHOD}),,[SNMP method to interface with snmpd])
1724fi
1725AC_SUBST([SNMP_LIBS])
1726AC_SUBST([SNMP_CFLAGS])
1727
1728dnl ---------------
1729dnl libyang
1730dnl ---------------
1731PKG_CHECK_MODULES([LIBYANG], [libyang >= 1.0.184], , [
1732  AC_MSG_ERROR([libyang (>= 1.0.184) was not found on your system.])
1733])
1734ac_cflags_save="$CFLAGS"
1735CFLAGS="$CFLAGS $LIBYANG_CFLAGS"
1736AC_CHECK_MEMBER([struct lyd_node.priv], [], [
1737  AC_MSG_ERROR([m4_normalize([
1738    libyang needs to be compiled with ENABLE_LYD_PRIV=ON.
1739    Instructions for this are included in the build documentation for your platform at http://docs.frrouting.org/projects/dev-guide/en/latest/building.html])
1740  ])
1741], [[#include <libyang/libyang.h>]])
1742CFLAGS="$ac_cflags_save"
1743
1744dnl ---------------
1745dnl configuration rollbacks
1746dnl ---------------
1747SQLITE3=false
1748if test "$enable_config_rollbacks" = "yes"; then
1749  PKG_CHECK_MODULES([SQLITE3], [sqlite3], [
1750    AC_DEFINE([HAVE_CONFIG_ROLLBACKS], [1], [Enable configuration rollbacks])
1751    AC_DEFINE([HAVE_SQLITE3], [1], [Enable sqlite3 database])
1752    SQLITE3=true
1753  ], [
1754    AC_MSG_ERROR([--enable-config-rollbacks given but sqlite3 was not found on your system.])
1755  ])
1756fi
1757
1758dnl ---------------
1759dnl confd
1760dnl ---------------
1761if test "$enable_confd" != "" -a "$enable_confd" != "no"; then
1762   AC_CHECK_PROG([CONFD], [confd], [confd], [/bin/false], "${enable_confd}/bin")
1763   if test "$CONFD" = "/bin/false"; then
1764      AC_MSG_ERROR([confd was not found on your system.])]
1765   fi
1766   CONFD_CFLAGS="-I${enable_confd}/include -L${enable_confd}/lib"
1767   AC_SUBST([CONFD_CFLAGS])
1768   CONFD_LIBS="-lconfd"
1769   AC_SUBST([CONFD_LIBS])
1770   AC_DEFINE([HAVE_CONFD], [1], [Enable confd integration])
1771fi
1772
1773dnl ---------------
1774dnl sysrepo
1775dnl ---------------
1776if test "$enable_sysrepo" = "yes"; then
1777  PKG_CHECK_MODULES([SYSREPO], [sysrepo],
1778      [AC_DEFINE([HAVE_SYSREPO], [1], [Enable sysrepo integration])
1779      SYSREPO=true],
1780      [SYSREPO=false
1781      AC_MSG_ERROR([sysrepo was not found on your system.])]
1782  )
1783fi
1784
1785dnl ---------------
1786dnl gRPC
1787dnl ---------------
1788if test "$enable_grpc" = "yes"; then
1789  PKG_CHECK_MODULES([GRPC], [grpc grpc++ protobuf], [
1790    AC_CHECK_PROGS([PROTOC], [protoc], [/bin/false])
1791    if test "$PROTOC" = "/bin/false"; then
1792      AC_MSG_FAILURE([grpc requested but protoc not found.])
1793    fi
1794
1795    AC_DEFINE([HAVE_GRPC], [1], [Enable the gRPC northbound plugin])
1796    GRPC=true
1797  ], [
1798    GRPC=false
1799    AC_MSG_ERROR([grpc/grpc++ were not found on your system.])
1800  ])
1801fi
1802
1803dnl ------
1804dnl ZeroMQ
1805dnl ------
1806if test "$enable_zeromq" != "no"; then
1807  PKG_CHECK_MODULES([ZEROMQ], [libzmq >= 4.0.0], [
1808    AC_DEFINE([HAVE_ZEROMQ], [1], [Enable ZeroMQ support])
1809    ZEROMQ=true
1810  ], [
1811    if test "$enable_zeromq" = "yes"; then
1812      AC_MSG_ERROR([configuration specifies --enable-zeromq but libzmq was not found])
1813    fi
1814  ])
1815fi
1816
1817dnl ------------------------------------
1818dnl Enable RPKI and add librtr to libs
1819dnl ------------------------------------
1820if test "$enable_rpki" = "yes"; then
1821  PKG_CHECK_MODULES([RTRLIB], [rtrlib >= 0.5.0],
1822      [RPKI=true],
1823      [RPKI=false
1824      AC_MSG_ERROR([rtrlib was not found on your system or is too old.])]
1825  )
1826fi
1827
1828dnl ------------------------------------
1829dnl pimd is not supported on OpenBSD and MacOS
1830dnl ------------------------------------
1831if test "$enable_pimd" != "no"; then
1832AC_MSG_CHECKING([for pimd OS support])
1833case "$host_os" in
1834  darwin*)
1835    AC_MSG_RESULT([no])
1836    enable_pimd="no"
1837    ;;
1838  openbsd*)
1839    AC_MSG_RESULT([no])
1840    enable_pimd="no"
1841    ;;
1842  *)
1843    AC_MSG_RESULT([yes])
1844    ;;
1845esac
1846fi
1847
1848dnl -------------------------------------
1849dnl VRRP is only supported on linux
1850dnl -------------------------------------
1851if test "$enable_vrrpd" != "no"; then
1852AC_MSG_CHECKING([for VRRP OS support])
1853case "$host_os" in
1854  linux*)
1855    AC_MSG_RESULT([yes])
1856    ;;
1857  *)
1858    AC_MSG_RESULT([no])
1859    enable_vrrpd="no"
1860    ;;
1861esac
1862fi
1863
1864dnl ------------------------------------------
1865dnl Check whether rtrlib was build with ssh support
1866dnl ------------------------------------------
1867AC_MSG_CHECKING([whether the RTR Library is compiled with SSH])
1868AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include "rtrlib/rtrlib.h"]],
1869			[[struct tr_ssh_config config;]])],
1870	[AC_MSG_RESULT([yes])
1871	AC_DEFINE([FOUND_SSH], [1], [found_ssh])],
1872	AC_MSG_RESULT([no])
1873)
1874
1875dnl ---------------
1876dnl dlopen & dlinfo
1877dnl ---------------
1878AC_SEARCH_LIBS([dlopen], [dl dld], [], [
1879  AC_MSG_ERROR([unable to find the dlopen()])
1880])
1881
1882AC_CHECK_HEADERS([link.h])
1883
1884AC_CACHE_CHECK([for dlinfo(RTLD_DI_ORIGIN)], [frr_cv_rtld_di_origin], [
1885  AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1886#include <stdlib.h>
1887#ifdef HAVE_LINK_H
1888#include <link.h>
1889#endif
1890#include <dlfcn.h>
1891]], [[
1892  char origin[1];
1893  dlinfo (NULL, RTLD_DI_ORIGIN, &origin);
1894]])], [
1895    frr_cv_rtld_di_origin=yes
1896  ], [
1897    frr_cv_rtld_di_origin=no
1898  ])
1899])
1900if test "$frr_cv_rtld_di_origin" = "yes"; then
1901  AC_DEFINE([HAVE_DLINFO_ORIGIN], [1], [Have dlinfo RTLD_DI_ORIGIN])
1902fi
1903
1904AC_CACHE_CHECK([for dlinfo(RTLD_DI_LINKMAP)], [frr_cv_rtld_di_linkmap], [
1905  AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1906#include <stdlib.h>
1907#ifdef HAVE_LINK_H
1908#include <link.h>
1909#endif
1910#include <dlfcn.h>
1911]], [[
1912  struct link_map *lm = NULL;
1913  dlinfo (NULL, RTLD_DI_LINKMAP, &lm);
1914]])], [
1915    frr_cv_rtld_di_linkmap=yes
1916  ], [
1917    frr_cv_rtld_di_linkmap=no
1918  ])
1919])
1920if test "$frr_cv_rtld_di_linkmap" = "yes"; then
1921  AC_DEFINE([HAVE_DLINFO_LINKMAP], [1], [Have dlinfo RTLD_DI_LINKMAP])
1922fi
1923
1924dnl ##########################################################################
1925dnl test "$enable_clippy_only" != "yes"
1926fi
1927dnl END OF LARGE if block
1928dnl ##########################################################################
1929
1930dnl ---------------------------
1931dnl sockaddr and netinet checks
1932dnl ---------------------------
1933AC_CHECK_TYPES([
1934	struct sockaddr_dl,
1935	struct vifctl, struct mfcctl, struct sioc_sg_req,
1936	vifi_t, struct sioc_vif_req, struct igmpmsg,
1937	struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1938	struct nd_opt_adv_interval,
1939	struct nd_opt_homeagent_info, struct nd_opt_adv_interval,
1940	struct nd_opt_rdnss, struct nd_opt_dnssl],
1941	[], [], FRR_INCLUDES)
1942
1943AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1944	struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1945	struct sockaddr_dl.sdl_len,
1946	struct if6_aliasreq.ifra_lifetime,
1947	struct nd_opt_adv_interval.nd_opt_ai_type],
1948	[], [], FRR_INCLUDES)
1949
1950dnl ---------------------------
1951dnl IRDP/pktinfo/icmphdr checks
1952dnl ---------------------------
1953
1954AC_CHECK_TYPES([struct in_pktinfo], [
1955  AC_CHECK_TYPES([struct icmphdr], [
1956    IRDP=true
1957  ], [
1958    IRDP=false
1959  ], [FRR_INCLUDES])
1960], [
1961  IRDP=false
1962], [FRR_INCLUDES])
1963
1964case "${enable_irdp}" in
1965yes)
1966  $IRDP || AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1967  ;;
1968no)
1969  IRDP=false
1970  ;;
1971esac
1972
1973
1974dnl -----------------------
1975dnl checking for IP_PKTINFO
1976dnl -----------------------
1977AC_MSG_CHECKING([for IP_PKTINFO])
1978AC_TRY_COMPILE([#include <netdb.h>], [
1979  int opt = IP_PKTINFO;
1980], [
1981  AC_MSG_RESULT([yes])
1982  AC_DEFINE([HAVE_IP_PKTINFO], [1], [Have IP_PKTINFO])
1983], [
1984  AC_MSG_RESULT([no])
1985])
1986
1987dnl ---------------------------
1988dnl checking for IP_RECVDSTADDR
1989dnl ---------------------------
1990AC_MSG_CHECKING([for IP_RECVDSTADDR])
1991AC_TRY_COMPILE([#include <netinet/in.h>], [
1992  int opt = IP_RECVDSTADDR;
1993], [
1994  AC_MSG_RESULT([yes])
1995  AC_DEFINE([HAVE_IP_RECVDSTADDR], [1], [Have IP_RECVDSTADDR])
1996], [
1997  AC_MSG_RESULT([no])
1998])
1999
2000dnl ----------------------
2001dnl checking for IP_RECVIF
2002dnl ----------------------
2003AC_MSG_CHECKING([for IP_RECVIF])
2004AC_TRY_COMPILE([#include <netinet/in.h>], [
2005  int opt = IP_RECVIF;
2006], [
2007  AC_MSG_RESULT([yes])
2008  AC_DEFINE([HAVE_IP_RECVIF], [1], [Have IP_RECVIF])
2009], [
2010  AC_MSG_RESULT([no])
2011])
2012
2013dnl ----------------------
2014dnl checking for SO_BINDANY
2015dnl ----------------------
2016AC_MSG_CHECKING([for SO_BINDANY])
2017AC_TRY_COMPILE([#include <sys/socket.h>], [
2018  int opt = SO_BINDANY;
2019], [
2020  AC_MSG_RESULT([yes])
2021  AC_DEFINE([HAVE_SO_BINDANY], [1], [Have SO_BINDANY])
2022], [
2023  AC_MSG_RESULT([no])
2024])
2025
2026dnl ----------------------
2027dnl checking for IP_FREEBIND
2028dnl ----------------------
2029AC_MSG_CHECKING([for IP_FREEBIND])
2030AC_TRY_COMPILE([#include <netinet/in.h>], [
2031  int opt = IP_FREEBIND;
2032], [
2033  AC_MSG_RESULT([yes])
2034  AC_DEFINE([HAVE_IP_FREEBIND], [1], [Have IP_FREEBIND])
2035], [
2036  AC_MSG_RESULT([no])
2037])
2038
2039dnl --------------------------------------
2040dnl checking for be32dec existence or not
2041dnl --------------------------------------
2042AC_CHECK_DECLS([be32enc, be32dec], [], [],
2043	       [#include <sys/endian.h>])
2044
2045dnl --------------------------------------
2046dnl checking for clock_time monotonic struct and call
2047dnl --------------------------------------
2048AC_CHECK_DECL([CLOCK_MONOTONIC],
2049	[AC_CHECK_LIB([rt], [clock_gettime], [LIBS="$LIBS -lrt"])
2050	 AC_DEFINE([HAVE_CLOCK_MONOTONIC], [1], [Have monotonic clock])
2051], [AC_MSG_RESULT([no])], [FRR_INCLUDES])
2052
2053AC_SEARCH_LIBS([clock_nanosleep], [rt], [
2054  AC_DEFINE([HAVE_CLOCK_NANOSLEEP], [1], [Have clock_nanosleep()])
2055])
2056
2057dnl --------------------------------------
2058dnl checking for flex and bison
2059dnl --------------------------------------
2060
2061AM_PROG_LEX
2062AC_MSG_CHECKING([version of flex])
2063frr_ac_flex_version="$(eval $LEX -V | grep flex | head -n 1)"
2064frr_ac_flex_version="${frr_ac_flex_version##* }"
2065AC_MSG_RESULT([$frr_ac_flex_version])
2066AX_COMPARE_VERSION([$frr_ac_flex_version], [lt], [2.5.20], [
2067  LEX="$SHELL $missing_dir/missing flex"
2068  if test -f "${srcdir}/lib/command_lex.c" -a -f "${srcdir}/lib/command_lex.h"; then
2069    AC_MSG_WARN([using pregenerated flex output files])
2070  else
2071    AC_MSG_ERROR([flex failure and pregenerated files not included (probably a git build)])
2072  fi
2073  AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
2074  AC_SUBST([LEXLIB], [''])
2075])
2076
2077AC_PROG_YACC
2078dnl thanks GNU bison for this b*llshit...
2079AC_MSG_CHECKING([version of bison])
2080frr_ac_bison_version="$(eval $YACC -V | grep bison | head -n 1)"
2081frr_ac_bison_version="${frr_ac_bison_version##* }"
2082frr_ac_bison_missing="false"
2083case "x${frr_ac_bison_version}x" in
2084  x2.7*)
2085    BISON_OPENBRACE='"'
2086    BISON_CLOSEBRACE='"'
2087    BISON_VERBOSE=''
2088    AC_MSG_RESULT([$frr_ac_bison_version - 2.7 or older])
2089    ;;
2090  x2.*|x1.*)
2091    AC_MSG_RESULT([$frr_ac_bison_version])
2092    AC_MSG_WARN([installed bison is too old.  Please install GNU bison 2.7.x or newer.])
2093    frr_ac_bison_missing="true"
2094    ;;
2095  x)
2096    AC_MSG_RESULT([none])
2097    AC_MSG_WARN([could not determine bison version.  Please install GNU bison 2.7.x or newer.])
2098    frr_ac_bison_missing="true"
2099    ;;
2100  x3.[012][^0-9]*)
2101    BISON_OPENBRACE='{'
2102    BISON_CLOSEBRACE='}'
2103    BISON_VERBOSE='-Dparse.error=verbose'
2104    AC_MSG_RESULT([$frr_ac_bison_version - 3.0 to 3.2])
2105    ;;
2106  *)
2107    BISON_OPENBRACE='{'
2108    BISON_CLOSEBRACE='}'
2109    BISON_VERBOSE='-Dparse.error=verbose -Wno-yacc'
2110    AC_MSG_RESULT([$frr_ac_bison_version - 3.3 or newer])
2111    ;;
2112esac
2113AC_SUBST([BISON_OPENBRACE])
2114AC_SUBST([BISON_CLOSEBRACE])
2115AC_SUBST([BISON_VERBOSE])
2116
2117if $frr_ac_bison_missing; then
2118  YACC="$SHELL $missing_dir/missing bison -y"
2119  if test -f "${srcdir}/lib/command_parse.c" -a -f "${srcdir}/lib/command_parse.h"; then
2120    AC_MSG_WARN([using pregenerated bison output files])
2121  else
2122    AC_MSG_ERROR([bison failure and pregenerated files not included (probably a git build)])
2123  fi
2124fi
2125
2126dnl -------------------
2127dnl capabilities checks
2128dnl -------------------
2129if test "$enable_capabilities" != "no"; then
2130  AC_MSG_CHECKING([whether prctl PR_SET_KEEPCAPS is available])
2131  AC_TRY_COMPILE([#include <sys/prctl.h>], [prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
2132    [AC_MSG_RESULT([yes])
2133     AC_DEFINE([HAVE_PR_SET_KEEPCAPS], [1], [prctl])
2134     frr_ac_keepcaps="yes"],
2135     AC_MSG_RESULT([no])
2136  )
2137  if test "$frr_ac_keepcaps" = "yes"; then
2138    AC_CHECK_HEADERS([sys/capability.h])
2139  fi
2140  if test "$ac_cv_header_sys_capability_h" = "yes"; then
2141    AC_CHECK_LIB([cap], [cap_init],
2142      [AC_DEFINE([HAVE_LCAPS], [1], [Capabilities])
2143       LIBCAP="-lcap"
2144       frr_ac_lcaps="yes"]
2145    )
2146  else
2147    AC_CHECK_HEADERS([priv.h],
2148     [AC_MSG_CHECKING([Solaris style privileges are available])
2149      AC_TRY_COMPILE([#include <priv.h>], [getpflags(PRIV_AWARE);],
2150    	  [AC_MSG_RESULT([yes])
2151    	   AC_DEFINE([HAVE_SOLARIS_CAPABILITIES], [1], [getpflags])
2152    	   frr_ac_scaps="yes"],
2153    	   AC_MSG_RESULT(no)
2154      )
2155     ]
2156   )
2157  fi
2158  if test "$frr_ac_scaps" = "yes" \
2159       -o "$frr_ac_lcaps" = "yes"; then
2160    AC_DEFINE([HAVE_CAPABILITIES], [1], [capabilities])
2161  fi
2162
2163  case "$host_os" in
2164  linux*)
2165    if test "$enable_clippy_only" != "yes"; then
2166    if test "$frr_ac_lcaps" != "yes"; then
2167      AC_MSG_ERROR([libcap and/or its headers were not found.  Running FRR without libcap support built in causes a huge performance penalty.])
2168    fi
2169    fi
2170    ;;
2171  esac
2172else
2173  case "$host_os" in
2174  linux*)
2175    AC_MSG_WARN([Running FRR without libcap support built in causes a huge performance penalty.])
2176    ;;
2177  esac
2178fi
2179AC_SUBST([LIBCAP])
2180
2181dnl ---------------------------
2182dnl check for glibc 'backtrace'
2183dnl ---------------------------
2184if test "$enable_backtrace" != "no" ; then
2185  backtrace_ok=no
2186  PKG_CHECK_MODULES([UNWIND], [libunwind], [
2187    AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
2188    backtrace_ok=yes
2189  ], [
2190    true
2191  ])
2192
2193  if test "$backtrace_ok" = "no"; then
2194    AC_CHECK_HEADER([unwind.h], [
2195      AC_SEARCH_LIBS([unw_getcontext], [unwind], [
2196        AC_DEFINE([HAVE_LIBUNWIND], [1], [libunwind])
2197        backtrace_ok=yes
2198      ])
2199    ])
2200  fi
2201
2202  if test "$backtrace_ok" = "no"; then
2203    AC_CHECK_HEADER([execinfo.h], [
2204      AC_SEARCH_LIBS([backtrace], [execinfo], [
2205        AC_DEFINE([HAVE_GLIBC_BACKTRACE], [1], [Glibc backtrace])
2206        backtrace_ok=yes
2207      ],, [-lm])
2208    ])
2209  fi
2210
2211  if test "$enable_backtrace" = "yes" -a "$backtrace_ok" = "no"; then
2212    dnl user explicitly requested backtrace but we failed to find support
2213    AC_MSG_FAILURE([failed to find backtrace or libunwind support])
2214  fi
2215fi
2216
2217dnl -----------------------------------------
2218dnl check for malloc mallinfo struct and call
2219dnl this must try and link using LIBS, in
2220dnl order to check no alternative allocator
2221dnl has been specified, which might not provide
2222dnl mallinfo, e.g. such as Umem on Solaris.
2223dnl -----------------------------------------
2224AC_CHECK_HEADERS([malloc.h malloc_np.h malloc/malloc.h],,, [FRR_INCLUDES])
2225
2226AC_CACHE_CHECK([whether mallinfo is available], [frr_cv_mallinfo], [
2227  AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2228#ifdef HAVE_MALLOC_H
2229#include <malloc.h>
2230#endif
2231#ifdef HAVE_MALLOC_NP_H
2232#include <malloc_np.h>
2233#endif
2234#ifdef HAVE_MALLOC_MALLOC_H
2235#include <malloc/malloc.h>
2236#endif
2237]], [[
2238struct mallinfo ac_x; ac_x = mallinfo ();
2239]])], [
2240    frr_cv_mallinfo=yes
2241  ], [
2242    frr_cv_mallinfo=no
2243  ])
2244])
2245if test "$frr_cv_mallinfo" = "yes"; then
2246  AC_DEFINE([HAVE_MALLINFO], [1], [mallinfo])
2247fi
2248
2249AC_MSG_CHECKING([whether malloc_usable_size is available])
2250AC_LINK_IFELSE([AC_LANG_PROGRAM([FRR_INCLUDES [
2251#ifdef HAVE_MALLOC_H
2252#include <malloc.h>
2253#endif
2254#ifdef HAVE_MALLOC_MALLOC_H
2255#include <malloc/malloc.h>
2256#endif
2257]], [[
2258size_t ac_x; ac_x = malloc_usable_size(NULL);
2259]])], [
2260  AC_MSG_RESULT([yes])
2261  AC_DEFINE([HAVE_MALLOC_USABLE_SIZE], [1], [malloc_usable_size])
2262], [
2263  AC_MSG_RESULT([no])
2264
2265  AC_MSG_CHECKING([whether malloc_size is available])
2266  AC_LINK_IFELSE([AC_LANG_PROGRAM([[
2267#ifdef HAVE_MALLOC_H
2268#include <malloc.h>
2269#endif
2270#ifdef HAVE_MALLOC_MALLOC_H
2271#include <malloc/malloc.h>
2272#endif
2273]], [[
2274size_t ac_x; ac_x = malloc_size(NULL);
2275]])], [
2276    AC_MSG_RESULT([yes])
2277    AC_DEFINE([HAVE_MALLOC_SIZE], [1], [malloc_size])
2278  ], [
2279    AC_MSG_RESULT([no])
2280  ])
2281])
2282
2283dnl ----------
2284dnl configure date
2285dnl ----------
2286dev_version=`echo $VERSION | grep dev`
2287#don't expire deprecated code in non 'dev' branch
2288if test "$dev_version" = ""; then
2289   CONFDATE=0
2290else
2291   CONFDATE=`date '+%Y%m%d'`
2292fi
2293AC_SUBST([CONFDATE])
2294
2295dnl ------------------------------
2296dnl set paths for state directory
2297dnl ------------------------------
2298AC_MSG_CHECKING([directory to use for state file])
2299if test "$prefix" = "NONE"; then
2300  frr_statedir_prefix="";
2301else
2302  frr_statedir_prefix=${prefix}
2303fi
2304if test "$localstatedir" = '${prefix}/var'; then
2305  for FRR_STATE_DIR in ${frr_statedir_prefix}/var/run dnl
2306			${frr_statedir_prefix}/var/adm dnl
2307			${frr_statedir_prefix}/etc dnl
2308			/var/run	dnl
2309                        /var/adm	dnl
2310                        /etc		dnl
2311                        /dev/null;
2312  do
2313    test -d $FRR_STATE_DIR && break
2314  done
2315  frr_statedir=$FRR_STATE_DIR
2316else
2317  frr_statedir=${localstatedir}
2318fi
2319if test "$frr_statedir" = "/dev/null"; then
2320    AC_MSG_ERROR([STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!])
2321fi
2322AC_MSG_RESULT([${frr_statedir}])
2323AC_SUBST([frr_statedir])
2324
2325AC_DEFINE_UNQUOTED([LDPD_SOCKET], ["$frr_statedir%s%s/ldpd.sock"], [ldpd control socket])
2326AC_DEFINE_UNQUOTED([ZEBRA_SERV_PATH], ["$frr_statedir%s%s/zserv.api"], [zebra api socket])
2327AC_DEFINE_UNQUOTED([BFDD_CONTROL_SOCKET], ["$frr_statedir%s%s/bfdd.sock"], [bfdd control socket])
2328AC_DEFINE_UNQUOTED([DAEMON_VTY_DIR], ["$frr_statedir%s%s"], [daemon vty directory])
2329AC_DEFINE_UNQUOTED([DAEMON_DB_DIR], ["$frr_statedir"], [daemon database directory])
2330
2331dnl autoconf does this, but it does it too late...
2332test "$prefix" = "NONE" && prefix=$ac_default_prefix
2333test "$exec_prefix" = "NONE" && exec_prefix='${prefix}'
2334
2335dnl get the full path, recursing through variables...
2336vtysh_bin="$bindir/vtysh"
2337for I in 1 2 3 4 5 6 7 8 9 10; do
2338	eval vtysh_bin="\"$vtysh_bin\""
2339done
2340AC_DEFINE_UNQUOTED([VTYSH_BIN_PATH], ["$vtysh_bin"], [path to vtysh binary])
2341AC_SUBST([vtysh_bin])
2342
2343CFG_SYSCONF="$sysconfdir"
2344CFG_SBIN="$sbindir"
2345CFG_STATE="$frr_statedir"
2346CFG_MODULE="$moduledir"
2347CFG_YANGMODELS="$yangmodelsdir"
2348for I in 1 2 3 4 5 6 7 8 9 10; do
2349	eval CFG_SYSCONF="\"$CFG_SYSCONF\""
2350	eval CFG_SBIN="\"$CFG_SBIN\""
2351	eval CFG_STATE="\"$CFG_STATE\""
2352	eval CFG_MODULE="\"$CFG_MODULE\""
2353	eval CFG_YANGMODELS="\"$CFG_YANGMODELS\""
2354done
2355AC_SUBST([CFG_SYSCONF])
2356AC_SUBST([CFG_SBIN])
2357AC_SUBST([CFG_STATE])
2358AC_SUBST([CFG_MODULE])
2359AC_SUBST([CFG_YANGMODELS])
2360AC_DEFINE_UNQUOTED([MODULE_PATH], ["$CFG_MODULE"], [path to modules])
2361AC_DEFINE_UNQUOTED([YANG_MODELS_PATH], ["$CFG_YANGMODELS"], [path to YANG data models])
2362AC_DEFINE_UNQUOTED([WATCHFRR_SH_PATH], ["${CFG_SBIN%/}/watchfrr.sh"], [path to watchfrr.sh])
2363
2364dnl various features
2365AM_CONDITIONAL([SUPPORT_REALMS], [test "$enable_realms" = "yes"])
2366AM_CONDITIONAL([ENABLE_BGP_VNC], [test "$enable_bgp_vnc" != "no"])
2367AM_CONDITIONAL([BGP_BMP], [$bgpd_bmp])
2368dnl northbound
2369AM_CONDITIONAL([SQLITE3], [$SQLITE3])
2370AM_CONDITIONAL([CONFD], [test "$enable_confd" != ""])
2371AM_CONDITIONAL([SYSREPO], [test "$enable_sysrepo" = "yes"])
2372AM_CONDITIONAL([GRPC], [test "$enable_grpc" = "yes"])
2373AM_CONDITIONAL([ZEROMQ], [test "$ZEROMQ" = "true"])
2374dnl plugins
2375AM_CONDITIONAL([RPKI], [test "$RPKI" = "true"])
2376AM_CONDITIONAL([SNMP], [test "$SNMP_METHOD" = "agentx"])
2377AM_CONDITIONAL([IRDP], [$IRDP])
2378AM_CONDITIONAL([FPM], [test "$enable_fpm" = "yes"])
2379AM_CONDITIONAL([HAVE_PROTOBUF], [test "$enable_protobuf" = "yes"])
2380AM_CONDITIONAL([HAVE_PROTOBUF3], [$PROTO3])
2381dnl daemons
2382AM_CONDITIONAL([VTYSH], [test "$VTYSH" = "vtysh"])
2383AM_CONDITIONAL([ZEBRA], [test "$enable_zebra" != "no"])
2384AM_CONDITIONAL([BGPD], [test "$enable_bgpd" != "no"])
2385AM_CONDITIONAL([RIPD], [test "$enable_ripd" != "no"])
2386AM_CONDITIONAL([OSPFD], [test "$enable_ospfd" != "no"])
2387AM_CONDITIONAL([LDPD], [test "$enable_ldpd" != "no"])
2388AM_CONDITIONAL([BFDD], [test "$BFDD" = "bfdd"])
2389AM_CONDITIONAL([NHRPD], [test "$NHRPD" = "nhrpd"])
2390AM_CONDITIONAL([EIGRPD], [test "$enable_eigrpd" != "no"])
2391AM_CONDITIONAL([WATCHFRR], [test "$WATCHFRR" = "watchfrr"])
2392AM_CONDITIONAL([OSPFCLIENT], [test "$OSPFCLIENT" = "ospfclient"])
2393AM_CONDITIONAL([RIPNGD], [test "$enable_ripngd" != "no"])
2394AM_CONDITIONAL([BABELD], [test "$enable_babeld" != "no"])
2395AM_CONDITIONAL([OSPF6D], [test "$enable_ospf6d" != "no"])
2396AM_CONDITIONAL([ISISD], [test "$enable_isisd" != "no"])
2397AM_CONDITIONAL([PIMD], [test "$enable_pimd" != "no"])
2398AM_CONDITIONAL([PBRD], [test "$enable_pbrd" != "no"])
2399AM_CONDITIONAL([SHARPD], [test "$enable_sharpd" = "yes"])
2400AM_CONDITIONAL([STATICD], [test "$enable_staticd" != "no"])
2401AM_CONDITIONAL([FABRICD], [test "$enable_fabricd" != "no"])
2402AM_CONDITIONAL([VRRPD], [test "$enable_vrrpd" != "no"])
2403
2404AC_CONFIG_FILES([Makefile],[
2405	test "$enable_dev_build" = "yes" && makefile_devbuild="--dev-build"
2406	${PYTHON} "${ac_abs_top_srcdir}/python/makefile.py" ${makefile_devbuild} || exit 1
2407], [
2408	PYTHON="$PYTHON"
2409	enable_dev_build="$enable_dev_build"
2410])
2411
2412AC_CONFIG_FILES([
2413	  config.version
2414	  changelog-auto
2415	  redhat/frr.spec
2416	  solaris/Makefile
2417	  alpine/APKBUILD
2418	  snapcraft/snapcraft.yaml
2419	  lib/version.h
2420	  tests/lib/cli/test_cli.refout
2421	  pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
2422	  pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh
2423	  pkgsrc/eigrpd.sh])
2424
2425AC_CONFIG_FILES([vtysh/extract.pl], [chmod +x vtysh/extract.pl])
2426AC_CONFIG_FILES([tools/frr], [chmod +x tools/frr])
2427AC_CONFIG_FILES([tools/watchfrr.sh], [chmod +x tools/watchfrr.sh])
2428AC_CONFIG_FILES([tools/frrinit.sh], [chmod +x tools/frrinit.sh])
2429AC_CONFIG_FILES([tools/frrcommon.sh])
2430
2431AC_CONFIG_COMMANDS([lib/route_types.h], [
2432	dst="${ac_abs_top_builddir}/lib/route_types.h"
2433	${PERL} "${ac_abs_top_srcdir}/lib/route_types.pl" \
2434		< "${ac_abs_top_srcdir}/lib/route_types.txt" \
2435		> "${dst}.tmp"
2436	test -f "$dst" \
2437		&& diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2438		&& rm "${dst}.tmp" \
2439		|| mv "${dst}.tmp" "${dst}"
2440], [
2441	PERL="$PERL"
2442])
2443
2444AS_IF([test "$with_pkg_git_version" = "yes"], [
2445    AC_CONFIG_COMMANDS([lib/gitversion.h], [
2446	dst="${ac_abs_top_builddir}/lib/gitversion.h"
2447	${PERL} "${ac_abs_top_srcdir}/lib/gitversion.pl" \
2448		"${ac_abs_top_srcdir}" \
2449		> "${dst}.tmp"
2450	test -f "$dst" \
2451		&& diff "${dst}.tmp" "${dst}" >/dev/null 2>/dev/null \
2452		&& rm "${dst}.tmp" \
2453		|| mv "${dst}.tmp" "${dst}"
2454    ], [
2455	PERL="$PERL"
2456    ])
2457])
2458
2459## Hack, but working solution to avoid rebuilding of frr.info.
2460## It's already in CVS until texinfo 4.7 is more common.
2461AC_OUTPUT
2462
2463echo "
2464FRRouting configuration
2465------------------------------
2466FRR version             : ${PACKAGE_VERSION}
2467host operating system   : ${host_os}
2468source code location    : ${srcdir}
2469compiler                : ${CC}
2470compiler flags          : ${CFLAGS} ${SAN_FLAGS}
2471make                    : ${MAKE-make}
2472linker flags            : ${LDFLAGS} ${SAN_FLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
2473state file directory    : ${frr_statedir}
2474config file directory   : `eval echo \`echo ${sysconfdir}\``
2475example directory       : `eval echo \`echo ${exampledir}\``
2476module directory        : ${CFG_MODULE}
2477user to run as          : ${enable_user}
2478group to run as         : ${enable_group}
2479group for vty sockets   : ${enable_vty_group}
2480config file mask        : ${enable_configfile_mask}
2481log file mask           : ${enable_logfile_mask}
2482zebra protobuf enabled  : ${enable_protobuf:-no}
2483
2484The above user and group must have read/write access to the state file
2485directory and to the config files in the config file directory."
2486
2487if test "$enable_doc" != "no" -a "$frr_py_mod_sphinx" = "false"; then
2488  AC_MSG_WARN([sphinx is missing but required to build documentation])
2489fi
2490if test "$frr_py_mod_pytest" = "false"; then
2491  AC_MSG_WARN([pytest is missing, unit tests cannot be performed])
2492fi
2493