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