]> git.proxmox.com Git - mirror_frr.git/blob - configure.ac
configure: fix OpenPAM detection
[mirror_frr.git] / configure.ac
1 ##
2 ## Configure template file for Quagga.
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 ## $Id$
9 AC_PREREQ(2.53)
10
11 AC_INIT(Quagga, 0.99.19, [https://bugzilla.quagga.net])
12 AC_CONFIG_SRCDIR(lib/zebra.h)
13 AC_CONFIG_MACRO_DIR([m4])
14
15 dnl -----------------------------------
16 dnl Get hostname and other information.
17 dnl -----------------------------------
18 AC_CANONICAL_BUILD()
19 AC_CANONICAL_HOST()
20 AC_CANONICAL_TARGET()
21
22 AM_INIT_AUTOMAKE(1.6)
23 AM_CONFIG_HEADER(config.h)
24
25 AC_CHECK_PROG([GAWK],[gawk],[gawk],[not-in-PATH])
26 if test "x$GAWK" = "xnot-in-PATH" ; then
27 AC_MSG_ERROR([GNU awk is required for lib/memtype.h made by memtypes.awk.
28 BSD awk complains: awk: gensub doesn't support backreferences (subst "\1") ])
29 fi
30 AC_ARG_VAR([GAWK],[GNU AWK])
31
32 dnl default is to match previous behavior
33 exampledir=${sysconfdir}
34 AC_ARG_ENABLE([exampledir],
35 AC_HELP_STRING([--enable-exampledir],
36 [specify alternate directory for examples]),
37 exampledir="$enableval",)
38 dnl XXX add --exampledir to autoconf standard directory list somehow
39 AC_SUBST(exampledir)
40
41 dnl default is to match previous behavior
42 pkgsrcrcdir=""
43 pkgsrcdir=""
44 AC_ARG_ENABLE([pkgsrcrcdir],
45 AC_HELP_STRING([--enable-pkgsrcrcdir],
46 [specify directory for rc.d scripts]),
47 pkgsrcrcdir="$enableval"; pkgsrcdir="pkgsrc",)
48 dnl XXX add --pkgsrcrcdir to autoconf standard directory list somehow
49 AC_SUBST(pkgsrcdir)
50 AC_SUBST(pkgsrcrcdir)
51
52 dnl ------------
53 dnl Check CFLAGS
54 dnl ------------
55 AC_ARG_WITH(cflags,
56 [ --with-cflags Set CFLAGS for use in compilation.])
57 if test "x$with_cflags" != "x" ; then
58 CFLAGS="$with_cflags" ; cflags_specified=yes ;
59 elif test -n "$CFLAGS" ; then
60 cflags_specified=yes ;
61 fi
62
63 dnl --------------------
64 dnl Check CC and friends
65 dnl --------------------
66 AC_LANG([C])
67 AC_PROG_CC
68 AC_PROG_CPP
69 AM_PROG_CC_C_O
70 AC_PROG_EGREP
71
72 dnl autoconf 2.59 appears not to support AC_PROG_SED
73 dnl AC_PROG_SED
74 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
75
76 dnl ------------------------------------------------------------------
77 dnl Intel compiler check. Although Intel tries really hard to make icc
78 dnl look like gcc, there are some differences. It's very verbose with
79 dnl -Wall and it doesn't support the individual -W options.
80 dnl ------------------------------------------------------------------
81 if test "x${GCC}" = "xyes" ; then
82 COMPILER="GCC"
83 AC_MSG_CHECKING([whether we are using the Intel compiler])
84 AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
85 [AC_MSG_RESULT([no])],
86 [COMPILER="ICC"
87 AC_MSG_RESULT([yes])]
88 )
89 else
90 AC_MSG_CHECKING([whether we are using SunPro compiler])
91 AC_EGREP_CPP([^__SUNPRO_C.*0x5(7|8|9)], ["__SUNPRO_C" __SUNPRO_C],
92 [AC_MSG_RESULT([no])],
93 [COMPILER="SUNPRO"
94 AC_MSG_RESULT([yes])]
95 )
96 fi
97
98 dnl ---------------------------------------------
99 dnl If CLFAGS doesn\'t exist set default value
100 dnl AC_PROG_CC will have set minimal default
101 dnl already, eg "-O2 -g" for gcc, "-g" for others
102 dnl (Wall is gcc specific... have to make sure
103 dnl gcc is being used before setting it)
104 dnl
105 dnl Intel icc 8.0 also sets __GNUC__,
106 dnl but doesn't support all these fancy -W options.
107 dnl Intel compiler warnings we ignore:
108 dnl 279: controlling expression is constant.
109 dnl 869: parameter "xxx" was never referenced - to avoid massive warnings
110 dnl about "self", "vty", "argc" and "argv" never referenced in DEFUN
111 dnl macro.
112 dnl 981: operands are evaluated in unspecified order.
113 dnl
114 dnl Sun Studio 10 / SunPro 5.7 is also supported,
115 dnl so lets set some sane CFLAGS for it.
116 dnl ---------------------------------------------
117
118 AC_MSG_CHECKING([whether to set a default CFLAGS])
119 if test "x${cflags_specified}" = "x" ; then
120 case ${COMPILER} in
121 "ICC")
122 CFLAGS="-Os -g -Wall -wd 279,869,981"
123 AC_MSG_RESULT([Intel default])
124 ;;
125 "GCC")
126 CFLAGS="-Os -fno-omit-frame-pointer -g -std=gnu99 -Wall"
127 CFLAGS="${CFLAGS} -Wsign-compare -Wpointer-arith"
128 CFLAGS="${CFLAGS} -Wbad-function-cast -Wwrite-strings"
129 CFLAGS="${CFLAGS} -Wmissing-prototypes -Wmissing-declarations"
130 CFLAGS="${CFLAGS} -Wchar-subscripts -Wcast-qual"
131 # TODO: conditionally addd -Wpacked if handled
132 AC_MSG_RESULT([gcc default])
133 ;;
134 "SUNPRO")
135 CFLAGS="-xO4 -v -g -xspace -xcode=pic32 -xstrconst -xc99"
136 AC_MSG_RESULT([SunPro default])
137 ;;
138 *)
139 AC_MSG_RESULT([unknown compiler])
140 ;;
141 esac
142 else
143 AC_MSG_RESULT([CFLAGS supplied by user])
144 fi
145
146 dnl --------------
147 dnl Check programs
148 dnl --------------
149 AC_PROG_INSTALL
150 AC_PROG_LN_S
151 AC_PROG_MAKE_SET
152 AC_CHECK_TOOL(AR, ar)
153
154 dnl ---------------------------
155 dnl We, perhaps unfortunately,
156 dnl depend on GNU Make specific
157 dnl constructs.
158 dnl Give the user a warning if
159 dnl not GNU Make.
160 dnl ---------------------------
161 AC_CACHE_CHECK([if ${MAKE-make} is GNU make], [quagga_cv_gnu_make],
162 [quagga_cv_gnu_make=no
163 if ${MAKE-make} --version 2>/dev/null | \
164 grep '^GNU Make ' >/dev/null ; then
165 quagga_cv_gnu_make=yes;
166 fi
167 ]
168 )
169
170 dnl -----------------
171 dnl System extensions
172 dnl -----------------
173 AC_GNU_SOURCE
174
175 dnl -------
176 dnl libtool
177 dnl -------
178 AC_PROG_LIBTOOL
179
180 dnl ----------------------
181 dnl Packages configuration
182 dnl ----------------------
183 AC_ARG_ENABLE(vtysh,
184 [ --enable-vtysh include integrated vty shell for Quagga])
185 AC_ARG_ENABLE(ipv6,
186 [ --disable-ipv6 turn off IPv6 related features and daemons])
187 AC_ARG_ENABLE(doc,
188 [ --disable-doc do not build docs])
189 AC_ARG_ENABLE(zebra,
190 [ --disable-zebra do not build zebra daemon])
191 AC_ARG_ENABLE(bgpd,
192 [ --disable-bgpd do not build bgpd])
193 AC_ARG_ENABLE(ripd,
194 [ --disable-ripd do not build ripd])
195 AC_ARG_ENABLE(ripngd,
196 [ --disable-ripngd do not build ripngd])
197 AC_ARG_ENABLE(ospfd,
198 [ --disable-ospfd do not build ospfd])
199 AC_ARG_ENABLE(ospf6d,
200 [ --disable-ospf6d do not build ospf6d])
201 AC_ARG_ENABLE(watchquagga,
202 [ --disable-watchquagga do not build watchquagga])
203 AC_ARG_ENABLE(isisd,
204 [ --enable-isisd build isisd])
205 AC_ARG_ENABLE(solaris,
206 [ --enable-solaris build solaris])
207 AC_ARG_ENABLE(bgp-announce,
208 [ --disable-bgp-announce, turn off BGP route announcement])
209 AC_ARG_ENABLE(netlink,
210 [ --enable-netlink force to use Linux netlink interface])
211 AC_ARG_ENABLE(broken-aliases,
212 [ --enable-broken-aliases enable aliases as distinct interfaces for Linux 2.2.X])
213 AC_ARG_WITH(crypto,
214 [ --without-crypto do not use libcrypto in SNMP])
215 AC_ARG_ENABLE(snmp,
216 [ --enable-snmp enable SNMP support])
217 AC_ARG_WITH(libpam,
218 [ --with-libpam use libpam for PAM support in vtysh])
219 AC_ARG_ENABLE(tcp-zebra,
220 [ --enable-tcp-zebra enable TCP/IP socket connection between zebra and protocol daemon])
221 AC_ARG_ENABLE(opaque-lsa,
222 AC_HELP_STRING([--disable-opaque-lsa],[do not build OSPF Opaque-LSA with OSPFAPI support (RFC2370)]))
223 AC_ARG_ENABLE(ospfapi,
224 [ --disable-ospfapi do not build OSPFAPI to access the OSPF LSA Database])
225 AC_ARG_ENABLE(ospfclient,
226 [ --disable-ospfclient do not build OSPFAPI client for OSPFAPI,
227 (this is the default if --disable-ospfapi is set)])
228 AC_ARG_ENABLE(ospf-te,
229 AC_HELP_STRING([--disable-ospf-te],[disable Traffic Engineering Extension to OSPF]))
230 AC_ARG_ENABLE(multipath,
231 [ --enable-multipath=ARG enable multipath function, ARG must be digit])
232 AC_ARG_ENABLE(user,
233 AC_HELP_STRING([--enable-user=user], [user to run Quagga suite as (default quagga)]))
234 AC_ARG_ENABLE(group,
235 AC_HELP_STRING([--enable-group=group], [group to run Quagga suite as (default quagga)]))
236 AC_ARG_ENABLE(vty_group,
237 [ --enable-vty-group=ARG set vty sockets to have specified group as owner])
238 AC_ARG_ENABLE(configfile_mask,
239 [ --enable-configfile-mask=ARG set mask for config files])
240 AC_ARG_ENABLE(logfile_mask,
241 [ --enable-logfile-mask=ARG set mask for log files])
242
243 AC_ARG_ENABLE(rtadv,
244 [ --disable-rtadv disable IPV6 router advertisement feature])
245 AC_ARG_ENABLE(irdp,
246 [ --enable-irdp enable IRDP server support in zebra])
247 AC_ARG_ENABLE(isis_topology,
248 [ --enable-isis-topology enable IS-IS topology generator])
249 AC_ARG_ENABLE(capabilities,
250 [ --disable-capabilities disable using POSIX capabilities])
251 AC_ARG_ENABLE(gcc_ultra_verbose,
252 [ --enable-gcc-ultra-verbose enable ultra verbose GCC warnings])
253 AC_ARG_ENABLE(linux24_tcp_md5,
254 [ --enable-linux24-tcp-md5 enable support for old, Linux-2.4 RFC2385 patch])
255 AC_ARG_ENABLE(gcc-rdynamic,
256 [ --enable-gcc-rdynamic enable gcc linking with -rdynamic for better backtraces])
257 AC_ARG_ENABLE(time-check,
258 [ --disable-time-check disable slow thread warning messages])
259 AC_ARG_ENABLE(pcreposix,
260 [ --enable-pcreposix enable using PCRE Posix libs for regex functions])
261
262 if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then
263 CFLAGS="${CFLAGS} -W -Wcast-qual -Wstrict-prototypes"
264 CFLAGS="${CFLAGS} -Wmissing-declarations -Wmissing-noreturn"
265 CFLAGS="${CFLAGS} -Wmissing-format-attribute -Wunreachable-code"
266 CFLAGS="${CFLAGS} -Wpacked -Wpadded"
267 fi
268
269 if test x"${enable_gcc_rdynamic}" = x"yes" ; then
270 LDFLAGS="${LDFLAGS} -rdynamic"
271 fi
272
273 if test x"${enable_time_check}" != x"no" ; then
274 if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
275 AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
276 else
277 AC_DEFINE_UNQUOTED(CONSUMED_TIME_CHECK,$enable_time_check,Consumed Time Check)
278 fi
279 fi
280
281 if test "${enable_broken_aliases}" = "yes"; then
282 if test "${enable_netlink}" = "yes"
283 then
284 AC_MSG_FAILURE([Sorry you can not use netlink with broken aliases])
285 fi
286 AC_DEFINE(HAVE_BROKEN_ALIASES,,Broken Alias)
287 enable_netlink=no
288 fi
289
290 if test "${enable_tcp_zebra}" = "yes"; then
291 AC_DEFINE(HAVE_TCP_ZEBRA,,Use TCP for zebra communication)
292 fi
293
294 if test "${enable_opaque_lsa}" != "no"; then
295 AC_DEFINE(HAVE_OPAQUE_LSA,,OSPF Opaque LSA)
296 fi
297
298 if test "${enable_ospf_te}" != "no"; then
299 AC_DEFINE(HAVE_OPAQUE_LSA,,OSPF Opaque LSA)
300 AC_DEFINE(HAVE_OSPF_TE,,OSPF TE)
301 fi
302
303 if test "${enable_linux24_tcp_md5}" = "yes"; then
304 AC_DEFINE(HAVE_TCP_MD5_LINUX24,,Old Linux 2.4 TCP MD5 Signature Patch)
305 fi
306
307 AC_MSG_CHECKING(if zebra should be configurable to send Route Advertisements)
308 if test "${enable_rtadv}" != "no"; then
309 AC_MSG_RESULT(yes)
310 AC_DEFINE(HAVE_RTADV,,Enable IPv6 Routing Advertisement support)
311 else
312 AC_MSG_RESULT(no)
313 fi
314
315 if test "${enable_irdp}" = "yes"; then
316 AC_DEFINE(HAVE_IRDP,, IRDP )
317 fi
318
319 if test "${enable_isisd}" = "yes" && test "${enable_isis_topology}" = yes; then
320 AC_DEFINE(TOPOLOGY_GENERATE,,Enable IS-IS topology generator code)
321 ISIS_TOPOLOGY_INCLUDES="-I./topology"
322 ISIS_TOPOLOGY_DIR="topology"
323 ISIS_TOPOLOGY_LIB="./topology/libtopology.a"
324 fi
325
326 AC_SUBST(ISIS_TOPOLOGY_INCLUDES)
327 AC_SUBST(ISIS_TOPOLOGY_DIR)
328 AC_SUBST(ISIS_TOPOLOGY_LIB)
329
330 if test "${enable_user}" = "yes" || test x"${enable_user}" = x""; then
331 enable_user="quagga"
332 elif test "${enable_user}" = "no"; then
333 enable_user="root"
334 fi
335
336 if test "${enable_group}" = "yes" || test x"${enable_group}" = x""; then
337 enable_group="quagga"
338 elif test "${enable_group}" = "no"; then
339 enable_group="root"
340 fi
341
342 if test x"${enable_vty_group}" = x"yes" ; then
343 AC_MSG_ERROR([--enable-vty-group requires a group as argument, not yes])
344 elif test x"${enable_vty_group}" != x""; then
345 if test x"${enable_vty_group}" != x"no"; then
346 AC_DEFINE_UNQUOTED(VTY_GROUP, "${enable_vty_group}", VTY Sockets Group)
347 fi
348 fi
349 AC_SUBST([enable_user])
350 AC_SUBST([enable_group])
351 AC_SUBST([enable_vty_group])
352 AC_DEFINE_UNQUOTED(QUAGGA_USER, "${enable_user}", Quagga User)
353 AC_DEFINE_UNQUOTED(QUAGGA_GROUP, "${enable_group}", Quagga Group)
354
355 enable_configfile_mask=${enable_configfile_mask:-0600}
356 AC_DEFINE_UNQUOTED(CONFIGFILE_MASK, ${enable_configfile_mask}, Mask for config files)
357
358 enable_logfile_mask=${enable_logfile_mask:-0600}
359 AC_DEFINE_UNQUOTED(LOGFILE_MASK, ${enable_logfile_mask}, Mask for log files)
360
361 MULTIPATH_NUM=1
362
363 case "${enable_multipath}" in
364 [[0-9]|[1-9][0-9]])
365 MULTIPATH_NUM="${enable_multipath}"
366 ;;
367 "")
368 ;;
369 *)
370 AC_MSG_FAILURE([Please specify digit to enable multipath ARG])
371 ;;
372 esac
373
374 AC_SUBST(MULTIPATH_NUM)
375
376 dnl ------------------------------------
377 dnl Check C keywords and standard types
378 dnl ------------------------------------
379 AC_C_CONST
380 AC_C_INLINE
381 AC_C_RESTRICT
382 AC_C_VOLATILE
383 AC_HEADER_STDC
384 AC_HEADER_TIME
385 AC_HEADER_SYS_WAIT
386 dnl AC_TYPE_PID_T
387 AC_TYPE_UID_T
388 AC_TYPE_MODE_T
389 AC_TYPE_SIZE_T
390 AC_TYPE_SIGNAL
391 AC_STRUCT_TM
392
393 dnl -------------------------
394 dnl Check other header files.
395 dnl -------------------------
396 AC_CHECK_HEADERS([stropts.h sys/ksym.h sys/times.h sys/select.h \
397 sys/types.h linux/version.h netdb.h asm/types.h \
398 sys/param.h limits.h signal.h \
399 sys/socket.h netinet/in.h time.h sys/time.h])
400
401 dnl Utility macro to avoid retyping includes all the time
402 m4_define([QUAGGA_INCLUDES],
403 [#ifdef SUNOS_5
404 #define _XPG4_2
405 #define __EXTENSIONS__
406 #endif
407 #include <stdio.h>
408 #if STDC_HEADERS
409 # include <stdlib.h>
410 # include <stddef.h>
411 #else
412 # if HAVE_STDLIB_H
413 # include <stdlib.h>
414 # endif
415 #endif
416 #if HAVE_SYS_TYPES_H
417 # include <sys/types.h>
418 #endif
419 /* sys/conf.h depends on param.h on FBSD at least */
420 #if HAVE_SYS_PARAM_H
421 # include <sys/param.h>
422 #endif
423 /* Required for MAXSIG */
424 #if HAVE_SIGNAL_H
425 # include <signal.h>
426 #endif
427 #if HAVE_SYS_SOCKET_H
428 # include <sys/socket.h>
429 #endif
430 #if HAVE_NETINET_IN_H
431 # include <netinet/in.h>
432 #endif
433 #ifdef TIME_WITH_SYS_TIME
434 # include <sys/time.h>
435 # include <time.h>
436 #else
437 # ifdef HAVE_SYS_TIME_H
438 # include <sys/time.h>
439 # else
440 # include <time.h>
441 # endif
442 #endif /* TIME_WITH_SYS_TIME */
443 ])dnl
444
445 dnl HAVE_NET_IF_H must be discovered by the time the longer AC_CHECK_HEADERS
446 dnl round below execution begins, otherwise it doesn't properly detect
447 dnl HAVE_NETINET6_IN6_VAR_H, HAVE_NET_IF_VAR_H and HAVE_STRUCT_IN6_ALIASREQ
448 dnl on FreeBSD (BZ#408).
449
450 AC_CHECK_HEADERS([net/if.h], [], [], QUAGGA_INCLUDES)
451
452 m4_define([QUAGGA_INCLUDES],
453 QUAGGA_INCLUDES
454 [#if HAVE_NET_IF_H
455 # include <net/if.h>
456 #endif
457 ])dnl
458
459 dnl Same applies for HAVE_NET_IF_VAR_H, which HAVE_NETINET6_ND6_H and
460 dnl HAVE_NETINET_IN_VAR_H depend upon. But if_var.h depends on if.h, hence
461 dnl an additional round for it.
462
463 AC_CHECK_HEADERS([net/if_var.h], [], [], QUAGGA_INCLUDES)
464
465 m4_define([QUAGGA_INCLUDES],
466 QUAGGA_INCLUDES
467 [#if HAVE_NET_IF_VAR_H
468 # include <net/if_var.h>
469 #endif
470 ])dnl
471
472 AC_CHECK_HEADERS([sys/un.h netinet/in_systm.h netinet/in_var.h \
473 net/if_dl.h net/netopt.h net/route.h \
474 inet/nd.h arpa/inet.h netinet/ip_icmp.h \
475 fcntl.h stddef.h sys/ioctl.h syslog.h wchar.h wctype.h \
476 sys/sysctl.h sys/sockio.h kvm.h sys/conf.h],
477 [], [], QUAGGA_INCLUDES)
478
479 AC_CHECK_HEADERS([ucontext.h], [], [],
480 [#ifndef __USE_GNU
481 #define __USE_GNU
482 #endif /* __USE_GNU */
483 QUAGGA_INCLUDES
484 ])
485
486 m4_define([QUAGGA_INCLUDES],
487 QUAGGA_INCLUDES
488 [#if HAVE_SYS_UN_H
489 # include <sys/un.h>
490 #endif
491 #if HAVE_NETINET_IN_SYSTM_H
492 # include <netinet/in_systm.h>
493 #endif
494 #if HAVE_NETINET_IN_VAR_H
495 # include <netinet/in_var.h>
496 #endif
497 #if HAVE_NET_IF_DL_H
498 # include <net/if_dl.h>
499 #endif
500 #if HAVE_NET_NETOPT_H
501 # include <net/netopt.h>
502 #endif
503 #if HAVE_NET_ROUTE_H
504 # include <net/route.h>
505 #endif
506 #if HAVE_INET_ND_H
507 # include <inet/nd.h>
508 #endif
509 #if HAVE_ARPA_INET_H
510 # include <arpa/inet.h>
511 #endif
512 /* Required for IDRP */
513 #if HAVE_NETINET_IP_ICMP_H
514 # include <netinet/ip_icmp.h>
515 #endif
516 ])dnl
517
518 dnl V6 headers are checked below, after we check for v6
519
520 dnl Some systems (Solaris 2.x) require libnsl (Network Services Library)
521 case "$host" in
522 [*-sunos5.[6-7]*] | [*-solaris2.[6-7]*])
523 opsys=sol2-6
524 AC_DEFINE(SUNOS_56, 1, SunOS 5.6 to 5.7)
525 AC_DEFINE(SUNOS_5, 1, SunOS 5)
526 AC_CHECK_LIB(xnet, main)
527 CURSES=-lcurses
528 ;;
529 [*-sunos5.[8-9]] \
530 | [*-sunos5.1[0-9]] \
531 | [*-sunos5.1[0-9].[0-9]] \
532 | [*-solaris2.[8-9]] \
533 | [*-solaris2.1[0-9]] \
534 | [*-solaris2.1[0-9].[0-9]])
535 opsys=sol8
536 AC_DEFINE(SUNOS_59, 1, [SunOS 5.8 up])
537 AC_DEFINE(SUNOS_5, 1, [SunOS 5])
538 AC_CHECK_LIB(socket, main)
539 AC_CHECK_LIB(nsl, main)
540 AC_CHECK_LIB(umem, main)
541 AC_CHECK_FUNCS([printstack],
542 [AC_DEFINE([HAVE_PRINTSTACK],1,[Solaris printstack])
543 AC_DEFINE([HAVE_STACK_TRACE],1,[Stack symbols decode functionality])
544 ])
545 CURSES=-lcurses
546 ;;
547 *-sunos5* | *-solaris2*)
548 AC_DEFINE(SUNOS_5,,SunOS 5, Unknown SunOS)
549 AC_CHECK_LIB(socket, main)
550 AC_CHECK_LIB(nsl, main)
551 CURSES=-lcurses
552 ;;
553 *-linux*)
554 opsys=gnu-linux
555 AC_DEFINE(GNU_LINUX,,GNU Linux)
556 ;;
557 *-nec-sysv4*)
558 AC_CHECK_LIB(nsl, gethostbyname)
559 AC_CHECK_LIB(socket, socket)
560 ;;
561 *-openbsd*)
562 opsys=openbsd
563 AC_DEFINE(OPEN_BSD,,OpenBSD)
564 ;;
565 *-bsdi*)
566 opsys=bsdi
567 OTHER_METHOD="mtu_kvm.o"
568 AC_CHECK_LIB(kvm, main)
569 ;;
570 *-irix6.5)
571 opsys=irix
572 AC_DEFINE(IRIX_65,,IRIX 6.5)
573 ;;
574 esac
575
576 AC_SYS_LARGEFILE
577
578 dnl ---------------------
579 dnl Integrated VTY option
580 dnl ---------------------
581 case "${enable_vtysh}" in
582 "yes") VTYSH="vtysh";
583 AC_DEFINE(VTYSH,,VTY shell)
584 AC_PATH_PROG(PERL, perl)
585 dnl Vtysh uses libreadline, which looks for termcap functions at
586 dnl configure time. We follow readlines search order.
587 dnl The required procedures are in libtermcap on NetBSD, in
588 dnl [TODO] on Linux, and in [TODO] on Solaris.
589 AC_CHECK_LIB(termcap, tputs, LIBREADLINE="$LIBREADLINE -ltermcap",
590 [AC_CHECK_LIB(tinfo, tputs, LIBREADLINE="$LIBREADLINE -ltinfo",
591 [AC_CHECK_LIB(curses, tputs, LIBREADLINE="$LIBREADLINE -lcurses",
592 [AC_CHECK_LIB(ncurses, tputs,
593 LIBREADLINE="$LIBREADLINE -lncurses")]
594 )]
595 )]
596 )
597 AC_CHECK_LIB(readline, main, LIBREADLINE="$LIBREADLINE -lreadline",,
598 "$LIBREADLINE")
599 if test $ac_cv_lib_readline_main = no; then
600 AC_MSG_ERROR([vtysh needs libreadline but was not found and usable on your system.])
601 fi
602 AC_CHECK_HEADER(readline/history.h)
603 if test $ac_cv_header_readline_history_h = no;then
604 AC_MSG_ERROR([readline is too old to have readline/history.h, please update to the latest readline library.])
605 fi
606 AC_CHECK_LIB(readline, rl_completion_matches,
607 LIBREADLINE="$LIBREADLINE",, "$LIBREADLINE")
608 if test $ac_cv_lib_readline_rl_completion_matches = no; then
609 AC_DEFINE(rl_completion_matches,completion_matches,Old readline)
610 fi
611 ;;
612 "no" ) VTYSH="";;
613 * ) ;;
614 esac
615 AC_SUBST(LIBREADLINE)
616
617 dnl ----------
618 dnl PAM module
619 dnl
620 dnl Quagga detects the PAM library it is built against by checking for a
621 dnl functional pam_misc.h (Linux-PAM) or openpam.h (OpenPAM) header. pam_misc.h
622 dnl is known to #include pam_appl.h, the standard header of a PAM library, and
623 dnl openpam.h doesn't do that, although depends on the header too. Hence a
624 dnl little assistance to AC_CHECK_HEADER is necessary for the proper detection
625 dnl of OpenPAM.
626 dnl ----------
627 if test "$with_libpam" = "yes"; then
628 AC_CHECK_HEADER([security/pam_misc.h],
629 [AC_DEFINE(HAVE_PAM_MISC_H,,Have pam_misc.h)
630 AC_DEFINE(PAM_CONV_FUNC,misc_conv,Have misc_conv)
631 pam_conv_func="misc_conv"
632 ],
633 [], QUAGGA_INCLUDES)
634 AC_CHECK_HEADER([security/openpam.h],
635 [AC_DEFINE(HAVE_OPENPAM_H,,Have openpam.h)
636 AC_DEFINE(PAM_CONV_FUNC,openpam_ttyconv,Have openpam_ttyconv)
637 pam_conv_func="openpam_ttyconv"
638 ],
639 [], QUAGGA_INCLUDES[#include <security/pam_appl.h>])
640 if test -z "$ac_cv_header_security_pam_misc_h$ac_cv_header_security_openpam_h" ; then
641 AC_MSG_WARN([*** pam support will not be built ***])
642 with_libpam="no"
643 fi
644 fi
645
646 if test "$with_libpam" = "yes"; then
647 dnl took this test from proftpds configure.in and suited to our needs
648 dnl -------------------------------------------------------------------------
649 dnl
650 dnl This next check looks funky due to a linker problem with some versions
651 dnl of the PAM library. Prior to 0.72 release, the Linux PAM shared library
652 dnl omitted requiring libdl linking information. PAM-0.72 or better ships
653 dnl with RedHat 6.2 and Debian 2.2 or better.
654 AC_CHECK_LIB(pam, pam_start,
655 [AC_CHECK_LIB(pam, $pam_conv_func,
656 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
657 LIBPAM="-lpam"],
658 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
659 LIBPAM="-lpam -lpam_misc"]
660 )
661 ],
662
663 [AC_CHECK_LIB(pam, pam_end,
664 [AC_CHECK_LIB(pam, $pam_conv_func,
665 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
666 LIBPAM="-lpam -ldl"],
667 [AC_DEFINE(USE_PAM,,Use PAM for authentication)
668 LIBPAM="-lpam -ldl -lpam_misc"]
669 )
670 ],AC_MSG_WARN([*** pam support will not be built ***]),
671 [-ldl])
672 ]
673 )
674 fi
675 AC_SUBST(LIBPAM)
676
677 dnl -------------------------------
678 dnl Endian-ness check
679 dnl -------------------------------
680 AC_WORDS_BIGENDIAN
681
682 dnl -------------------------------
683 dnl check the size in byte of the C
684 dnl -------------------------------
685 dnl AC_CHECK_SIZEOF(char)
686 dnl AC_CHECK_SIZEOF(int)
687 dnl AC_CHECK_SIZEOF(short)
688 dnl AC_CHECK_SIZEOF(long)
689
690 dnl ----------------------------
691 dnl check existance of functions
692 dnl ----------------------------
693 AC_FUNC_CHOWN
694 AC_FUNC_FNMATCH
695 AC_FUNC_FORK
696 AC_FUNC_MALLOC
697 AC_FUNC_MEMCMP
698 AC_FUNC_MKTIME
699 AC_FUNC_STRFTIME
700 AC_FUNC_REALLOC
701 AC_FUNC_STAT
702 AC_FUNC_SELECT_ARGTYPES
703 AC_FUNC_STRFTIME
704 dnl Avoid AC_FUNC_STRNLEN because it pulls in AC_SYSTEM_EXTENSIONS which
705 dnl can lead to strange side effects. So we just check for strnlen
706 dnl directly, see below.
707 dnl AC_FUNC_STRNLENdnl
708 AC_FUNC_VPRINTF
709
710 dnl -------------------------------
711 dnl bgpd needs pow() and hence libm
712 dnl -------------------------------
713 TMPLIBS="$LIBS"
714 AC_CHECK_HEADER([math.h],
715 [AC_CHECK_LIB([m], [pow],
716 [LIBM="-lm"
717 LIBS="$LIBS $LIBM"
718 AC_DEFINE(HAVE_LIBM,, Have libm)
719 AC_CHECK_FUNCS(pow,[],[LIBM=""])
720 ])
721 ])
722 if test x"$LIBM" = x ; then
723 AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
724 fi
725 LIBS="$TMPLIBS"
726 AC_SUBST(LIBM)
727
728 dnl ---------------
729 dnl other functions
730 dnl ---------------
731 AC_CHECK_FUNCS([dup2 ftruncate getcwd gethostbyname getpagesize gettimeofday \
732 inet_ntoa inet_aton strnlen \
733 memchr memmove memset select socket \
734 strcasecmp strchr strcspn strdup strerror \
735 strncasecmp strndup strrchr strspn strstr \
736 strtol strtoul strlcat strlcpy \
737 daemon snprintf vsnprintf \
738 if_nametoindex if_indextoname getifaddrs \
739 uname fcntl])
740
741 AC_CHECK_FUNCS(setproctitle, ,
742 [AC_CHECK_LIB(util, setproctitle,
743 [LIBS="$LIBS -lutil"
744 AC_DEFINE(HAVE_SETPROCTITLE,, Have setproctitle)
745 ]
746 )
747 ]
748 )
749
750 dnl ------------------------------------
751 dnl Determine routing get and set method
752 dnl ------------------------------------
753 AC_MSG_CHECKING(zebra between kernel interface method)
754 if test x"$opsys" = x"gnu-linux"; then
755 if test "${enable_netlink}" = "yes";then
756 AC_MSG_RESULT(netlink)
757 RT_METHOD=rt_netlink.o
758 AC_DEFINE(HAVE_NETLINK,,netlink)
759 netlink=yes
760 elif test "${enable_netlink}" = "no"; then
761 AC_MSG_RESULT(ioctl)
762 RT_METHOD=rt_ioctl.o
763 netlink=no
764 else
765 AC_MSG_RESULT(netlink)
766 RT_METHOD=rt_netlink.o
767 AC_DEFINE(HAVE_NETLINK,,netlink)
768 netlink=yes
769 fi
770 elif test x"$opsys" = x"sol2-6";then
771 AC_MSG_RESULT(Route socket)
772 KERNEL_METHOD="kernel_socket.o"
773 RT_METHOD="rt_socket.o"
774 elif test x"$opsys" = x"sol8";then
775 AC_MSG_RESULT(Route socket)
776 KERNEL_METHOD="kernel_socket.o"
777 RT_METHOD="rt_socket.o"
778 elif test "$opsys" = "irix" ; then
779 AC_MSG_RESULT(Route socket)
780 KERNEL_METHOD="kernel_socket.o"
781 RT_METHOD="rt_socket.o"
782 else
783 AC_TRY_RUN([#include <errno.h>
784 #include <sys/types.h>
785 #include <sys/socket.h>
786
787 main ()
788 {
789 int ac_sock;
790
791 ac_sock = socket (AF_ROUTE, SOCK_RAW, 0);
792 if (ac_sock < 0 && errno == EINVAL)
793 exit (1);
794 exit (0);
795 }],
796 [KERNEL_METHOD=kernel_socket.o
797 RT_METHOD=rt_socket.o
798 AC_MSG_RESULT(socket)],
799 [RT_METHOD=rt_ioctl.o
800 AC_MSG_RESULT(ioctl)],
801 [KERNEL_METHOD=kernel_socket.o
802 RT_METHOD=rt_socket.o
803 AC_MSG_RESULT(socket)])
804 fi
805 AC_SUBST(RT_METHOD)
806 AC_SUBST(KERNEL_METHOD)
807 AC_SUBST(OTHER_METHOD)
808
809 dnl --------------------------
810 dnl Determine IS-IS I/O method
811 dnl --------------------------
812 AC_DEFINE(ISIS_METHOD_PFPACKET, 1, [ constant value for isis method pfpacket ])
813 AC_DEFINE(ISIS_METHOD_DLPI, 2, [ constant value for isis method dlpi ])
814 AC_DEFINE(ISIS_METHOD_BPF, 3, [ constant value for isis method bpf ])
815 AC_CHECK_HEADER(net/bpf.h)
816 AC_CHECK_HEADER(sys/dlpi.h)
817 AC_MSG_CHECKING(zebra IS-IS I/O method)
818 if test x"$opsys" = x"gnu-linux"; then
819 AC_MSG_RESULT(pfpacket)
820 ISIS_METHOD_MACRO="ISIS_METHOD_PFPACKET"
821 elif test x"$opsys" = x"sol2-6" -o x"$opsys" = x"sol8"; then
822 AC_MSG_RESULT(DLPI)
823 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
824 else
825 if test $ac_cv_header_net_bpf_h = no; then
826 if test $ac_cv_header_sys_dlpi_h = no; then
827 AC_MSG_RESULT(none)
828 AC_MSG_WARN([*** IS-IS support will not be built ***])
829 ISISD=""
830 else
831 AC_MSG_RESULT(DLPI)
832 fi
833 ISIS_METHOD_MACRO="ISIS_METHOD_DLPI"
834 else
835 AC_MSG_RESULT(BPF)
836 ISIS_METHOD_MACRO="ISIS_METHOD_BPF"
837 fi
838 fi
839 AC_DEFINE_UNQUOTED(ISIS_METHOD, $ISIS_METHOD_MACRO, [ selected method for isis, == one of the constants ])
840
841 dnl ------------------------------------
842 dnl check for broken CMSG_FIRSTHDR macro
843 dnl ------------------------------------
844 AC_MSG_CHECKING(for broken CMSG_FIRSTHDR)
845 AC_RUN_IFELSE([AC_LANG_SOURCE([[
846 #ifdef SUNOS_5
847 #define _XPG4_2
848 #define __EXTENSIONS__
849 #endif
850 #ifdef HAVE_STDLIB_H
851 # include <stdlib.h>
852 #endif
853 #ifdef HAVE_SYS_TYPES_H
854 #include <sys/types.h>
855 #endif
856 #ifdef HAVE_SYS_SOCKET_H
857 #include <sys/socket.h>
858 #endif
859
860 main()
861 {
862 struct msghdr msg;
863 char buf[4];
864
865 msg.msg_control = buf;
866 msg.msg_controllen = 0;
867
868 if (CMSG_FIRSTHDR(&msg) != NULL)
869 exit(0);
870 exit (1);
871 }]])],[AC_MSG_RESULT(yes - using workaround) AC_DEFINE(HAVE_BROKEN_CMSG_FIRSTHDR,,Broken CMSG_FIRSTHDR)],
872 [AC_MSG_RESULT(no)],[AC_MSG_RESULT(no)])
873
874 dnl ------------------------------
875 dnl check kernel route read method
876 dnl ------------------------------
877 AC_CACHE_CHECK([route read method], [quagga_cv_rtread_method],
878 [if test "x$netlink" = xyes; then
879 quagga_cv_rtread_method="netlink"
880 else
881 for quagga_cv_rtread_method in /proc/net/route /dev/ip /dev/null;
882 do
883 test x`ls $quagga_cv_rtread_method 2>/dev/null` = x"$quagga_cv_rtread_method" && break
884 done
885 case $quagga_cv_rtread_method in
886 "/proc/net/route") quagga_cv_rtread_method="proc";;
887 "/dev/ip")
888 case "$host" in
889 *-freebsd*) quagga_cv_rtread_method="sysctl";;
890 *) quagga_cv_rtread_method="getmsg";;
891 esac;;
892 *)
893 quagga_cv_rtread_method="sysctl";;
894 esac
895 fi])
896 RTREAD_METHOD=rtread_${quagga_cv_rtread_method}.o
897 AC_SUBST(RTREAD_METHOD)
898
899 dnl -----------------------------
900 dnl check interface lookup method
901 dnl -----------------------------
902 IOCTL_METHOD=ioctl.o
903 AC_MSG_CHECKING(interface looking up method)
904 if test "$netlink" = yes; then
905 AC_MSG_RESULT(netlink)
906 IF_METHOD=if_netlink.o
907 elif test "$opsys" = "sol2-6";then
908 AC_MSG_RESULT(Solaris GIF)
909 IF_METHOD=if_ioctl.o
910 elif test "$opsys" = "sol8";then
911 AC_MSG_RESULT(Solaris GLIF)
912 IF_METHOD=if_ioctl_solaris.o
913 IOCTL_METHOD=ioctl_solaris.o
914 elif test "$opsys" = "irix" ; then
915 AC_MSG_RESULT(IRIX)
916 IF_METHOD=if_ioctl.o
917 elif test "$opsys" = "openbsd";then
918 AC_MSG_RESULT(openbsd)
919 IF_METHOD=if_ioctl.o
920 elif grep NET_RT_IFLIST /usr/include/sys/socket.h >/dev/null 2>&1; then
921 AC_MSG_RESULT(sysctl)
922 IF_METHOD=if_sysctl.o
923 AC_DEFINE(HAVE_NET_RT_IFLIST,,NET_RT_IFLIST)
924 else
925 AC_MSG_RESULT(ioctl)
926 IF_METHOD=if_ioctl.o
927 fi
928 AC_SUBST(IF_METHOD)
929 AC_SUBST(IOCTL_METHOD)
930
931 dnl ---------------------------------------------------------------
932 dnl figure out how to specify an interface in multicast sockets API
933 dnl ---------------------------------------------------------------
934 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [], [], QUAGGA_INCLUDES)
935
936 AC_MSG_CHECKING([for BSD struct ip_mreq hack])
937 AC_TRY_COMPILE([#ifdef HAVE_SYS_PARAM_H
938 #include <sys/param.h>
939 #endif],[#if (defined(__FreeBSD__) && ((__FreeBSD_version >= 500022 && __FreeBSD_version < 700000) || (__FreeBSD_version < 500000 && __FreeBSD_version >= 440000))) || (defined(__NetBSD__) && defined(__NetBSD_Version__) && __NetBSD_Version__ >= 106010000)
940 return (0);
941 #else
942 #error No support for BSD struct ip_mreq hack detected
943 #endif],[AC_MSG_RESULT(yes)
944 AC_DEFINE(HAVE_BSD_STRUCT_IP_MREQ_HACK,,[Can pass ifindex in struct ip_mreq])],
945 AC_MSG_RESULT(no))
946
947 dnl ---------------------------------------------------------------
948 dnl figure out how to check link-state
949 dnl ---------------------------------------------------------------
950 AC_CHECK_HEADER([net/if.h],
951 [AC_CHECK_HEADER( [net/if_media.h],
952 [m4_define([LINK_DETECT_INCLUDES],
953 QUAGGA_INCLUDES
954 [#include <net/if_media.h>
955 ])
956 AC_CHECK_MEMBERS( [struct ifmediareq.ifm_status],
957 AC_DEFINE(HAVE_BSD_LINK_DETECT,,[BSD link-detect]),
958 [], LINK_DETECT_INCLUDES)],
959 [],
960 QUAGGA_INCLUDES)],
961 [], QUAGGA_INCLUDES )
962
963 dnl ------------------------
964 dnl TCP_MD5SIG socket option
965 dnl ------------------------
966
967 AC_CHECK_HEADER([netinet/tcp.h],
968 [m4_define([MD5_INCLUDES],
969 QUAGGA_INCLUDES
970 [#include <netinet/tcp.h>
971 ])
972 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)],
973 [],
974 QUAGGA_INCLUDES)
975 if test $ac_cv_have_decl_TCP_MD5SIG = no; then
976 AC_CHECK_HEADER([linux/tcp.h],
977 [m4_define([MD5_INCLUDES],
978 QUAGGA_INCLUDES
979 [#include <linux/tcp.h>
980 ])
981 AC_CHECK_DECLS([TCP_MD5SIG], [], [], MD5_INCLUDES)])
982 fi
983
984 dnl -----------------------
985 dnl check proc file system.
986 dnl -----------------------
987 if test "$netlink" != yes; then
988 if test -r /proc/net/dev; then
989 AC_DEFINE(HAVE_PROC_NET_DEV,,/proc/net/dev)
990 IF_PROC=if_proc.o
991 fi
992 if test -r /proc/net/if_inet6; then
993 AC_DEFINE(HAVE_PROC_NET_IF_INET6,,/proc/net/if_inet6)
994 IF_PROC=if_proc.o
995 fi
996 fi
997 AC_SUBST(IF_PROC)
998
999 dnl -----------------------------
1000 dnl check ipforward detect method
1001 dnl -----------------------------
1002 AC_CACHE_CHECK([ipforward method], [quagga_cv_ipforward_method],
1003 [for quagga_cv_ipforward_method in /proc/net/snmp /dev/ip /dev/null;
1004 do
1005 test x`ls $quagga_cv_ipforward_method 2>/dev/null` = x"$quagga_cv_ipforward_method" && break
1006 done
1007 case $quagga_cv_ipforward_method in
1008 "/proc/net/snmp") quagga_cv_ipforward_method="proc";;
1009 "/dev/ip")
1010 case "$host" in
1011 *-nec-sysv4*) quagga_cv_ipforward_method="ews";;
1012 *-freebsd*) quagga_cv_ipforward_method="sysctl";;
1013 *) quagga_cv_ipforward_method="solaris";;
1014 esac;;
1015 *) quagga_cv_ipforward_method="sysctl";;
1016 esac])
1017 IPFORWARD=ipforward_${quagga_cv_ipforward_method}.o
1018 AC_SUBST(IPFORWARD)
1019
1020 AC_CHECK_FUNCS(getaddrinfo, [have_getaddrinfo=yes], [have_getaddrinfo=no])
1021
1022 dnl ----------
1023 dnl IPv6 check
1024 dnl ----------
1025 AC_MSG_CHECKING(whether does this OS have IPv6 stack)
1026 if test "${enable_ipv6}" = "no"; then
1027 AC_MSG_RESULT(disabled)
1028 else
1029 dnl ----------
1030 dnl INRIA IPv6
1031 dnl ----------
1032 if grep IPV6_INRIA_VERSION /usr/include/netinet/in.h >/dev/null 2>&1; then
1033 zebra_cv_ipv6=yes
1034 AC_DEFINE(HAVE_IPV6,1,INRIA IPv6)
1035 AC_DEFINE(INRIA_IPV6,1,INRIA IPv6)
1036 RIPNGD="ripngd"
1037 OSPF6D="ospf6d"
1038 LIB_IPV6=""
1039 AC_MSG_RESULT(INRIA IPv6)
1040 dnl ---------
1041 dnl KAME IPv6
1042 dnl ---------
1043 elif grep WIDE /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1044 zebra_cv_ipv6=yes
1045 AC_DEFINE(HAVE_IPV6,1,KAME IPv6)
1046 AC_DEFINE(KAME,1,KAME IPv6)
1047 RIPNGD="ripngd"
1048 OSPF6D="ospf6d"
1049 if test -d /usr/local/v6/lib -a -f /usr/local/v6/lib/libinet6.a; then
1050 LIB_IPV6="-L/usr/local/v6/lib -linet6"
1051 fi
1052 AC_MSG_RESULT(KAME)
1053 dnl -------------------------
1054 dnl MUSICA IPv6
1055 dnl default host check
1056 dnl It is not used by Kheops
1057 dnl -------------------------
1058 elif grep MUSICA /usr/include6/netinet6/in6.h >/dev/null 2>&1; then
1059 zebra_cv_ipv6=yes
1060 AC_DEFINE(HAVE_IPV6,1,Musicia IPv6)
1061 AC_DEFINE(MUSICA,1,Musica IPv6 stack)
1062 AC_DEFINE(KAME,1,KAME IPv6 stack)
1063 RIPNGD="ripngd"
1064 OSPF6D="ospf6d"
1065 if test -d /usr/local/v6/lib -a -f /usr/local/v6/lib/libinet6.a; then
1066 LIB_IPV6="-L/usr/local/v6/lib -linet6"
1067 fi
1068 AC_MSG_RESULT(MUSICA)
1069 dnl ---------
1070 dnl NRL check
1071 dnl ---------
1072 elif grep NRL /usr/include/netinet6/in6.h >/dev/null 2>&1; then
1073 zebra_cv_ipv6=yes
1074 AC_DEFINE(HAVE_IPV6,1,NRL IPv6)
1075 AC_DEFINE(NRL,1,NRL)
1076 RIPNGD="ripngd"
1077 OSPF6D="ospf6d"
1078 if test x"$opsys" = x"bsdi";then
1079 AC_DEFINE(BSDI_NRL,,BSDI)
1080 AC_MSG_RESULT(BSDI_NRL)
1081 else
1082 AC_MSG_RESULT(NRL)
1083 fi
1084 dnl ------------------------------------
1085 dnl Solaris 9, 10 and potentially higher
1086 dnl ------------------------------------
1087 elif test x"$opsys" = x"sol8"; then
1088 zebra_cv_ipv6=yes;
1089 AC_DEFINE(HAVE_IPV6, 1, IPv6)
1090 AC_DEFINE(SOLARIS_IPV6, 1, Solaris IPv6)
1091 RIPNGD="ripngd"
1092 OSPF6D="ospf6d"
1093 AC_MSG_RESULT(Solaris IPv6)
1094 dnl ----------
1095 dnl Linux IPv6
1096 dnl ----------
1097 elif test "${enable_ipv6}" = "yes"; then
1098 AC_EGREP_CPP(yes, [
1099 #include <linux/version.h>
1100 /* 2.1.128 or later */
1101 #if LINUX_VERSION_CODE >= 0x020180
1102 yes
1103 #endif],
1104 [zebra_cv_ipv6=yes
1105 zebra_cv_linux_ipv6=yes
1106 AC_MSG_RESULT(Linux IPv6)])
1107 else
1108 if test x`ls /proc/net/ipv6_route 2>/dev/null` = x"/proc/net/ipv6_route"
1109 then
1110 zebra_cv_ipv6=yes
1111 zebra_cv_linux_ipv6=yes
1112 AC_MSG_RESULT(Linux IPv6)
1113 fi
1114 fi
1115
1116 if test "$zebra_cv_linux_ipv6" = "yes";then
1117 AC_MSG_CHECKING(whether libc has IPv6 support)
1118 AC_TRY_LINK([#include <netinet/in.h>
1119 ],[ int a; a = (int) in6addr_any.s6_addr[0]; if (a != 12345) return a; ],
1120 [AC_MSG_RESULT(yes)
1121 zebra_cv_ipv6=yes
1122 zebra_cv_linux_ipv6=yes],
1123 [AC_MSG_RESULT(no)
1124 zebra_cv_ipv6=no
1125 zebra_cv_linux_ipv6=no])
1126 fi
1127
1128 if test "$zebra_cv_linux_ipv6" = "yes";then
1129 AC_MSG_CHECKING(for GNU libc >= 2.1)
1130 AC_DEFINE(HAVE_IPV6,1,Linux IPv6)
1131 AC_EGREP_CPP(yes, [
1132 #include <features.h>
1133 #if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
1134 yes
1135 #endif],
1136 [glibc=yes
1137 AC_DEFINE(LINUX_IPV6,1,Linux IPv6 stack)
1138 AC_MSG_RESULT(yes)],
1139 AC_MSG_RESULT(no)
1140 )
1141 RIPNGD="ripngd"
1142 OSPF6D="ospf6d"
1143 if test "$glibc" != "yes"; then
1144 INCLUDES="-I/usr/inet6/include"
1145 if test x`ls /usr/inet6/lib/libinet6.a 2>/dev/null` != x;then
1146 LIB_IPV6="-L/usr/inet6/lib -linet6"
1147 fi
1148 fi
1149 fi
1150
1151 dnl -----------------------
1152 dnl Set IPv6 related values
1153 dnl -----------------------
1154 LIBS="$LIB_IPV6 $LIBS"
1155 AC_SUBST(LIB_IPV6)
1156
1157 if test x"$RIPNGD" = x""; then
1158 AC_MSG_RESULT(IPv4 only)
1159 fi
1160 fi
1161
1162 dnl ------------------
1163 dnl IPv6 header checks
1164 dnl ------------------
1165 if test "x${zebra_cv_ipv6}" = "xyes"; then
1166 AC_CHECK_HEADERS([netinet6/in6.h netinet/in6_var.h netinet/icmp6.h \
1167 netinet6/in6_var.h netinet6/nd6.h], [], [],
1168 QUAGGA_INCLUDES)
1169 fi
1170
1171 m4_define([QUAGGA_INCLUDES],dnl
1172 QUAGGA_INCLUDES
1173 [#if HAVE_NETINET6_IN6_H
1174 #include <netinet6/in6.h>
1175 #endif
1176 #if HAVE_NETINET_IN6_VAR_H
1177 #include <netinet/in6_var.h>
1178 #endif
1179 #if HAVE_NETINET_ICMP6_H
1180 # include <netinet/icmp6.h>
1181 #endif
1182 #if HAVE_NETINET6_IN6_VAR_H
1183 # include <netinet6/in6_var.h>
1184 #endif
1185 #if HAVE_NETINET6_ND6_H
1186 # include <netinet6/nd6.h>
1187 #endif
1188 ])dnl
1189
1190 dnl disable doc check
1191 if test "${enable_doc}" = "no";then
1192 DOC=""
1193 else
1194 DOC="doc"
1195 fi
1196
1197 dnl --------------------
1198 dnl Daemon disable check
1199 dnl --------------------
1200 if test "${enable_zebra}" = "no";then
1201 ZEBRA=""
1202 else
1203 ZEBRA="zebra"
1204 fi
1205
1206 if test "${enable_bgpd}" = "no";then
1207 BGPD=""
1208 else
1209 BGPD="bgpd"
1210 fi
1211
1212 if test "${enable_ripd}" = "no";then
1213 RIPD=""
1214 else
1215 RIPD="ripd"
1216 fi
1217
1218 if test "${enable_ospfd}" = "no";then
1219 OSPFD=""
1220 else
1221 OSPFD="ospfd"
1222 fi
1223
1224 if test "${enable_watchquagga}" = "no";then
1225 WATCHQUAGGA=""
1226 else
1227 WATCHQUAGGA="watchquagga"
1228 fi
1229
1230 OSPFCLIENT=""
1231 if test "${enable_opaque_lsa}" != "no"; then
1232 if test "${enable_ospfapi}" != "no";then
1233 AC_DEFINE(SUPPORT_OSPF_API,,OSPFAPI)
1234
1235 if test "${enable_ospfclient}" != "no";then
1236 OSPFCLIENT="ospfclient"
1237 fi
1238 fi
1239
1240 fi
1241
1242 case "${enable_ripngd}" in
1243 "yes") RIPNGD="ripngd";;
1244 "no" ) RIPNGD="";;
1245 * ) ;;
1246 esac
1247
1248 case "${enable_ospf6d}" in
1249 "yes") OSPF6D="ospf6d";;
1250 "no" ) OSPF6D="";;
1251 * ) ;;
1252 esac
1253
1254 case "${enable_isisd}" in
1255 "yes") ISISD="isisd";;
1256 "no" ) ISISD="";;
1257 * ) ;;
1258 esac
1259
1260 # XXX Perhaps auto-enable on Solaris, but that's messy for cross builds.
1261 case "${enable_solaris}" in
1262 "yes") SOLARIS="solaris";;
1263 "no" ) SOLARIS="";;
1264 * ) ;;
1265 esac
1266
1267 if test "${enable_bgp_announce}" = "no";then
1268 AC_DEFINE(DISABLE_BGP_ANNOUNCE,1,Disable BGP installation to zebra)
1269 else
1270 AC_DEFINE(DISABLE_BGP_ANNOUNCE,0,Disable BGP installation to zebra)
1271 fi
1272
1273 AC_SUBST(DOC)
1274 AC_SUBST(ZEBRA)
1275 AC_SUBST(BGPD)
1276 AC_SUBST(RIPD)
1277 AC_SUBST(RIPNGD)
1278 AC_SUBST(OSPFD)
1279 AC_SUBST(OSPF6D)
1280 AC_SUBST(WATCHQUAGGA)
1281 AC_SUBST(ISISD)
1282 AC_SUBST(SOLARIS)
1283 AC_SUBST(VTYSH)
1284 AC_SUBST(INCLUDES)
1285 AC_SUBST(CURSES)
1286 AC_SUBST(OSPFCLIENT)
1287 AC_SUBST(OSPFAPI)
1288 AC_CHECK_LIB(c, inet_ntop, [AC_DEFINE(HAVE_INET_NTOP,,inet_ntop)])
1289 AC_CHECK_LIB(c, inet_pton, [AC_DEFINE(HAVE_INET_PTON,,inet_pton)])
1290 AC_CHECK_LIB(crypt, crypt)
1291 AC_CHECK_LIB(resolv, res_init)
1292
1293 dnl ---------------------------------------------------
1294 dnl BSD/OS 4.1 define inet_XtoY function as __inet_XtoY
1295 dnl ---------------------------------------------------
1296 AC_CHECK_FUNC(__inet_ntop, AC_DEFINE(HAVE_INET_NTOP,,__inet_ntop))
1297 AC_CHECK_FUNC(__inet_pton, AC_DEFINE(HAVE_INET_PTON,,__inet_pton))
1298 AC_CHECK_FUNC(__inet_aton, AC_DEFINE(HAVE_INET_ATON,,__inet_aton))
1299
1300 dnl ---------------------------
1301 dnl check system has PCRE regexp
1302 dnl ---------------------------
1303 if test "x$enable_pcreposix" = "xyes"; then
1304 AC_CHECK_LIB(pcreposix, pcreposix_regexec, ,[enable_pcreposix=no
1305 AC_MSG_WARN([*** falling back to other regex library ***]) ])
1306 fi
1307
1308 if test "x$enable_pcreposix" != "xyes"; then
1309 dnl ---------------------------
1310 dnl check system has GNU regexp
1311 dnl ---------------------------
1312 AC_MSG_CHECKING(whether system has GNU regex)
1313 AC_CHECK_LIB(c, regexec,
1314 [AC_DEFINE(HAVE_GNU_REGEX,,GNU regexp library)
1315 LIB_REGEX=""],
1316 [LIB_REGEX="regex.o"])
1317 fi
1318 AC_SUBST(HAVE_LIBPCREPOSIX)
1319 AC_SUBST(LIB_REGEX)
1320
1321 dnl ------------------
1322 dnl check Net-SNMP library
1323 dnl ------------------
1324 if test "${enable_snmp}" = "yes"; then
1325 if test "$with_crypto" != "no"; then
1326 LIBS="${LIBS} -lcrypto";
1327 fi
1328 AC_CHECK_LIB(netsnmp, asn_parse_int,
1329 [AC_DEFINE(HAVE_NETSNMP,,Net SNMP)
1330 AC_DEFINE(HAVE_SNMP,,SNMP)
1331 LIBS="${LIBS} -lnetsnmp"],
1332 [AC_MSG_ERROR([--enable-snmp given, but cannot find support for SNMP])])
1333
1334 AC_CHECK_HEADER([net-snmp/net-snmp-config.h],
1335 [],
1336 [AC_MSG_ERROR([--enable-snmp given, but cannot find net-snmp-config.h])],
1337 QUAGGA_INCLUDES)
1338 AC_SUBST(SNMP_INCLUDES)
1339 fi
1340
1341 dnl ---------------------------
1342 dnl sockaddr and netinet checks
1343 dnl ---------------------------
1344 AC_CHECK_TYPES([struct sockaddr, struct sockaddr_in,
1345 struct sockaddr_in6, struct sockaddr_un, struct sockaddr_dl,
1346 socklen_t,
1347 struct ifaliasreq, struct if6_aliasreq, struct in6_aliasreq,
1348 struct nd_opt_adv_interval, struct rt_addrinfo,
1349 struct nd_opt_homeagent_info, struct nd_opt_adv_interval],
1350 [], [], QUAGGA_INCLUDES)
1351
1352 AC_CHECK_MEMBERS([struct sockaddr.sa_len,
1353 struct sockaddr_in.sin_len, struct sockaddr_un.sun_len,
1354 struct sockaddr_in6.sin6_scope_id,
1355 struct if6_aliasreq.ifra_lifetime,
1356 struct nd_opt_adv_interval.nd_opt_ai_type],
1357 [], [], QUAGGA_INCLUDES)
1358
1359 dnl ---------------------------
1360 dnl IRDP/pktinfo/icmphdr checks
1361 dnl ---------------------------
1362 AC_CHECK_TYPES([struct in_pktinfo],
1363 [AC_CHECK_TYPES([struct icmphdr],
1364 [if test "${enable_irdp}" != "no"; then
1365 AC_DEFINE(HAVE_IRDP,, IRDP)
1366 fi],
1367 [if test "${enable_irdp}" = "yes"; then
1368 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1369 fi], [QUAGGA_INCLUDES])],
1370 [if test "${enable_irdp}" = "yes"; then
1371 AC_MSG_ERROR(['IRDP requires in_pktinfo at the moment!'])
1372 fi], [QUAGGA_INCLUDES])
1373
1374 dnl --------------------------------------
1375 dnl checking for getrusage struct and call
1376 dnl --------------------------------------
1377 AC_MSG_CHECKING(whether getrusage is available)
1378 AC_TRY_COMPILE([#include <sys/resource.h>
1379 ],[struct rusage ac_x; getrusage (RUSAGE_SELF, &ac_x);],
1380 [AC_MSG_RESULT(yes)
1381 AC_DEFINE(HAVE_RUSAGE,,rusage)],
1382 AC_MSG_RESULT(no))
1383
1384 dnl --------------------------------------
1385 dnl checking for clock_time monotonic struct and call
1386 dnl --------------------------------------
1387 AC_CHECK_DECL(CLOCK_MONOTONIC,
1388 [AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"])
1389 AC_DEFINE(HAVE_CLOCK_MONOTONIC,, Have monotonic clock)
1390 ], [AC_MSG_RESULT(no)], [QUAGGA_INCLUDES])
1391
1392 dnl -------------------
1393 dnl capabilities checks
1394 dnl -------------------
1395 if test "${enable_capabilities}" != "no"; then
1396 AC_MSG_CHECKING(whether prctl PR_SET_KEEPCAPS is available)
1397 AC_TRY_COMPILE([#include <sys/prctl.h>],[prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);],
1398 [AC_MSG_RESULT(yes)
1399 AC_DEFINE(HAVE_PR_SET_KEEPCAPS,,prctl)
1400 quagga_ac_keepcaps="yes"],
1401 AC_MSG_RESULT(no)
1402 )
1403 if test x"${quagga_ac_keepcaps}" = x"yes"; then
1404 AC_CHECK_HEADERS(sys/capability.h)
1405 fi
1406 if test x"${ac_cv_header_sys_capability_h}" = x"yes"; then
1407 AC_CHECK_LIB(cap, cap_init,
1408 [AC_DEFINE(HAVE_LCAPS,1,Capabilities)
1409 LIBCAP="-lcap"
1410 quagga_ac_lcaps="yes"]
1411 )
1412 else
1413 AC_CHECK_HEADERS(priv.h,
1414 [AC_MSG_CHECKING(Solaris style privileges are available)
1415 AC_TRY_COMPILE([#include <priv.h>],[getpflags(PRIV_AWARE);],
1416 [AC_MSG_RESULT(yes)
1417 AC_DEFINE(HAVE_SOLARIS_CAPABILITIES,1,getpflags)
1418 quagga_ac_scaps="yes"],
1419 AC_MSG_RESULT(no)
1420 )
1421 ]
1422 )
1423 fi
1424 if test x"${quagga_ac_scaps}" = x"yes" \
1425 -o x"${quagga_ac_lcaps}" = x"yes"; then
1426 AC_DEFINE(HAVE_CAPABILITIES,1,capabilities)
1427 fi
1428 fi
1429 AC_SUBST(LIBCAP)
1430
1431 dnl ---------------------------
1432 dnl check for glibc 'backtrace'
1433 dnl ---------------------------
1434 if test "${glibc}" = "yes"; then
1435 AC_CHECK_HEADER([execinfo.h],
1436 [AC_CHECK_FUNC([backtrace],
1437 [AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace])
1438 AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding])
1439 ])
1440 ])
1441 fi
1442
1443 dnl -----------------------------------------
1444 dnl check for malloc mallinfo struct and call
1445 dnl this must try and link using LIBS, in
1446 dnl order to check no alternative allocator
1447 dnl has been specified, which might not provide
1448 dnl mallinfo, e.g. such as Umem on Solaris.
1449 dnl -----------------------------------------
1450 AC_CHECK_HEADER([malloc.h],
1451 [AC_MSG_CHECKING(whether mallinfo is available)
1452 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <malloc.h>]],
1453 [[struct mallinfo ac_x; ac_x = mallinfo ();]])],
1454 [AC_MSG_RESULT(yes)
1455 AC_DEFINE(HAVE_MALLINFO,,mallinfo)],
1456 AC_MSG_RESULT(no)
1457 )
1458 ], [], QUAGGA_INCLUDES)
1459
1460 dnl ----------
1461 dnl configure date
1462 dnl ----------
1463 CONFDATE=`date '+%Y%m%d'`
1464 AC_SUBST(CONFDATE)
1465
1466 dnl Conditionally enable PIE support for GNU toolchains.
1467 AC_ARG_ENABLE(pie, AS_HELP_STRING([--disable-pie], [Do not build tools as a Position Independent Executables]))
1468 if test "$enable_pie" != "no"; then
1469 AC_CACHE_CHECK([whether $CC accepts PIE flags], [ap_cv_cc_pie], [
1470 save_CFLAGS=$CFLAGS
1471 save_LDFLAGS=$LDFLAGS
1472 CFLAGS="$CFLAGS -fPIE"
1473 LDFLAGS="$LDFLAGS -pie"
1474 AC_LINK_IFELSE([AC_LANG_SOURCE([[static int foo[30000]; int main () { return 0; }]])],
1475 [ap_cv_cc_pie=yes], [ap_cv_cc_pie=no]
1476 )
1477 CFLAGS=$save_CFLAGS
1478 LDFLAGS=$save_LDFLAGS
1479 ])
1480 if test "$ap_cv_cc_pie" = "yes"; then
1481 PICFLAGS="-fPIE"
1482 PILDFLAGS="-pie"
1483 fi
1484 fi
1485
1486 AC_SUBST(PICFLAGS)
1487 AC_SUBST(PILDFLAGS)
1488
1489 dnl ------------------------------
1490 dnl set paths for state directory
1491 dnl ------------------------------
1492 AC_MSG_CHECKING(directory to use for state file)
1493 if test "${prefix}" = "NONE"; then
1494 quagga_statedir_prefix="";
1495 else
1496 quagga_statedir_prefix=${prefix}
1497 fi
1498 if test "${localstatedir}" = '${prefix}/var'; then
1499 for QUAGGA_STATE_DIR in ${quagga_statedir_prefix}/var/run dnl
1500 ${quagga_statedir_prefix}/var/adm dnl
1501 ${quagga_statedir_prefix}/etc dnl
1502 /var/run dnl
1503 /var/adm dnl
1504 /etc dnl
1505 /dev/null;
1506 do
1507 test -d $QUAGGA_STATE_DIR && break
1508 done
1509 quagga_statedir=$QUAGGA_STATE_DIR
1510 else
1511 quagga_statedir=${localstatedir}
1512 fi
1513 if test $quagga_statedir = "/dev/null"; then
1514 AC_MSG_ERROR('STATE DIRECTORY NOT FOUND! FIX OR SPECIFY --localstatedir!')
1515 fi
1516 AC_MSG_RESULT(${quagga_statedir})
1517 AC_SUBST(quagga_statedir)
1518
1519 AC_DEFINE_UNQUOTED(PATH_ZEBRA_PID, "$quagga_statedir/zebra.pid",zebra PID)
1520 AC_DEFINE_UNQUOTED(PATH_RIPD_PID, "$quagga_statedir/ripd.pid",ripd PID)
1521 AC_DEFINE_UNQUOTED(PATH_RIPNGD_PID, "$quagga_statedir/ripngd.pid",ripngd PID)
1522 AC_DEFINE_UNQUOTED(PATH_BGPD_PID, "$quagga_statedir/bgpd.pid",bgpd PID)
1523 AC_DEFINE_UNQUOTED(PATH_OSPFD_PID, "$quagga_statedir/ospfd.pid",ospfd PID)
1524 AC_DEFINE_UNQUOTED(PATH_OSPF6D_PID, "$quagga_statedir/ospf6d.pid",ospf6d PID)
1525 AC_DEFINE_UNQUOTED(PATH_ISISD_PID, "$quagga_statedir/isisd.pid",isisd PID)
1526 AC_DEFINE_UNQUOTED(PATH_WATCHQUAGGA_PID, "$quagga_statedir/watchquagga.pid",watchquagga PID)
1527 AC_DEFINE_UNQUOTED(ZEBRA_SERV_PATH, "$quagga_statedir/zserv.api",zebra api socket)
1528 AC_DEFINE_UNQUOTED(ZEBRA_VTYSH_PATH, "$quagga_statedir/zebra.vty",zebra vty socket)
1529 AC_DEFINE_UNQUOTED(RIP_VTYSH_PATH, "$quagga_statedir/ripd.vty",rip vty socket)
1530 AC_DEFINE_UNQUOTED(RIPNG_VTYSH_PATH, "$quagga_statedir/ripngd.vty",ripng vty socket)
1531 AC_DEFINE_UNQUOTED(BGP_VTYSH_PATH, "$quagga_statedir/bgpd.vty",bgpd vty socket)
1532 AC_DEFINE_UNQUOTED(OSPF_VTYSH_PATH, "$quagga_statedir/ospfd.vty",ospfd vty socket)
1533 AC_DEFINE_UNQUOTED(OSPF6_VTYSH_PATH, "$quagga_statedir/ospf6d.vty",ospf6d vty socket)
1534 AC_DEFINE_UNQUOTED(ISIS_VTYSH_PATH, "$quagga_statedir/isisd.vty",isisd vty socket)
1535 AC_DEFINE_UNQUOTED(DAEMON_VTY_DIR, "$quagga_statedir",daemon vty directory)
1536
1537 dnl -------------------------------
1538 dnl Quagga sources should always be
1539 dnl current wrt interfaces. Dont
1540 dnl allow deprecated interfaces to
1541 dnl be exposed.
1542 dnl -------------------------------
1543 AC_DEFINE(QUAGGA_NO_DEPRECATED_INTERFACES, 1, Hide deprecated interfaces)
1544
1545 dnl ---------------------------
1546 dnl Check htonl works correctly
1547 dnl ---------------------------
1548 AC_MSG_CHECKING(for working htonl)
1549 AC_CACHE_VAL(ac_cv_htonl_works,
1550 [AC_LINK_IFELSE([AC_LANG_PROGRAM([QUAGGA_INCLUDES],[htonl (0);])],
1551 [ac_cv_htonl_works=yes], [ac_cv_htonl_works=no])
1552 ]
1553 )
1554 AC_MSG_RESULT($ac_cv_htonl_works)
1555
1556 AC_CONFIG_FILES([Makefile lib/Makefile zebra/Makefile ripd/Makefile
1557 ripngd/Makefile bgpd/Makefile ospfd/Makefile watchquagga/Makefile
1558 ospf6d/Makefile isisd/Makefile vtysh/Makefile doc/Makefile
1559 ospfclient/Makefile tests/Makefile m4/Makefile redhat/Makefile
1560 pkgsrc/Makefile
1561 redhat/quagga.spec
1562 lib/version.h
1563 doc/defines.texi
1564 isisd/topology/Makefile
1565 pkgsrc/bgpd.sh pkgsrc/ospf6d.sh pkgsrc/ospfd.sh
1566 pkgsrc/ripd.sh pkgsrc/ripngd.sh pkgsrc/zebra.sh])
1567 AC_CONFIG_FILES([solaris/Makefile])
1568
1569 AC_CONFIG_FILES([vtysh/extract.pl],[chmod +x vtysh/extract.pl])
1570 ## Hack, but working solution to avoid rebuilding of quagga.info.
1571 ## It's already in CVS until texinfo 4.7 is more common.
1572 AC_OUTPUT
1573
1574 echo "
1575 Quagga configuration
1576 --------------------
1577 quagga version : ${PACKAGE_VERSION}
1578 host operating system : ${host_os}
1579 source code location : ${srcdir}
1580 compiler : ${CC}
1581 compiler flags : ${CFLAGS}
1582 make : ${MAKE-make}
1583 includes : ${INCLUDES} ${SNMP_INCLUDES}
1584 linker flags : ${LDFLAGS} ${LIBS} ${LIBCAP} ${LIBREADLINE} ${LIBM}
1585 state file directory : ${quagga_statedir}
1586 config file directory : `eval echo \`echo ${sysconfdir}\``
1587 example directory : `eval echo \`echo ${exampledir}\``
1588 user to run as : ${enable_user}
1589 group to run as : ${enable_group}
1590 group for vty sockets : ${enable_vty_group}
1591 config file mask : ${enable_configfile_mask}
1592 log file mask : ${enable_logfile_mask}
1593
1594 The above user and group must have read/write access to the state file
1595 directory and to the config files in the config file directory."
1596
1597 if test x"$quagga_cv_gnu_make" = x"no"; then echo "
1598 Warning: The ${MAKE-make} programme detected, either in your path or
1599 via the MAKE variable, is not GNU Make. GNU make may be installed as
1600 gmake on some systems. and is required to complete a build of Quagga
1601 " > /dev/stderr
1602 fi