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