configure.ac revision 1.1.1.3
1# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
2#
3# This Source Code Form is subject to the terms of the Mozilla Public
4# License, v. 2.0. If a copy of the MPL was not distributed with this
5# file, You can obtain one at http://mozilla.org/MPL/2.0/.
6#
7# See the COPYRIGHT file distributed with this work for additional
8# information regarding copyright ownership.
9
10AC_INIT(BIND, [9.14], [info@isc.org], [], [https://www.isc.org/downloads/BIND/])
11AC_PREREQ([2.60])
12
13AC_CONFIG_HEADER(config.h)
14AC_CONFIG_MACRO_DIR([m4])
15
16AC_CANONICAL_HOST
17AC_USE_SYSTEM_EXTENSIONS
18
19# Enable RFC 3542 APIs on macOS
20AC_DEFINE([__APPLE_USE_RFC_3542], [1], [Select RFC3542 IPv6 API on macOS])
21
22AC_PROG_MAKE_SET
23
24AC_PROG_LIBTOOL
25AC_PROG_INSTALL
26AC_PROG_LN_S
27AX_POSIX_SHELL
28
29AC_SUBST(STD_CINCLUDES)
30AC_SUBST(STD_CDEFINES)
31AC_SUBST(STD_CWARNINGS)
32AC_SUBST(CCOPT)
33AC_SUBST(CCNOOPT)
34AC_SUBST(BACKTRACECFLAGS)
35
36#
37# Use pkg-config
38#
39
40PKG_PROG_PKG_CONFIG
41
42# Warn if the user specified libbind, which is now deprecated
43AC_ARG_ENABLE(libbind, AS_HELP_STRING([--enable-libbind], [deprecated]))
44
45case "$enable_libbind" in
46	yes)
47		AC_MSG_ERROR(['libbind' is no longer part of the BIND 9 distribution.
48It is available from http://www.isc.org as a separate download.])
49		;;
50	no|'')
51		;;
52esac
53
54AC_ARG_ENABLE(buffer_useinline,
55	      AS_HELP_STRING([--enable-buffer-useinline],
56		             [define ISC_BUFFER_USEINLINE when compiling
57				[default=yes]]),
58	      if test yes = "${enable}"
59	      then
60		      AC_DEFINE([ISC_BUFFER_USEINLINE], [1],
61			        [Define if you want to use inline buffers])
62	      fi,
63	      AC_DEFINE([ISC_BUFFER_USEINLINE], [1]))
64
65AC_ARG_ENABLE(warn_shadow,
66	      AS_HELP_STRING([--enable-warn-shadow],
67			     [turn on -Wshadow when compiling]))
68
69AC_ARG_ENABLE(warn_error,
70	      AS_HELP_STRING([--enable-warn-error],
71			    [turn on -Werror when compiling]))
72
73AC_ARG_ENABLE(developer,
74	      AS_HELP_STRING([--enable-developer],
75			     [enable developer build settings]))
76XTARGETS=
77case "$enable_developer" in
78yes)
79	STD_CDEFINES="$STD_CDEFINES -DISC_MEM_DEFAULTFILL=1 -DISC_LIST_CHECKINIT=1"
80	test "${enable_fixed_rrset+set}" = set || enable_fixed_rrset=yes
81	test "${enable_querytrace+set}" = set || enable_querytrace=yes
82	test "${with_cmocka+set}" = set || with_cmocka=yes
83	test "${with_dlz_filesystem+set}" = set || with_dlz_filesystem=yes
84	test "${enable_symtable+set}" = set || enable_symtable=all
85	test "${enable_warn_error+set}" = set || enable_warn_error=yes
86	test "${enable_warn_shadow+set}" = set || enable_warn_shadow=yes
87	test "${with_zlib+set}" = set || with_zlib=yes
88	XTARGETS='${XTARGETS}'
89	;;
90esac
91AC_SUBST(XTARGETS)
92
93AC_ARG_ENABLE([fuzzing],
94	      [AS_HELP_STRING([--enable-fuzzing=<afl|libfuzzer>],
95			      [Enable fuzzing using American Fuzzy Lop or libFuzzer (default=no)])],
96	      [],
97	      [enable_fuzzing=no])
98
99AC_MSG_CHECKING([whether to enable fuzzing mode])
100AS_CASE([$enable_fuzzing],
101	[no],[AC_MSG_RESULT([no])],
102	[afl],[
103	  AC_MSG_RESULT([using AFL])
104	  AC_DEFINE([ENABLE_AFL], [1],
105		    [Define to enable American Fuzzy Lop test harness])
106	  CFLAGS="$CFLAGS -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1"
107	  LIBS="$LIBS -lpthread"],
108	[libfuzzer],[
109	  AC_MSG_RESULT([using libFuzzer])
110	  CFLAGS="$CFLAGS -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1 -fsanitize=fuzzer,address,undefined"
111	  LDFLAGS="$LDFLAGS -fsanitize=fuzzer,address,undefined"],
112	[*],[AC_MSG_ERROR([You need to explicitly select the fuzzer])])
113
114AS_IF([test "$enable_fuzzing" = "afl"],
115      [AC_MSG_CHECKING("for AFL enabled compiler")
116       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
117					  [#ifndef __AFL_COMPILER
118					   #error AFL compiler required
119					   #endif
120					  ])],
121			 [AC_MSG_RESULT([yes])],
122			 [AC_MSG_ERROR([set CC=afl-<gcc|clang> when --enable-fuzzing=afl is used])])
123      ])
124
125#
126# Make very sure that these are the first files processed by
127# config.status, since we use the processed output as the input for
128# AC_SUBST_FILE() substitutions in other files.
129#
130AC_CONFIG_FILES([make/rules make/includes])
131
132AC_PATH_PROG(AR, ar)
133ARFLAGS="cruv"
134AC_SUBST(AR)
135AC_SUBST(ARFLAGS)
136
137# The POSIX ln(1) program.  Non-POSIX systems may substitute
138# "copy" or something.
139LN=ln
140AC_SUBST(LN)
141
142case "$AR" in
143	"")
144		AC_MSG_ERROR([
145ar program not found.  Please fix your PATH to include the directory in
146which ar resides, or set AR in the environment with the full path to ar.
147])
148
149		;;
150esac
151
152#
153# Etags.
154#
155AC_PATH_PROGS(ETAGS, etags emacs-etags)
156
157#
158# Some systems, e.g. RH7, have the Exuberant Ctags etags instead of
159# GNU emacs etags, and it requires the -L flag.
160#
161if test "X$ETAGS" != "X"; then
162	AC_MSG_CHECKING(for Exuberant Ctags etags)
163	if $ETAGS --version 2>&1 | grep 'Exuberant Ctags' >/dev/null 2>&1; then
164		AC_MSG_RESULT(yes)
165		ETAGS="$ETAGS -L"
166	else
167		AC_MSG_RESULT(no)
168	fi
169fi
170AC_SUBST(ETAGS)
171
172#
173# Perl is optional; it is used only by some of the system test scripts.
174# Note: the backtrace feature (see below) uses perl to build the symbol table,
175# but it still compiles without perl, in which case an empty table will be used.
176#
177AC_PATH_PROGS(PERL, perl5 perl)
178AC_SUBST(PERL)
179
180#
181# Python is also optional but required by default so that dnssec-keymgr gets
182# installed unless explicitly prevented by the user using --without-python.
183#
184testminvers='import sys
185if (sys.version_info < (2,7)) or (sys.version_info < (3,2) and sys.version_info >= (3,0)):
186   exit(1)'
187
188testargparse='try: import argparse
189except: exit(1)'
190
191testply='try: import ply
192except: exit(1)'
193
194default_with_python="python python3 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python2 python2.7"
195
196AC_ARG_WITH([python],
197	    AS_HELP_STRING([--with-python=PATH],
198			   [specify path to Python interpreter]),
199	    [], [with_python=$default_with_python])
200AC_ARG_WITH([python-install-dir],
201	    AS_HELP_STRING([--with-python-install-dir=PATH],
202			   [installation directory for Python modules]),
203	    [], with_python_install_dir="")
204
205AS_IF([test "$with_python" = "yes"],
206      [with_python=$default_with_python])
207
208AS_IF([test "$with_python" = "no"],
209      [AC_MSG_CHECKING([for Python support])
210       AC_MSG_RESULT([disabled])],
211      [for p in $with_python
212       do
213	 AS_CASE([$p],
214		 [/*],[PYTHON="$p"])
215
216	 AC_PATH_PROG([PYTHON], [$p])
217	 # Do not cache the result of the check from the previous line.  If the
218	 # first found Python interpreter has missing module dependencies and
219	 # the result of the above check is cached, subsequent module checks
220	 # will erroneously keep on using the cached path to the first found
221	 # Python interpreter instead of different ones.
222	 unset ac_cv_path_PYTHON
223
224	 AS_IF([test -z "$PYTHON"], [continue])
225
226	 AC_MSG_CHECKING([if $PYTHON is python2 version >= 2.7 or python3 version >= 3.2])
227	 AS_IF(["$PYTHON" -c "$testminvers" 2>/dev/null],
228	       [AC_MSG_RESULT([yes])],
229	       [AC_MSG_RESULT([no])
230		unset PYTHON
231		continue])
232
233	 AC_MSG_CHECKING([Python module 'argparse'])
234	 AS_IF(["$PYTHON" -c "$testargparse" 2>/dev/null],
235	       [AC_MSG_RESULT([yes])],
236	       [AC_MSG_RESULT([no])
237		unset PYTHON
238		continue])
239
240	 AC_MSG_CHECKING([Python module 'ply'])
241	 AS_IF(["$PYTHON" -c "$testply" 2>/dev/null],
242	       [AC_MSG_RESULT([yes])],
243	       [AC_MSG_RESULT([no])
244		unset PYTHON
245		continue])
246
247	 # Stop looking any further once we find a Python interpreter
248	 # satisfying all requirements.
249	 break
250       done
251
252       AS_IF([test "X$PYTHON" = "X"],
253	     [AC_MSG_CHECKING([for Python support])
254	      AC_MSG_RESULT([no])
255	      AC_MSG_ERROR([Python required for dnssec-keymgr])])])
256
257PYTHON_TOOLS=''
258CHECKDS=''
259COVERAGE=''
260KEYMGR=''
261AS_IF([test "X$PYTHON" != "X"],
262      [PYTHON_TOOLS=python
263       CHECKDS=checkds
264       COVERAGE=coverage
265       KEYMGR=keymgr
266       PYTHON_INSTALL_DIR="$with_python_install_dir"
267       AS_IF([test -n "$with_python_install_dir"],
268	     [PYTHON_INSTALL_LIB="--install-lib=$with_python_install_dir"])])
269AC_SUBST(CHECKDS)
270AC_SUBST(COVERAGE)
271AC_SUBST(KEYMGR)
272AC_SUBST(PYTHON_TOOLS)
273AC_SUBST(PYTHON_INSTALL_DIR)
274AC_SUBST(PYTHON_INSTALL_LIB)
275
276#
277# Special processing of paths depending on whether --prefix,
278# --sysconfdir or --localstatedir arguments were given.  What's
279# desired is some compatibility with the way previous versions
280# of BIND built; they defaulted to /usr/local for most parts of
281# the installation, but named.boot/named.conf was in /etc
282# and named.pid was in /var/run.
283#
284# So ... if none of --prefix, --sysconfdir or --localstatedir are
285# specified, set things up that way.  If --prefix is given, use
286# it for sysconfdir and localstatedir the way configure normally
287# would.  To change the prefix for everything but leave named.conf
288# in /etc or named.pid in /var/run, then do this the usual configure way:
289# ./configure --prefix=/somewhere --sysconfdir=/etc
290# ./configure --prefix=/somewhere --localstatedir=/var
291#
292# To put named.conf and named.pid in /usr/local with everything else,
293# set the prefix explicitly to /usr/local even though that's the default:
294# ./configure --prefix=/usr/local
295#
296case "$prefix" in
297	NONE)
298		case "$sysconfdir" in
299			'${prefix}/etc')
300				sysconfdir=/etc
301				;;
302		esac
303		case "$localstatedir" in
304			'${prefix}/var')
305				localstatedir=/var
306				;;
307		esac
308		;;
309esac
310expanded_sysconfdir=`eval echo $sysconfdir`
311AC_SUBST(expanded_sysconfdir)
312
313#
314# Make sure INSTALL uses an absolute path, else it will be wrong in all
315# Makefiles, since they use make/rules.in and INSTALL will be adjusted by
316# configure based on the location of the file where it is substituted.
317# Since in BIND9 INSTALL is only substituted into make/rules.in, an immediate
318# subdirectory of install-sh, This relative path will be wrong for all
319# directories more than one level down from install-sh.
320#
321case "$INSTALL" in
322	/*)
323		;;
324	*)
325		#
326		# Not all systems have dirname.
327		#
328		changequote({, })
329		ac_dir="`echo $INSTALL | sed 's%/[^/]*$%%'`"
330		changequote([, ])
331
332		ac_prog="`echo $INSTALL | sed 's%.*/%%'`"
333		test "X$ac_dir" = "X$ac_prog" && ac_dir=.
334		test -d "$ac_dir" && ac_dir="`(cd \"$ac_dir\" && pwd)`"
335		INSTALL="$ac_dir/$ac_prog"
336		;;
337esac
338
339AC_PROG_CC
340AC_PROG_CC_C99
341
342#
343# CCNOOPT defaults to -O0 on gcc and disables optimization when is last
344#
345if test "X$CCNOOPT" = "X" -a "X$GCC" = "Xyes"; then
346	CCNOOPT="-O0"
347fi
348
349AC_HEADER_STDC
350
351AC_CHECK_HEADERS(fcntl.h regex.h sys/time.h unistd.h sys/mman.h sys/sockio.h sys/select.h sys/param.h sys/sysctl.h net/if6.h sys/socket.h net/route.h linux/netlink.h linux/rtnetlink.h,,,
352[$ac_includes_default
353#ifdef HAVE_SYS_PARAM_H
354# include <sys/param.h>
355#endif
356#ifdef HAVE_SYS_SOCKET_H
357# include <sys/socket.h>
358#endif
359])
360
361#
362# Check for thread local storage
363#
364AC_CHECK_HEADERS([threads.h],
365		 [
366		     AC_MSG_CHECKING([for C11 Thread-Local Storage using thread_local])
367		     AC_COMPILE_IFELSE(
368			 [AC_LANG_PROGRAM(
369			      [
370				  #include <threads.h>
371			      ],[
372				  static thread_local int tls = 0;
373				  return (tls);
374			      ])
375			 ],[
376			     AC_MSG_RESULT([yes])
377			     AC_DEFINE([HAVE_THREAD_LOCAL],[1],[Define if thread_local keyword is available])
378			     AC_DEFINE([HAVE_TLS],[1],[Define if Thread-Local Storage is available])
379			 ],[
380			     AC_MSG_RESULT([no])
381			 ])
382		 ],[
383		     AC_MSG_CHECKING([for Thread-Local Storage using __thread])
384		     AC_COMPILE_IFELSE(
385			 [AC_LANG_PROGRAM(
386			      [
387			      ],[
388				  static __thread int tls = 0;
389				  return (tls);
390			      ])
391			 ],[
392			     AC_MSG_RESULT([yes])
393			     AC_DEFINE([HAVE___THREAD],[1],[Define if __thread keyword is available])
394			     AC_DEFINE([HAVE_TLS],[1],[Define if Thread-Local Storage is available])
395			 ],[
396			     AC_MSG_RESULT([no])
397			 ])
398		 ])
399
400AC_C_CONST
401AC_C_INLINE
402AC_C_VOLATILE
403AC_C_FLEXIBLE_ARRAY_MEMBER
404
405#
406# Check for yield support on ARM processors
407#
408AS_CASE([$host],
409	[arm*],[
410	  AC_MSG_CHECKING([for yield instruction support])
411	  AC_COMPILE_IFELSE(
412	    [AC_LANG_PROGRAM(
413	       [[]],
414	       [[__asm__ __volatile__ ("yield")]]
415	     )],
416	    [AC_MSG_RESULT([yes])],
417	    [AC_MSG_ERROR([no, try adding -march=native or -march=armv7-a to CFLAGS (see PLATFORMS.md for more information)])])])
418
419AC_CHECK_FUNCS([sysctlbyname])
420
421#
422# Check for the existence of mmap to enable the fast format zones
423#
424AC_CHECK_FUNCS(mmap)
425
426#
427# Older versions of HP/UX don't define seteuid() and setegid()
428#
429AC_CHECK_FUNCS(seteuid setresuid)
430AC_CHECK_FUNCS(setegid setresgid)
431
432AC_TYPE_SIZE_T
433AC_TYPE_SSIZE_T
434AC_TYPE_UINTPTR_T
435
436AC_HEADER_TIME
437
438#
439# check for uname library routine
440#
441AC_MSG_CHECKING([for uname])
442AC_COMPILE_IFELSE(
443  [AC_LANG_PROGRAM(
444     [[#include <sys/utsname.h>
445       #include <stdio.h>
446      ]],
447     [[
448       struct utsname uts;
449       uname(&uts);
450       printf("running on %s %s %s for %s\n",
451	      uts.sysname, uts.release, uts.version, uts.machine);
452     ]])],
453  [AC_MSG_RESULT(yes)
454   AC_DEFINE([HAVE_UNAME], [1], [define if uname is available])
455  ],
456  [AC_MSG_RESULT(no)
457   AC_MSG_WARN([uname is not correctly supported])
458  ])
459
460#
461# check for GCC noreturn attribute
462#
463AC_MSG_CHECKING(for GCC noreturn attribute)
464AC_TRY_COMPILE([],[void foo() __attribute__((noreturn));],
465	[AC_MSG_RESULT(yes)
466		ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE"
467		ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST __attribute__((noreturn))"],
468	[AC_MSG_RESULT(no)
469		ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE"
470		ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST"])
471AC_SUBST(ISC_PLATFORM_NORETURN_PRE)
472AC_SUBST(ISC_PLATFORM_NORETURN_POST)
473
474#
475# check if we have kqueue
476#
477AC_ARG_ENABLE([kqueue],
478	      [AS_HELP_STRING([--enable-kqueue],
479			      [use BSD kqueue when available [default=yes]])],
480	      [], enable_kqueue="yes")
481
482AS_IF([test "$enable_kqueue" = "yes"],
483      [AC_CHECK_FUNCS([kqueue])])
484
485#
486# check if we have epoll.  Linux kernel 2.4 has epoll_create() which fails,
487# so we need to try running the code, not just test its existence.
488#
489AC_ARG_ENABLE([epoll],
490	      [AS_HELP_STRING([--enable-epoll],
491			      [use Linux epoll when available [default=auto]])],
492	      [], [enable_epoll="yes"])
493
494AS_IF([test "$enable_epoll" = "yes"],
495      [AC_CHECK_FUNCS([epoll_create1])])
496
497#
498# check if we support /dev/poll
499#
500AC_ARG_ENABLE([devpoll],
501	      [AS_HELP_STRING([--enable-devpoll],
502			      [use /dev/poll when available [default=yes]])],
503	      [], [enable_devpoll="yes"])
504AS_IF([test "$enable_devpoll" = "yes"],
505      [AC_CHECK_HEADERS([sys/devpoll.h devpoll.h])])
506
507#
508# Find the machine's endian flavor.
509#
510AC_C_BIGENDIAN
511
512#
513# GeoIP support?
514#
515GEOIPLINKSRCS=
516GEOIPLINKOBJS=
517AC_ARG_WITH(geoip,
518	    AS_HELP_STRING([--with-geoip=PATH],
519			   [Build with GeoIP support (yes|no|path)]),
520    use_geoip="$withval", use_geoip="no")
521
522if test "yes" = "$use_geoip"
523then
524	for d in /usr /usr/local /opt/local
525	do
526		if test -f $d/include/GeoIP.h
527		then
528			use_geoip=$d
529			break
530		fi
531	done
532fi
533
534case "$use_geoip" in
535	no|'')
536		AC_MSG_CHECKING([for GeoIP support])
537		AC_MSG_RESULT([disabled])
538		;;
539	*)
540		if test -d "$use_geoip" -o -L "$use_geoip"
541		then
542			CFLAGS="$CFLAGS -I$use_geoip/include"
543			CPPFLAGS="$CPPFLAGS -I$use_geoip/include"
544			LIBS="$LIBS -L$use_geoip/lib"
545			case "$host_os" in
546				netbsd*|openbsd*|solaris*)
547					LIBS="$LIBS -Wl,-rpath=$use_geoip/lib"
548					;;
549			esac
550		elif test "yes" = "$use_geoip"
551		then
552			AC_MSG_ERROR([GeoIP path not found])
553		else
554			AC_MSG_ERROR([GeoIP path $use_geoip does not exist])
555		fi
556		AC_CHECK_HEADER(GeoIP.h, [],
557			[AC_MSG_ERROR([GeoIP header file not found])]
558		)
559		AC_SEARCH_LIBS(GeoIP_id_by_addr_gl, GeoIP, [],
560			[AC_MSG_ERROR([suitable GeoIP library not found])]
561		)
562		AC_SEARCH_LIBS(fabsf, m, [],
563			[AC_MSG_ERROR([Math library not found])]
564		)
565		AC_DEFINE(HAVE_GEOIP, 1, Build with GeoIP support)
566		GEOIPLINKSRCS='${GEOIPLINKSRCS}'
567		GEOIPLINKOBJS='${GEOIPLINKOBJS}'
568		AC_MSG_CHECKING([for GeoIP support])
569		AC_MSG_RESULT([yes])
570
571		AC_MSG_CHECKING([for GeoIP Country IPv6 support])
572		AC_COMPILE_IFELSE(
573			[AC_LANG_PROGRAM([
574				#include <GeoIP.h>
575				#include <netinet/in.h>
576			], [
577				struct in6_addr in6;
578				GeoIP_country_name_by_ipnum_v6(NULL, in6);
579			])],
580			[
581				AC_MSG_RESULT([yes])
582				AC_DEFINE(HAVE_GEOIP_V6, 1, Build with GeoIP Country IPv6 support)
583			],
584			[AC_MSG_RESULT([no])]
585		)
586
587		AC_MSG_CHECKING([for GeoIP City IPv6 support])
588		AC_COMPILE_IFELSE(
589			[AC_LANG_PROGRAM([
590				#include <GeoIP.h>
591				#include <GeoIPCity.h>
592				#include <netinet/in.h>
593			], [
594				struct in6_addr in6;
595				int i = GEOIP_CITY_EDITION_REV0_V6;
596				GeoIP_record_by_ipnum_v6(NULL, in6);
597			])],
598			[
599				AC_MSG_RESULT([yes])
600				AC_DEFINE(HAVE_GEOIP_CITY_V6, 1, Build with GeoIP City IPv6 support)
601			],
602			[AC_MSG_RESULT([no])]
603		)
604		;;
605esac
606AC_SUBST(GEOIPLINKSRCS)
607AC_SUBST(GEOIPLINKOBJS)
608
609#
610# Do we have arc4random(), etc ?
611#
612AC_CHECK_FUNCS(arc4random arc4random_buf arc4random_uniform getrandom)
613
614AX_PTHREAD
615
616LIBS="$PTHREAD_LIBS $LIBS"
617CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
618CC="$PTHREAD_CC"
619
620#
621# We'd like to use sigwait() too
622#
623AC_CHECK_FUNCS([sigwait pthread_attr_getstacksize pthread_attr_setstacksize])
624
625AC_ARG_WITH([locktype],
626	    AS_HELP_STRING([--with-locktype=ARG],
627			   [Specify mutex lock type
628			    (adaptive or standard)]),
629	    [], [with_locktype="adaptive"])
630
631AS_CASE([$with_locktype],
632	[adaptive],[
633	  AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP])
634	  AC_COMPILE_IFELSE(
635	    [AC_LANG_PROGRAM(
636	       [[
637		 #ifndef _GNU_SOURCE
638		 #define _GNU_SOURCE
639		 #endif
640		 #include <pthread.h>
641	       ]],
642	       [[
643		 return (PTHREAD_MUTEX_ADAPTIVE_NP);
644	       ]]
645	     )],
646	    [AC_MSG_RESULT([using adaptive lock type])
647	     AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], 1,
648		       [Support for PTHREAD_MUTEX_ADAPTIVE_NP]) ],
649	    [AC_MSG_RESULT([using standard lock type])]
650	  )],
651	[standard],[AC_MSG_RESULT([using standard lock type])],
652	[AC_MSG_ERROR([You must specify "adaptive" or "standard" for --with-locktype.])]
653       )
654
655AC_CHECK_HEADERS([sched.h])
656
657AC_SEARCH_LIBS([sched_yield],[rt])
658AC_CHECK_FUNCS([sched_yield pthread_yield pthread_yield_np])
659
660AC_CHECK_HEADERS([sys/cpuset.h])
661AC_CHECK_HEADERS([sys/procset.h])
662AC_CHECK_FUNCS([pthread_setaffinity_np cpuset_setaffinity processor_bind sched_setaffinity])
663
664# Look for functions relating to thread naming
665AC_CHECK_FUNCS([pthread_setname_np pthread_set_name_np])
666AC_CHECK_HEADERS([pthread_np.h], [], [], [#include <pthread.h>])
667
668#
669# flockfile is usually provided by pthreads
670#
671AC_CHECK_FUNCS([flockfile getc_unlocked])
672
673#
674# Look for sysconf to allow detection of the number of processors.
675#
676AC_CHECK_FUNCS([sysconf])
677
678AC_SUBST(ALWAYS_DEFINES)
679
680AC_MSG_CHECKING(for libtool)
681AC_ARG_WITH(libtool, AS_HELP_STRING([--with-libtool], [use GNU libtool]),
682	    use_libtool="$withval", use_libtool="no")
683
684case $use_libtool in
685	yes)
686		AC_MSG_RESULT(yes)
687		AM_PROG_LIBTOOL
688		O=lo
689		A=la
690		LIBTOOL_MKDEP_SED='s;\.o;\.lo;'
691		LIBTOOL_MODE_COMPILE='--mode=compile'
692		LIBTOOL_MODE_INSTALL='--mode=install'
693		LIBTOOL_MODE_LINK='--mode=link'
694		LIBTOOL_MODE_UNINSTALL='--mode=uninstall'
695		INSTALL_LIBRARY='${INSTALL_PROGRAM}'
696		;;
697	*)
698		AC_MSG_RESULT(no)
699		O=o
700		A=a
701		LIBTOOL=
702		AC_SUBST(LIBTOOL)
703		LIBTOOL_MKDEP_SED=
704		LIBTOOL_MODE_COMPILE=
705		LIBTOOL_MODE_INSTALL=
706		LIBTOOL_MODE_LINK=
707		LIBTOOL_MODE_UNINSTALL=
708		INSTALL_LIBRARY='${INSTALL_DATA}'
709		;;
710esac
711AC_SUBST(INSTALL_LIBRARY)
712
713#
714# If PIC is disabled, shared libraries must also be
715#
716AS_IF([test "$pic_mode" = "no"],
717      [enable_shared="no"])
718
719CRYPTO=OpenSSL
720
721#
722# was --with-openssl specified?
723#
724AX_CHECK_OPENSSL([:],[AC_MSG_FAILURE([OpenSSL/LibreSSL not found])])
725
726save_CFLAGS="$CFLAGS"
727save_LIBS="$LIBS"
728save_LDFLAGS="$LDFLAGS"
729CFLAGS="$CFLAGS $OPENSSL_INCLUDES"
730LIBS="$LIBS $OPENSSL_LIBS"
731LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS"
732
733AC_MSG_CHECKING([for OpenSSL >= 1.0.0 or LibreSSL])
734AC_COMPILE_IFELSE(
735    [AC_LANG_PROGRAM([[#include <openssl/opensslv.h>]],
736		     [[#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER < 0x1000000fL)
737		       #error OpenSSL >= 1.0.0 or LibreSSL required
738		       #endif
739		      ]])],
740    [AC_MSG_RESULT([yes])],
741    [AC_MSG_FAILURE([not found])])
742
743#
744# Check for functions added in OpenSSL or LibreSSL
745#
746
747AC_CHECK_FUNCS([CRYPTO_zalloc])
748AC_CHECK_FUNCS([EVP_CIPHER_CTX_new EVP_CIPHER_CTX_free])
749AC_CHECK_FUNCS([EVP_MD_CTX_new EVP_MD_CTX_free EVP_MD_CTX_reset])
750AC_CHECK_FUNCS([HMAC_CTX_new HMAC_CTX_free HMAC_CTX_reset HMAC_CTX_get_md])
751
752#
753# Check for algorithm support in OpenSSL
754#
755
756AC_CHECK_FUNCS([ECDSA_sign ECDSA_verify], [:],
757	       [AC_MSG_FAILURE([ECDSA support in OpenSSL is mandatory.])])
758
759AC_MSG_CHECKING([for ECDSA P-256 support])
760AC_COMPILE_IFELSE(
761    [AC_LANG_PROGRAM([[#include <openssl/evp.h>
762		       #include <openssl/ec.h>]],
763		     [[EC_KEY *key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);]])],
764    [AC_MSG_RESULT([yes])],
765    [AC_MSG_FAILURE([not found.  ECDSA P-256 support in OpenSSL is mandatory.])])
766
767AC_MSG_CHECKING([for ECDSA P-384 support])
768AC_COMPILE_IFELSE(
769    [AC_LANG_PROGRAM([[#include <openssl/evp.h>
770		       #include <openssl/ec.h>]],
771		     [[EC_KEY *key = EC_KEY_new_by_curve_name(NID_secp384r1);]])],
772    [AC_MSG_RESULT([yes])],
773    [AC_MSG_FAILURE([not found.  ECDSA P-384 support in OpenSSL is mandatory.])])
774
775AC_MSG_CHECKING([for Ed25519 support])
776AC_COMPILE_IFELSE(
777    [AC_LANG_PROGRAM([[#include <openssl/evp.h>
778		       #include <openssl/ec.h>]],
779		     [[EC_KEY *key = EC_KEY_new_by_curve_name(NID_ED25519);]])],
780    [AC_DEFINE([HAVE_OPENSSL_ED25519], [1], [define if OpenSSL supports Ed25519])
781     AC_MSG_RESULT([yes])],
782    [AC_MSG_RESULT([no])])
783
784AC_MSG_CHECKING([for Ed448 support])
785AC_MSG_RESULT([broken])
786#AC_COMPILE_IFELSE(
787#    [AC_LANG_PROGRAM([[#include <openssl/evp.h>
788#		       #include <openssl/ec.h>]],
789#		     [[EC_KEY *key = EC_KEY_new_by_curve_name(NID_ED448);]])],
790#    [AC_DEFINE([HAVE_OPENSSL_ED448], [1], [define if OpenSSL supports Ed448])
791#     AC_MSG_RESULT([yes])],
792#    [AC_MSG_RESULT([no])])
793
794#
795# Check for OpenSSL SHA-1 support
796#
797AC_CHECK_FUNCS([EVP_sha1], [:],
798	       [AC_MSG_FAILURE([SHA-1 support in OpenSSL is mandatory.])])
799
800#
801# Check for OpenSSL SHA-2 support
802#
803AC_CHECK_FUNCS([EVP_sha224 EVP_sha256 EVP_sha384 EVP_sha512], [:],
804	       [AC_MSG_FAILURE([SHA-2 support in OpenSSL is mandatory.])])
805
806#
807# Check for OpenSSL AES support
808#
809AC_CHECK_FUNCS([EVP_aes_128_ecb EVP_aes_192_ecb EVP_aes_256_ecb], [:],
810	       [AC_MSG_FAILURE([AES support in OpenSSL is mandatory.])])
811
812#
813# Check for OpenSSL 1.1.x/LibreSSL functions
814#
815AC_CHECK_FUNCS([DH_get0_key ECDSA_SIG_get0 RSA_set0_key])
816
817#
818# Check whether FIPS mode is available and whether we should enable it
819#
820AC_ARG_ENABLE([fips-mode],
821	      [AS_HELP_STRING([--enable-fips-mode],
822			      [enable FIPS mode in OpenSSL library [default=no]])],
823	      [], [enable_fips_mode="no"])
824
825AC_MSG_CHECKING([whether to enable FIPS mode in OpenSSL library])
826AS_CASE([$enable_fips_mode],
827	[yes], [AC_MSG_RESULT([yes])
828		AC_CHECK_FUNCS([FIPS_mode],
829			       [], [AC_MSG_FAILURE([OpenSSL FIPS mode requested but not available.])])],
830	[no], [AC_MSG_RESULT([no])])
831
832CFLAGS="$save_CFLAGS"
833LIBS="$save_LIBS"
834LDFLAGS="$save_LDFLAGS"
835
836AC_SUBST([OPENSSL_INCLUDES])
837AC_SUBST([OPENSSL_LIBS])
838AC_SUBST([OPENSSL_LDFLAGS])
839
840#
841# Client Cookie algorithm choice
842#
843AC_ARG_WITH([cc-alg],
844	    [AS_HELP_STRING([--with-cc-alg=ALG],
845			   [choose the algorithm for Client Cookie
846			    [aes|sha1|sha256] (default is aes)])],
847	    [:], [with_cc_alg="aes"])
848
849AC_MSG_CHECKING([for the algorithm for Client Cookie])
850AS_CASE([$with_cc_alg],
851	[sha1|SHA1],[AC_MSG_RESULT([sha1])
852		     AC_DEFINE([HMAC_SHA1_CC], [1], [Use HMAC-SHA1 for Client Cookie generation])],
853	[sha256|SHA256],[AC_MSG_RESULT([sha256])
854			 AC_DEFINE([HMAC_SHA256_CC], [1], [Use HMAC-SHA256 for Client Cookie generation])],
855	[aes|AES|auto],[AC_MSG_RESULT([aes])
856		       AC_DEFINE([AES_CC], [1], [Use AES for Client Cookie generation])],
857	[AC_MSG_ERROR([Invalid $with_cc_alg algorithm for Client Cookie])])
858
859
860PKCS11_TOOLS=
861PKCS11_TEST=
862#
863# was --enable-native-pkcs11 specified?
864#
865AC_ARG_ENABLE(native-pkcs11,
866	      AS_HELP_STRING([--enable-native-pkcs11],
867			     [use native PKCS11 for public-key crypto [default=no]]),
868	      [:], [enable_native_pkcs11="no"])
869
870AC_MSG_CHECKING([for PKCS11 for Public-Key Cryptography])
871AS_CASE([$enable_native_pkcs11],
872	[no],[AC_MSG_RESULT([no])],
873	[yes],[PKCS11_TOOLS=pkcs11
874	       PKCS11_TEST=pkcs11
875	       CRYPTO=pkcs11
876	       AS_IF([$use_threads],
877		     [:],
878		     [AC_MSG_ERROR([PKCS11 requires threading support])])
879	       AC_MSG_RESULT([yes])
880	       AC_CHECK_FUNCS([getpassphrase])
881	      ])
882AC_SUBST([PKCS11_TEST])
883AC_SUBST([PKCS11_TOOLS])
884
885AS_CASE([$CRYPTO],
886	[pkcs11],[AC_DEFINE([USE_PKCS11], [1], [define if PKCS11 is used for Public-Key Cryptography])],
887	[AC_DEFINE([USE_OPENSSL], [1], [define if OpenSSL is used for Public-Key Cryptography])])
888
889# preparation for automake
890# AM_CONDITIONAL([PKCS11_TOOLS], [test "$with_native_pkcs11" = "yes"])
891
892#
893# was --with-pkcs11 specified?
894#
895AC_ARG_WITH([pkcs11],
896	    [AS_HELP_STRING([--with-pkcs11[=PATH]],
897			    [Build with PKCS11 support [no|path] (PATH is for the PKCS11 provider)])],
898	    [:], [with_pkcs11="undefined"])
899
900AS_CASE([$with_pkcs11],
901	[yes|auto],[AC_MSG_ERROR([--with-pkcs11 needs explicit path to the PKCS11 library])],
902	[no|undefined],[with_pkcs11="undefined"])
903AC_DEFINE_UNQUOTED([PK11_LIB_LOCATION], ["$with_pkcs11"], [define the default PKCS11 library path])
904
905# for PKCS11 benchmarks
906
907have_clock_gt=no
908AC_CHECK_FUNC(clock_gettime,have_clock_gt=yes,)
909if test "no" = "$have_clock_gt"; then
910	AC_CHECK_LIB(rt,clock_gettime,have_clock_gt=rt,)
911fi
912
913if test "no" != "$have_clock_gt"; then
914	AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [Define if clock_gettime is available.])
915fi
916
917if test "rt" = "$have_clock_gt"; then
918	LIBS="-lrt $LIBS"
919fi
920
921AC_MSG_CHECKING(for GSSAPI library)
922AC_ARG_WITH(gssapi,
923	    AS_HELP_STRING([--with-gssapi=[PATH|[/path/]krb5-config]],
924			   [Specify path for system-supplied GSSAPI
925				[default=yes]]),
926	    use_gssapi="$withval", use_gssapi="yes")
927
928# first try using krb5-config, if that does not work then fall back to "yes" method.
929
930case "$use_gssapi" in
931*/krb5-config|krb5-config)
932    AC_MSG_RESULT(trying $use_gssapi)
933    if test krb5-config = "$use_gssapi"
934    then
935	AC_PATH_PROG(KRB5_CONFIG, $use_gssapi)
936    else
937	KRB5_CONFIG="$use_gssapi"
938    fi
939    gssapi_cflags=`$KRB5_CONFIG --cflags gssapi`
940    gssapi_libs=`$KRB5_CONFIG --libs gssapi`
941    saved_cppflags="$CPPFLAGS"
942    CPPFLAGS="$gssapi_cflags $CPPFLAGS"
943    AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h,
944	[ISC_PLATFORM_GSSAPIHEADER="#define ISC_PLATFORM_GSSAPIHEADER <$ac_header>"])
945    if test "" = "$ISC_PLATFORM_GSSAPIHEADER"; then
946	AC_MSG_RESULT([krb5-config: gssapi.h not found])
947	CPPFLAGS="$saved_cppflags"
948	use_gssapi="yes"
949    else
950	AC_CHECK_HEADERS(krb5/krb5.h krb5.h,
951	    [ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <$ac_header>"])
952	if test "" = "$ISC_PLATFORM_KRB5HEADER"; then
953	    AC_MSG_RESULT([krb5-config: krb5.h not found])
954	    CPPFLAGS="$saved_cppflags"
955	    use_gssapi="yes"
956	else
957	    CPPFLAGS="$saved_cppflags"
958	    saved_libs="$LIBS"
959	    LIBS=$gssapi_libs
960	    AC_MSG_CHECKING([krb5-config linking as $LIBS])
961	    AC_TRY_LINK( , [gss_acquire_cred();krb5_init_context()],
962		gssapi_linked=yes, gssapi_linked=no)
963	    case $gssapi_linked in
964		yes) AC_MSG_RESULT([krb5-config: linked]);;
965		no)  AC_MSG_RESULT([krb5-config: could not determine proper GSSAPI linkage])
966		    use_gssapi="yes"
967		    ;;
968	    esac
969	    LIBS=$saved_libs
970	fi
971    fi
972    if test "yes" = "$use_gssapi"; then
973	AC_MSG_CHECKING([for GSSAPI library, non krb5-config method])
974    fi
975    ;;
976esac
977
978case "$host" in
979*darwin*)
980	if test "yes" = "$use_gssapi"
981	then
982		use_gssapi=framework
983	fi
984	;;
985esac
986
987# gssapi is just the framework, we really require kerberos v5, so
988# look for those headers (the gssapi headers must be there, too)
989# The problem with this implementation is that it doesn't allow
990# for the specification of gssapi and krb5 headers in different locations,
991# which probably ought to be fixed although fixing might raise the issue of
992# trying to build with incompatible versions of gssapi and krb5.
993if test "yes" = "$use_gssapi"
994then
995	# first, deal with the obvious
996	if test \( -f /usr/include/kerberosv5/krb5.h -o \
997		   -f /usr/include/krb5/krb5.h -o \
998		   -f /usr/include/krb5.h \)   -a \
999		\( -f /usr/include/gssapi.h -o \
1000		   -f /usr/include/gssapi/gssapi.h \)
1001	then
1002		use_gssapi=/usr
1003	else
1004	    krb5dirs="/usr/local /usr/local/krb5 /usr/local/kerberosv5 /usr/local/kerberos /usr/pkg /usr/krb5 /usr/kerberosv5 /usr/kerberos /usr"
1005	    for d in $krb5dirs
1006	    do
1007		if test -f $d/include/gssapi/gssapi_krb5.h -o \
1008			-f $d/include/krb5.h
1009		then
1010			if test -f $d/include/gssapi/gssapi.h -o \
1011				-f $d/include/gssapi.h
1012			then
1013				use_gssapi=$d
1014				break
1015			fi
1016		fi
1017		use_gssapi="no"
1018	    done
1019	fi
1020fi
1021
1022case "$use_gssapi" in
1023	no)
1024		AC_MSG_RESULT(disabled)
1025		USE_GSSAPI=''
1026		;;
1027	yes)
1028		AC_MSG_ERROR([--with-gssapi must specify a path])
1029		;;
1030	*/krb5-config|krb5-config)
1031		USE_GSSAPI='-DGSSAPI'
1032		DST_GSSAPI_INC="$gssapi_cflags"
1033		DNS_GSSAPI_LIBS="$gssapi_libs"
1034		;;
1035	framework)
1036		USE_GSSAPI='-DGSSAPI'
1037		ISC_PLATFORM_GSSAPIHEADER="#define ISC_PLATFORM_GSSAPIHEADER <Kerberos/Kerberos.h>"
1038		ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <Kerberos/Kerberos.h>"
1039		DNS_GSSAPI_LIBS="-framework Kerberos"
1040		AC_MSG_RESULT(framework)
1041		;;
1042
1043	*)
1044		AC_MSG_RESULT(looking in $use_gssapi/lib)
1045		USE_GSSAPI='-DGSSAPI'
1046		saved_cppflags="$CPPFLAGS"
1047		CPPFLAGS="-I$use_gssapi/include $CPPFLAGS"
1048		AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h,
1049		    [ISC_PLATFORM_GSSAPIHEADER="#define ISC_PLATFORM_GSSAPIHEADER <$ac_header>"
1050		     gssapi_hack="#include <$ac_header>"])
1051
1052		if test "" = "$ISC_PLATFORM_GSSAPIHEADER"; then
1053		    AC_MSG_ERROR([gssapi.h not found])
1054		fi
1055
1056		AC_CHECK_HEADERS(gssapi_krb5.h gssapi/gssapi_krb5.h,
1057		    [ISC_PLATFORM_GSSAPI_KRB5_HEADER="#define ISC_PLATFORM_GSSAPI_KRB5_HEADER <$ac_header>"
1058		     gssapi_krb5_hack="#include <$ac_header>"])
1059
1060		AC_CHECK_HEADERS(krb5.h krb5/krb5.h kerberosv5/krb5.h,
1061		    [ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <$ac_header>"
1062		    krb5_hack="#include <$ac_header>"])
1063
1064		if test "" = "$ISC_PLATFORM_KRB5HEADER"; then
1065		    AC_MSG_ERROR([krb5.h not found])
1066		fi
1067
1068		#
1069		# XXXDCL This probably doesn't work right on all systems.
1070		# It will need to be worked on as problems become evident.
1071		#
1072		# Essentially the problems here relate to two different
1073		# areas.  The first area is building with either KTH
1074		# or MIT Kerberos, particularly when both are present on
1075		# the machine.  The other is static versus dynamic linking.
1076		#
1077		# On the KTH vs MIT issue, Both have libkrb5 that can mess
1078		# up the works if one implementation ends up trying to
1079		# use the other's krb.  This is unfortunately a situation
1080		# that very easily arises.
1081		#
1082		# Dynamic linking when the dependency information is built
1083		# into MIT's libgssapi_krb5 or KTH's libgssapi magically makes
1084		# all such problems go away, but when that setup is not
1085		# present, because either the dynamic libraries lack
1086		# dependencies or static linking is being done, then the
1087		# problems start to show up.
1088		saved_libs="$LIBS"
1089		for TRY_LIBS in \
1090		    "-lgssapi_krb5" \
1091		    "-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err" \
1092		    "-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lresolv" \
1093		    "-lgssapi" \
1094		    "-lgssapi -lkrb5 -ldes -lcrypt -lasn1 -lroken -lcom_err" \
1095		    "-lgssapi -lkrb5 -lcrypt -lasn1 -lroken -lcom_err" \
1096		    "-lgssapi -lkrb5 -lgssapi_krb5 -lcrypt -lasn1 -lroken -lcom_err" \
1097		    "-lgssapi -lkrb5 -lhx509 -lcrypt -lasn1 -lroken -lcom_err" \
1098		    "-lgss -lkrb5"
1099		do
1100		    # Note that this does not include $saved_libs, because
1101		    # on FreeBSD machines this configure script has added
1102		    # -L/usr/local/lib to LIBS, which can make the
1103		    # -lgssapi_krb5 test succeed with shared libraries even
1104		    # when you are trying to build with KTH in /usr/lib.
1105		    if test "/usr" = "$use_gssapi"
1106		    then
1107			    LIBS="$TRY_LIBS $ISC_OPENSSL_LIBS"
1108		    else
1109			    LIBS="-L$use_gssapi/lib $TRY_LIBS $ISC_OPENSSL_LIBS"
1110		    fi
1111		    AC_MSG_CHECKING(linking as $TRY_LIBS)
1112		    AC_TRY_LINK([
1113#include <sys/types.h>
1114$gssapi_hack
1115$gssapi_krb5_hack
1116$krb5_hack
1117				] , [gss_acquire_cred(NULL, NULL, 0, NULL, 0, NULL, NULL, NULL);krb5_init_context(NULL);
1118#if defined(HAVE_GSSAPI_KRB5_H) || defined(HAVE_GSSAPI_GSSAPI_KRB5_H)
1119gsskrb5_register_acceptor_identity(NULL);
1120#endif],
1121				gssapi_linked=yes, gssapi_linked=no)
1122		    case $gssapi_linked in
1123		    yes) AC_MSG_RESULT(yes); break ;;
1124		    no)  AC_MSG_RESULT(no) ;;
1125		    esac
1126		done
1127
1128		CPPFLAGS="$saved_cppflags"
1129
1130		case $gssapi_linked in
1131		no) AC_MSG_ERROR(could not determine proper GSSAPI linkage) ;;
1132		esac
1133
1134		#
1135		# XXXDCL Major kludge.  Tries to cope with KTH in /usr/lib
1136		# but MIT in /usr/local/lib and trying to build with KTH.
1137		# /usr/local/lib can end up earlier on the link lines.
1138		# Like most kludges, this one is not only inelegant it
1139		# is also likely to be the wrong thing to do at least as
1140		# many times as it is the right thing.  Something better
1141		# needs to be done.
1142		#
1143		if test "/usr" = "$use_gssapi" -a \
1144			-f /usr/local/lib/libkrb5.a; then
1145		    FIX_KTH_VS_MIT=yes
1146		fi
1147
1148		case "$FIX_KTH_VS_MIT" in
1149		yes)
1150		    case "$enable_static_linking" in
1151		    yes) gssapi_lib_suffix=".a"  ;;
1152		    *)   gssapi_lib_suffix=".so" ;;
1153		    esac
1154
1155		    for lib in $LIBS; do
1156			case $lib in
1157			-L*)
1158			    ;;
1159			-l*)
1160			    new_lib=`echo $lib |
1161				     sed -e s%^-l%$use_gssapi/lib/lib% \
1162					 -e s%$%$gssapi_lib_suffix%`
1163			    NEW_LIBS="$NEW_LIBS $new_lib"
1164			    ;;
1165			*)
1166			   AC_MSG_ERROR([KTH vs MIT Kerberos confusion!])
1167			    ;;
1168			esac
1169		    done
1170		    LIBS="$NEW_LIBS"
1171		    ;;
1172		esac
1173
1174		DST_GSSAPI_INC="-I$use_gssapi/include"
1175		DNS_GSSAPI_LIBS="$LIBS"
1176
1177		AC_MSG_RESULT(using GSSAPI from $use_gssapi/lib and $use_gssapi/include)
1178		LIBS="$saved_libs"
1179		;;
1180esac
1181
1182AC_SUBST(ISC_PLATFORM_HAVEGSSAPI)
1183AC_SUBST(ISC_PLATFORM_GSSAPIHEADER)
1184AC_SUBST(ISC_PLATFORM_GSSAPI_KRB5_HEADER)
1185AC_SUBST(ISC_PLATFORM_KRB5HEADER)
1186
1187AC_SUBST(USE_GSSAPI)
1188AC_SUBST(DST_GSSAPI_INC)
1189AC_SUBST(DNS_GSSAPI_LIBS)
1190DNS_CRYPTO_LIBS="$DNS_GSSAPI_LIBS"
1191
1192#
1193# Applications linking with libdns also need to link with these libraries.
1194#
1195
1196AC_SUBST(DNS_CRYPTO_LIBS)
1197
1198#
1199# was --with-lmdb specified?
1200#
1201AC_MSG_CHECKING(for lmdb library)
1202AC_ARG_WITH(lmdb,
1203	    AS_HELP_STRING([--with-lmdb[=PATH]],
1204			   [build with LMDB library [yes|no|path]]),
1205    use_lmdb="$withval", use_lmdb="auto")
1206
1207have_lmdb=""
1208case "$use_lmdb" in
1209	no)
1210		lmdb_libs=""
1211		;;
1212	auto|yes)
1213		for d in /usr /usr/local /opt/local
1214		do
1215			if test -f "${d}/include/lmdb.h"
1216			then
1217				if test ${d} != /usr
1218				then
1219					lmdb_cflags="-I ${d}/include"
1220					LIBS="$LIBS -L${d}/lib"
1221				fi
1222				have_lmdb="yes"
1223			fi
1224		done
1225		;;
1226	*)
1227		if test -f "${use_lmdb}/include/lmdb.h"
1228		then
1229			lmdb_cflags="-I${use_lmdb}/include"
1230			LIBS="$LIBS -L${use_lmdb}/lib"
1231			have_lmdb="yes"
1232		else
1233			AC_MSG_ERROR([$use_lmdb/include/lmdb.h not found.])
1234		fi
1235		;;
1236esac
1237
1238if test "X${have_lmdb}" != "X"
1239then
1240	AC_MSG_RESULT(yes)
1241	AC_SEARCH_LIBS([mdb_env_create], [lmdb], [],
1242		       [AC_MSG_ERROR([found lmdb include but not library.])
1243			have_lmdb=""])
1244elif test "X$use_lmdb" = Xyes
1245then
1246	AC_MSG_ERROR([include/lmdb.h not found.])
1247else
1248	AC_MSG_RESULT(no)
1249fi
1250
1251NZD_TOOLS=""
1252NZDSRCS=
1253NZDTARGETS=
1254if test "X${have_lmdb}" != "X"
1255then
1256	CFLAGS="$CFLAGS $lmdb_cflags"
1257	AC_DEFINE(HAVE_LMDB, 1, [Define if lmdb was found])
1258	NZD_TOOLS="nzd"
1259	NZDSRCS='${NZDSRCS}'
1260	NZDTARGETS='${NZDTARGETS}'
1261fi
1262AC_SUBST(NZD_TOOLS)
1263AC_SUBST(NZDSRCS)
1264AC_SUBST(NZDTARGETS)
1265
1266#
1267# was --with-libxml2 specified?
1268#
1269AC_MSG_CHECKING(for libxml2 library)
1270AC_ARG_WITH(libxml2,
1271	    AS_HELP_STRING([--with-libxml2[=PATH]],
1272			   [build with libxml2 library [yes|no|path]]),
1273    use_libxml2="$withval", use_libxml2="auto")
1274
1275case "$use_libxml2" in
1276	no)
1277		DST_LIBXML2_INC=""
1278		;;
1279	auto|yes)
1280		case X`(xml2-config --version) 2>/dev/null` in
1281		X2.[[6789]].*)
1282			libxml2_libs=`xml2-config --libs`
1283			libxml2_cflags=`xml2-config --cflags`
1284			;;
1285		*)
1286			if test "yes" = "$use_libxml2" ; then
1287				AC_MSG_RESULT(no)
1288				AC_MSG_ERROR(required libxml2 version not available)
1289			else
1290				libxml2_libs=
1291				libxml2_cflags=
1292			fi
1293			;;
1294		esac
1295		;;
1296	*)
1297		if test -f "$use_libxml2/bin/xml2-config" ; then
1298			libxml2_libs=`$use_libxml2/bin/xml2-config --libs`
1299			libxml2_cflags=`$use_libxml2/bin/xml2-config --cflags`
1300		fi
1301		;;
1302esac
1303
1304if test "X$libxml2_libs" != "X"
1305then
1306	CFLAGS="$CFLAGS $libxml2_cflags"
1307	LIBS="$LIBS $libxml2_libs"
1308	#
1309	# Sanity check xml2-config output.
1310	#
1311	AC_TRY_LINK([#include <libxml/xmlwriter.h>],
1312		    [return(xmlTextWriterStartElement(NULL, NULL));],
1313		    AC_MSG_RESULT(yes),
1314		    AC_MSG_ERROR(xml2-config returns badness))
1315	AC_DEFINE(HAVE_LIBXML2, 1, [Define if libxml2 was found])
1316	XMLSTATS=1
1317else
1318	AC_MSG_RESULT(no)
1319fi
1320AC_SUBST(XMLSTATS)
1321
1322#
1323# was --with-libjson specified?
1324#
1325AC_MSG_CHECKING(for json library)
1326AC_ARG_WITH(libjson,
1327	    AS_HELP_STRING([--with-libjson[=PATH]],
1328			   [build with libjson0 library [yes|no|path]]),
1329	    use_libjson="$withval", use_libjson="auto")
1330
1331have_libjson=""
1332have_libjson_c=""
1333case "$use_libjson" in
1334	no)
1335		libjson_libs=""
1336		;;
1337	auto|yes)
1338		for d in /usr /usr/local /opt/local
1339		do
1340			if test -f "${d}/include/json/json.h"
1341			then
1342				if test ${d} != /usr
1343				then
1344					libjson_cflags="-I ${d}/include"
1345					LIBS="$LIBS -L${d}/lib"
1346				fi
1347				have_libjson="yes"
1348			elif test -f "${d}/include/json-c/json.h"
1349			then
1350				if test ${d} != /usr
1351				then
1352					libjson_cflags="-I ${d}/include"
1353					LIBS="$LIBS -L${d}/lib"
1354				fi
1355				have_libjson="yes"
1356				have_libjson_c="yes"
1357			fi
1358		done
1359		;;
1360	*)
1361		if test -f "${use_libjson}/include/json/json.h"
1362		then
1363			libjson_cflags="-I${use_libjson}/include"
1364			LIBS="$LIBS -L${use_libjson}/lib"
1365			have_libjson="yes"
1366		elif test -f "${use_libjson}/include/json-c/json.h"
1367		then
1368			libjson_cflags="-I${use_libjson}/include"
1369			LIBS="$LIBS -L${use_libjson}/lib"
1370			have_libjson="yes"
1371			have_libjson_c="yes"
1372		else
1373			AC_MSG_ERROR([$use_libjson/include/json{,-c}/json.h not found.])
1374		fi
1375		;;
1376esac
1377
1378if test "X${have_libjson}" != "X"
1379then
1380	AC_MSG_RESULT(yes)
1381	AC_SEARCH_LIBS([json_object_new_int64], [json json-c], [],
1382		       [AC_MSG_ERROR([found libjson include but not library.])
1383			have_libjson=""])
1384elif test "X$use_libjson" = Xyes
1385then
1386	AC_MSG_ERROR([include/json{,-c}/json.h not found.])
1387else
1388	AC_MSG_RESULT(no)
1389fi
1390
1391if test "X${have_libjson}" != "X"
1392then
1393	CFLAGS="$CFLAGS $libjson_cflags"
1394	AC_DEFINE(HAVE_JSON, 1, [Define if libjson was found])
1395	if test "X${have_libjson_c}" = Xyes
1396	then
1397		AC_DEFINE(HAVE_JSON_C, 1, [Define if json-c was found])
1398	fi
1399	JSONSTATS=1
1400fi
1401AC_SUBST(JSONSTATS)
1402
1403#
1404# was --with-zlib specified?
1405#
1406AC_MSG_CHECKING(for zlib library)
1407AC_ARG_WITH(zlib,
1408	    AS_HELP_STRING([--with-zlib[=PATH]],
1409			   [build with zlib for HTTP compression
1410				[default=yes]]),
1411	    with_zlib="$withval", with_zlib="auto")
1412
1413have_zlib=""
1414case "$with_zlib" in
1415	no)
1416		zlib_libs=""
1417		;;
1418	auto|yes)
1419		for d in /usr /usr/local /opt/local
1420		do
1421			if test -f "${d}/include/zlib.h"
1422			then
1423				if test ${d} != /usr
1424				then
1425					zlib_cflags="-I ${d}/include"
1426					LIBS="$LIBS -L${d}/lib"
1427				fi
1428				have_zlib="yes"
1429			fi
1430		done
1431		;;
1432	*)
1433		if test -f "${with_zlib}/include/zlib.h"
1434		then
1435			zlib_cflags="-I${with_zlib}/include"
1436			LIBS="$LIBS -L${with_zlib}/lib"
1437			have_zlib="yes"
1438		else
1439			AC_MSG_ERROR([$with_zlib/include/zlib.h not found.])
1440		fi
1441		;;
1442esac
1443
1444if test "X${have_zlib}" != "X"
1445then
1446	AC_MSG_RESULT(yes)
1447	AC_SEARCH_LIBS([deflate], [z], [],
1448		       [AC_MSG_ERROR([found zlib include but not library.])
1449			have_zlib=""])
1450elif test "X$with_zlib" = Xyes
1451then
1452	AC_MSG_ERROR([include/zlib.h not found.])
1453else
1454	AC_MSG_RESULT(no)
1455fi
1456
1457ZLIB=
1458if test "X${have_zlib}" != "X"
1459then
1460	CFLAGS="$CFLAGS $zlib_cflags"
1461	AC_DEFINE(HAVE_ZLIB, 1, [Define if zlib was found])
1462	ZLIB=1
1463fi
1464AC_SUBST(ZLIB)
1465
1466
1467#
1468# In solaris 10, SMF can manage named service
1469#
1470AC_CHECK_LIB(scf, smf_enable_instance)
1471
1472#
1473# Large File
1474#
1475AC_ARG_ENABLE(largefile,
1476	      AS_HELP_STRING([--enable-largefile], [64-bit file support]),
1477	      want_largefile="yes", want_largefile="no")
1478case $want_largefile in
1479	yes)
1480		ALWAYS_DEFINES="$ALWAYS_DEFINES -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
1481		;;
1482	*)
1483		;;
1484esac
1485
1486#
1487# Additional compiler settings.
1488#
1489MKDEPCC="$CC"
1490MKDEPCFLAGS="-M"
1491
1492if test "X$GCC" = "Xyes"; then
1493	STD_CWARNINGS="$STD_CWARNINGS -W -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wformat -Wpointer-arith"
1494	AC_MSG_CHECKING(if "$CC" supports -fno-strict-aliasing)
1495	SAVE_CFLAGS="$CFLAGS"
1496	CFLAGS="$CFLAGS -Werror -fno-strict-aliasing"
1497	AC_TRY_COMPILE(,, [FNOSTRICTALIASING=yes],[FNOSTRICTALIASING=no])
1498	CFLAGS="$SAVE_CFLAGS"
1499	if test "yes" = "$FNOSTRICTALIASING"; then
1500		AC_MSG_RESULT(yes)
1501		STD_CWARNINGS="$STD_CWARNINGS -fno-strict-aliasing"
1502	else
1503		AC_MSG_RESULT(no)
1504	fi
1505	#
1506	# turn off delete null pointer checks
1507	#
1508	AC_MSG_CHECKING(if "$CC" supports -fno-delete-null-pointer-checks)
1509	SAVE_CFLAGS="$CFLAGS"
1510	CFLAGS="$CFLAGS -Werror -fno-delete-null-pointer-checks"
1511	AC_TRY_COMPILE(,, [FNODELETENULLPOINTERCHECKS=yes],
1512			  [FNODELETENULLPOINTERCHECKS=no])
1513	CFLAGS="$SAVE_CFLAGS"
1514	if test "yes" = "$FNODELETENULLPOINTERCHECKS"; then
1515		AC_MSG_RESULT(yes)
1516		STD_CWARNINGS="$STD_CWARNINGS -fno-delete-null-pointer-checks"
1517	else
1518		AC_MSG_RESULT(no)
1519	fi
1520	if test "X$enable_warn_shadow" = Xyes; then
1521		STD_CWARNINGS="$STD_CWARNINGS -Wshadow"
1522	fi
1523	if test "X$enable_warn_error" = Xyes; then
1524		STD_CWARNINGS="$STD_CWARNINGS -Werror"
1525	fi
1526else
1527	case $host in
1528	*-solaris*)
1529		MKDEPCFLAGS="-xM"
1530		;;
1531	esac
1532fi
1533
1534AC_SUBST(MKDEPCC)
1535AC_SUBST(MKDEPCFLAGS)
1536AC_SUBST(MKDEPPROG)
1537
1538#
1539# -lxnet buys us one big porting headache...  standards, gotta love 'em.
1540#
1541# AC_CHECK_LIB(xnet, socket, ,
1542#    AC_CHECK_LIB(socket, socket)
1543# )
1544#
1545# Use this for now, instead:
1546#
1547case "$host" in
1548	*-linux*)
1549		;;
1550	*)
1551		AC_CHECK_LIB(socket, socket)
1552		AC_CHECK_LIB(nsl, inet_addr)
1553		;;
1554esac
1555
1556#
1557# Work around Solaris's select() limitations.
1558#
1559case "$host" in
1560	*-solaris2.[[89]]|*-solaris2.1?)
1561	AC_DEFINE(FD_SETSIZE, 65536,
1562		  [Solaris hack to get select_large_fdset.])
1563	;;
1564esac
1565
1566#
1567# Purify support
1568#
1569AC_MSG_CHECKING(whether to use purify)
1570AC_ARG_WITH(purify,
1571	    AS_HELP_STRING([--with-purify[=PATH]],[use Rational purify]),
1572	    use_purify="$withval", use_purify="no")
1573
1574case "$use_purify" in
1575	no)
1576		;;
1577	yes)
1578		AC_PATH_PROG(purify_path, purify, purify)
1579		;;
1580	*)
1581		purify_path="$use_purify"
1582		;;
1583esac
1584
1585case "$use_purify" in
1586	no)
1587		AC_MSG_RESULT(no)
1588		PURIFY=""
1589		;;
1590	*)
1591		if test -f "$purify_path" || test purify = "$purify_path"; then
1592			AC_MSG_RESULT($purify_path)
1593			PURIFYFLAGS="`echo $PURIFYOPTIONS`"
1594			PURIFY="$purify_path $PURIFYFLAGS"
1595		else
1596			AC_MSG_ERROR([$purify_path not found.
1597
1598Please choose the proper path with the following command:
1599
1600    configure --with-purify=PATH
1601])
1602		fi
1603		;;
1604esac
1605
1606AC_SUBST(PURIFY)
1607
1608#
1609# Google/Great Performance Tools CPU Profiler
1610#
1611AC_MSG_CHECKING(whether to use gperftools profiler)
1612AC_ARG_WITH(gperftools-profiler,
1613	    AS_HELP_STRING([--with-gperftools-profiler],
1614			   [use gperftools CPU profiler]),
1615	    use_profiler="$withval", use_profiler="no")
1616
1617case $use_profiler in
1618	yes)
1619		AC_MSG_RESULT(yes)
1620		AC_DEFINE([HAVE_GPERFTOOLS_PROFILER], 1,
1621		[Define to use gperftools CPU profiler.])
1622		LIBS="$LIBS -lprofiler"
1623		;;
1624	*)
1625		AC_MSG_RESULT(no)
1626		;;
1627esac
1628
1629#
1630# enable/disable dumping stack backtrace.  Also check if the system supports
1631# glibc-compatible backtrace() function.
1632#
1633AC_ARG_ENABLE([backtrace],
1634	      [AS_HELP_STRING([--enable-backtrace],
1635			      [log stack backtrace on abort [default=yes]])],
1636	      [], [enable_backtrace="yes"])
1637
1638AS_IF([test "$enable_backtrace" = "yes"],
1639      [AC_DEFINE([USE_BACKTRACE], [1], [define if we can use backtrace])
1640       AC_LINK_IFELSE(
1641	 [AC_LANG_PROGRAM(
1642	    [[#include <execinfo.h>]],
1643	    [[return (backtrace((void **)0, 0));]]
1644	  )],
1645	 [AC_DEFINE([HAVE_LIBCTRACE], [1], [define if system have backtrace function])]
1646       )])
1647
1648AC_ARG_ENABLE(symtable,
1649	      AS_HELP_STRING([--enable-symtable],
1650			     [use internal symbol table for backtrace
1651			      [all|minimal(default)|none]]),
1652		want_symtable="$enableval",  want_symtable="minimal")
1653case $want_symtable in
1654yes|all|minimal)     # "yes" is a hidden value equivalent to "minimal"
1655	if test "" = "$PERL"
1656	then
1657		AC_MSG_ERROR([Internal symbol table requires perl but no perl is found.
1658Install perl or explicitly disable the feature by --disable-symtable.])
1659	fi
1660	if test "yes" = "$use_libtool"; then
1661		AC_MSG_WARN([Internal symbol table does not work with libtool.  Disabling symbol table.])
1662	else
1663		# we generate the internal symbol table only for those systems
1664		# known to work to avoid unexpected build failure.  Also, warn
1665		# about unsupported systems when the feature is enabled
1666		#  manually.
1667		case $host_os in
1668		freebsd*|netbsd*|openbsd*|linux*|solaris*|darwin*)
1669			MKSYMTBL_PROGRAM="$PERL"
1670			if test "all" = "$want_symtable"; then
1671				ALWAYS_MAKE_SYMTABLE="yes"
1672			fi
1673			;;
1674		*)
1675			if test "yes" = "$want_symtable" -o "all" = "$want_symtable"
1676			then
1677				AC_MSG_WARN([this system is not known to generate internal symbol table safely; disabling it])
1678			fi
1679		esac
1680	fi
1681	;;
1682*)
1683	;;
1684esac
1685AC_SUBST(MKSYMTBL_PROGRAM)
1686AC_SUBST(ALWAYS_MAKE_SYMTABLE)
1687
1688#
1689# File name extension for static archive files, for those few places
1690# where they are treated differently from dynamic ones.
1691#
1692SA=a
1693
1694AC_SUBST(O)
1695AC_SUBST(A)
1696AC_SUBST(SA)
1697AC_SUBST(LIBTOOL_MKDEP_SED)
1698AC_SUBST(LIBTOOL_MODE_COMPILE)
1699AC_SUBST(LIBTOOL_MODE_INSTALL)
1700AC_SUBST(LIBTOOL_MODE_LINK)
1701AC_SUBST(LIBTOOL_MODE_UNINSTALL)
1702
1703BIND9_CO_RULE=".c.$O:"
1704AC_SUBST(BIND9_CO_RULE)
1705
1706#
1707# Here begins a very long section to determine the system's networking
1708# capabilities.  The order of the tests is significant.
1709#
1710
1711#
1712# We do the IPv6 compilation checking after libtool so that we can put
1713# the right suffix on the files.
1714#
1715AC_MSG_CHECKING([for IPv6 structures])
1716AC_COMPILE_IFELSE(
1717  [AC_LANG_PROGRAM(
1718     [[
1719       #include <sys/types.h>
1720       #include <sys/socket.h>
1721       #include <netinet/in.h>
1722     ]],
1723     [[
1724       struct sockaddr_in6 sin6;
1725       struct in6_addr in6;
1726       struct in6_pktinfo in6_pi;
1727       struct sockaddr_storage storage;
1728       in6 = in6addr_any;
1729       in6 = in6addr_loopback;
1730       sin6.sin6_scope_id = 0;
1731       return (0);
1732     ]])],
1733  [AC_MSG_RESULT([yes])],
1734  [AC_MSG_FAILURE([IPv6 support is mandatory])])
1735
1736#
1737# Allow forcibly disabling TCP Fast Open support as autodetection might yield
1738# confusing results on some systems (e.g. FreeBSD; see set_tcp_fastopen()
1739# comment in lib/isc/unix/socket.c).
1740#
1741
1742AC_ARG_ENABLE([tcp_fastopen],
1743	      [AS_HELP_STRING([--disable-tcp-fastopen],
1744			      [disable TCP Fast Open support [default=yes]])],
1745	     [], [enable_tcp_fastopen="yes"])
1746
1747AS_IF([test "$enable_tcp_fastopen" = "yes"],
1748      [AC_DEFINE([ENABLE_TCP_FASTOPEN], [1], [define if you want TCP_FASTOPEN enabled if available])])
1749
1750#
1751# Check for some other useful functions that are not ever-present.
1752#
1753AC_CHECK_FUNCS([strlcpy strlcat])
1754
1755AC_SUBST(READLINE_LIB)
1756AC_ARG_WITH(readline,
1757	    AS_HELP_STRING([--with-readline[=LIBSPEC]],
1758			   [specify readline library [default auto]]),
1759	    use_readline="$withval", use_readline="auto")
1760case "$use_readline" in
1761no)	;;
1762*)
1763	saved_LIBS="$LIBS"
1764	case "$use_readline" in
1765	yes|auto) try_readline="-ledit"; or_readline="-lreadline" ;;
1766	*) try_readline="$use_readline"
1767	esac
1768	for readline in "$try_readline" $or_readline
1769	do
1770		LIBS="$readline"
1771		AC_MSG_NOTICE(checking for readline with $readline)
1772		AC_CHECK_FUNCS(readline)
1773		if test "yes" = "$ac_cv_func_readline"
1774		then
1775			READLINE_LIB="$readline"
1776			break
1777		fi
1778		for lib in -lterminfo -ltermcap -lncurses -lcurses
1779		do
1780			AC_MSG_NOTICE(checking for readline with $readline $lib)
1781			unset ac_cv_func_readline
1782			LIBS="$readline $lib"
1783			AC_CHECK_FUNCS(readline)
1784			if test "yes" = "$ac_cv_func_readline"
1785			then
1786				READLINE_LIB="$readline $lib"
1787				break
1788			fi
1789		done
1790		if test "yes" = "$ac_cv_func_readline"
1791		then
1792			break
1793		fi
1794	done
1795	if test "auto" != "$use_readline" &&
1796	   test "X$READLINE_LIB" = "X"
1797	then
1798		AC_MSG_ERROR([The readline library was not found.])
1799	fi
1800	LIBS="$saved_LIBS"
1801	;;
1802esac
1803if test "yes" = "$ac_cv_func_readline"
1804then
1805	case "$READLINE_LIB" in
1806	*edit*)
1807		AC_CHECK_HEADERS(editline/readline.h)
1808		AC_CHECK_HEADERS(edit/readline/readline.h)
1809		AC_CHECK_HEADERS(edit/readline/history.h)
1810		;;
1811	esac
1812	AC_CHECK_HEADERS(readline/readline.h)
1813	AC_CHECK_HEADERS(readline/history.h)
1814fi
1815
1816#
1817# Use our own SPNEGO implementation?
1818#
1819AC_ARG_ENABLE(isc-spnego,
1820	      AS_HELP_STRING([--disable-isc-spnego],
1821			     [use SPNEGO from GSSAPI library]))
1822
1823if test -n "$USE_GSSAPI"
1824then
1825	case "$enable_isc_spnego" in
1826		yes|'')
1827			USE_ISC_SPNEGO='-DUSE_ISC_SPNEGO'
1828			DST_EXTRA_OBJS="$DST_EXTRA_OBJS spnego.$O"
1829			DST_EXTRA_SRCS="$DST_EXTRA_SRCS spnego.c"
1830			AC_MSG_RESULT(using SPNEGO from lib/dns)
1831			;;
1832		no)
1833			AC_MSG_RESULT(using SPNEGO from GSSAPI library)
1834			;;
1835	esac
1836fi
1837
1838AC_SUBST(USE_ISC_SPNEGO)
1839
1840AC_SUBST(DST_EXTRA_OBJS)
1841AC_SUBST(DST_EXTRA_SRCS)
1842
1843#
1844# Security Stuff
1845#
1846# Note it is very recommended to *not* disable chroot(),
1847# this is only because chroot() was made obsolete by Posix.
1848AC_ARG_ENABLE(chroot, AS_HELP_STRING([--disable-chroot], [disable chroot]))
1849case "$enable_chroot" in
1850	yes|'')
1851		AC_CHECK_FUNCS(chroot)
1852		;;
1853	no)
1854		;;
1855esac
1856
1857LIBCAP_LIBS=""
1858AC_MSG_CHECKING([whether to enable Linux capabilities])
1859AC_ARG_ENABLE([linux-caps],
1860	      [AS_HELP_STRING([--disable-linux-caps],
1861			      [disable Linux capabilities])],
1862	      [],
1863	      [AS_CASE([$host],
1864		       [*-linux*],[enable_linux_caps=yes],
1865		       [enable_linux_caps=no])])
1866
1867AS_IF([test "$enable_linux_caps" = "yes"],
1868      [AC_MSG_RESULT([yes])
1869       AC_CHECK_HEADERS([sys/capability.h],
1870			[],
1871			[AC_MSG_ERROR(m4_normalize([sys/capability.h header is required for Linux capabilities support.
1872						    Either install libcap or use --disable-linux-caps.]))])
1873       save_LIBS="$LIBS"
1874       AC_SEARCH_LIBS([cap_set_proc], [cap],
1875		      [LIBCAP_LIBS="$ac_cv_search_cap_set_proc"],
1876		      [AC_MSG_ERROR(m4_normalize([libcap is required for Linux capabilities support.
1877						  Either install libcap or use --disable-linux-caps.]))])
1878       LIBS="$save_LIBS"],
1879      [AC_MSG_RESULT([no])])
1880AC_SUBST([LIBCAP_LIBS])
1881
1882AC_CHECK_HEADERS(sys/un.h,
1883ISC_PLATFORM_HAVESYSUNH="#define ISC_PLATFORM_HAVESYSUNH 1"
1884,
1885ISC_PLATFORM_HAVESYSUNH="#undef ISC_PLATFORM_HAVESYSUNH"
1886)
1887AC_SUBST(ISC_PLATFORM_HAVESYSUNH)
1888
1889case "$host" in
1890*-solaris*)
1891	AC_DEFINE(NEED_SECURE_DIRECTORY, 1,
1892		  [Define if connect does not honour the permission on the UNIX domain socket.])
1893	;;
1894esac
1895
1896#
1897# Time Zone Stuff
1898#
1899AC_CHECK_FUNCS([tzset])
1900
1901AC_MSG_CHECKING(for optarg declaration)
1902AC_TRY_COMPILE([
1903#include <unistd.h>
1904],
1905[optarg = 0;],
1906[AC_MSG_RESULT(yes)],
1907[AC_MSG_RESULT(no)
1908GEN_NEED_OPTARG="-DNEED_OPTARG=1"
1909AC_DEFINE(NEED_OPTARG, 1, [Defined if extern char *optarg is not declared.])])
1910
1911#
1912# Check for nanoseconds in file stats
1913#
1914AC_MSG_CHECKING([for st_mtim.tv_nsec])
1915AC_COMPILE_IFELSE(
1916  [AC_LANG_PROGRAM(
1917     [[#include <sys/fcntl.h>]],
1918     [[struct stat s;
1919       return(s.st_mtim.tv_nsec);
1920      ]])],
1921   [AC_DEFINE([HAVE_STAT_NSEC], [1], [define if struct stat has st_mtim.tv_nsec field])])
1922
1923#
1924# Check for if_nametoindex() for IPv6 scoped addresses support
1925#
1926AC_CHECK_FUNCS([if_nametoindex])
1927
1928AC_CHECK_FUNCS(nanosleep usleep explicit_bzero)
1929
1930ISC_ATOMIC_LIBS=""
1931AC_CHECK_HEADERS(
1932  [stdatomic.h],
1933  [AC_MSG_CHECKING([for memory model aware atomic operations])
1934   AC_COMPILE_IFELSE(
1935     [AC_LANG_PROGRAM(
1936	[[#include <stdatomic.h>]],
1937	[[atomic_int_fast32_t val = 0; atomic_fetch_add_explicit(&val, 1, memory_order_relaxed);]]
1938      )],
1939     [AC_MSG_RESULT([stdatomic.h])
1940      AC_MSG_CHECKING([whether -latomic is needed for 64-bit stdatomic.h functions])
1941      AC_LINK_IFELSE(
1942	[AC_LANG_PROGRAM(
1943	   [[#include <stdatomic.h>]],
1944	   [[atomic_int_fast64_t val = 0; atomic_fetch_add_explicit(&val, 1, memory_order_relaxed);]]
1945	 )],
1946	[AC_MSG_RESULT([no])],
1947	[ISC_ATOMIC_LIBS="-latomic"
1948	 save_LIBS="$LIBS"
1949	 LIBS="$LIBS $ISC_ATOMIC_LIBS"
1950	 AC_LINK_IFELSE(
1951	   [AC_LANG_PROGRAM(
1952	      [[#include <stdatomic.h>]],
1953	      [[atomic_int_fast64_t val = 0; atomic_fetch_add_explicit(&val, 1, memory_order_relaxed);]]
1954	    )],
1955	   [AC_MSG_RESULT([yes])],
1956	   [AC_MSG_FAILURE([libatomic needed, but linking with -latomic failed, please fix your toolchain.])])
1957	 LIBS="$save_LIBS"
1958	])
1959     ],
1960     [AC_MSG_FAILURE([stdatomic.h header found, but compilation failed, please fix your toolchain.])]
1961   )],
1962  [AC_MSG_CHECKING([for memory model aware atomic operations])
1963   AC_COMPILE_IFELSE(
1964     [AC_LANG_PROGRAM(
1965	[[#include <inttypes.h>]],
1966	[[int32_t val = 0; __atomic_fetch_add(&val, 1, __ATOMIC_RELAXED);]]
1967      )],
1968     [AC_MSG_RESULT([__atomic builtins])
1969      AC_DEFINE([HAVE___ATOMIC], [1], [define if __atomic builtins are not available])
1970      AC_MSG_CHECKING([whether -latomic is needed for 64-bit __atomic builtins])
1971      AC_LINK_IFELSE(
1972	[AC_LANG_PROGRAM(
1973	   [[#include <inttypes.h>]],
1974	   [[int64_t val = 0; __atomic_fetch_add(&val, 1, __ATOMIC_RELAXED);]]
1975	 )],
1976	[AC_MSG_RESULT([no])],
1977	[ISC_ATOMIC_LIBS="-latomic"
1978	 save_LIBS="$LIBS"
1979	 LIBS="$LIBS $ISC_ATOMIC_LIBS"
1980	 AC_LINK_IFELSE(
1981	   [AC_LANG_PROGRAM(
1982	      [[#include <inttypes.h>]],
1983	      [[int64_t val = 0; __atomic_fetch_add(&val, 1, __ATOMIC_RELAXED);]]
1984	    )],
1985	   [AC_MSG_RESULT([yes])],
1986	   [AC_MSG_FAILURE([libatomic needed, but linking with -latomic failed, please fix your toolchain.])])
1987	 LIBS="$save_LIBS"
1988	])
1989     ],
1990     [AC_MSG_RESULT([__sync builtins])
1991     ])
1992  ])
1993LIBS="$LIBS $ISC_ATOMIC_LIBS"
1994
1995AC_CHECK_HEADERS([uchar.h])
1996
1997#
1998# Check for __builtin_unreachable
1999#
2000AC_MSG_CHECKING([compiler support for __builtin_unreachable()])
2001AC_LINK_IFELSE(
2002  [AC_LANG_PROGRAM(
2003     [[]],
2004     [[__builtin_unreachable();]]
2005   )],
2006  [AC_MSG_RESULT([yes])
2007   AC_DEFINE([HAVE_BUILTIN_UNREACHABLE], [1], [define if the compiler supports __builtin_unreachable().])
2008  ],
2009  [AC_MSG_RESULT([no])
2010  ])
2011
2012#
2013# Check for __builtin_expect
2014#
2015AC_MSG_CHECKING([compiler support for __builtin_expect])
2016AC_TRY_LINK(, [
2017	return (__builtin_expect(1, 1) ? 1 : 0);
2018], [
2019	have_builtin_expect=yes
2020	AC_MSG_RESULT(yes)
2021], [
2022	have_builtin_expect=no
2023	AC_MSG_RESULT(no)
2024])
2025if test "yes" = "$have_builtin_expect"; then
2026	AC_DEFINE(HAVE_BUILTIN_EXPECT, 1, [Define to 1 if the compiler supports __builtin_expect.])
2027fi
2028
2029#
2030# Check for __builtin_clz
2031#
2032AC_MSG_CHECKING([compiler support for __builtin_clz])
2033AC_TRY_LINK(, [
2034	return (__builtin_clz(0xff) == 24 ? 1 : 0);
2035], [
2036	have_builtin_clz=yes
2037	AC_MSG_RESULT(yes)
2038], [
2039	have_builtin_clz=no
2040	AC_MSG_RESULT(no)
2041])
2042if test "yes" = "$have_builtin_clz"; then
2043	AC_DEFINE(HAVE_BUILTIN_CLZ, 1, [Define to 1 if the compiler supports __builtin_clz.])
2044fi
2045
2046#
2047# Activate "rrset-order fixed" or not?
2048#
2049AC_ARG_ENABLE(fixed-rrset,
2050	      AS_HELP_STRING([--enable-fixed-rrset],
2051			     [enable fixed rrset ordering [default=no]]),
2052	      enable_fixed="$enableval", enable_fixed="no")
2053case "$enable_fixed" in
2054	yes)
2055		AC_DEFINE(DNS_RDATASET_FIXED, 1,
2056			  [Define to enable "rrset-order fixed" syntax.])
2057		;;
2058	no)
2059		;;
2060	*)
2061		;;
2062esac
2063
2064#
2065# Activate dnstap?
2066#
2067AC_ARG_ENABLE(dnstap,
2068	      AS_HELP_STRING([--enable-dnstap],
2069			     [enable dnstap support
2070				(requires fstrm, protobuf-c)]),
2071	      use_dnstap=$enableval, use_dnstap=no)
2072
2073DNSTAP=
2074DNSTAPSRCS=
2075DNSTAPOBJS=
2076DNSTAPTARGETS=
2077if test "x$use_dnstap" != "xno"; then
2078	AC_ARG_WITH([protobuf-c],
2079		    AS_HELP_STRING([--with-protobuf-c=path],
2080				   [Path where protobuf-c is installed, for dnstap]), [
2081	    # workaround for protobuf-c includes at old dir
2082	    # before protobuf-c-1.0.0
2083	    if test -f $withval/include/google/protobuf-c/protobuf-c.h
2084	    then
2085		CFLAGS="$CFLAGS -I$withval/include/google"
2086	    else
2087		CFLAGS="$CFLAGS -I$withval/include"
2088	    fi
2089	    LDFLAGS="$LDFLAGS -L$withval/lib"
2090	    AC_PATH_PROG([PROTOC_C], [protoc-c], [],
2091			 [$PATH$PATH_SEPARATOR$withval/bin])
2092	], [
2093	    # workaround for protobuf-c includes at old dir
2094	    # before protobuf-c-1.0.0
2095	    if test -f /usr/include/google/protobuf-c/protobuf-c.h
2096	    then
2097		CFLAGS="$CFLAGS -I/usr/include/google"
2098	    else
2099		if test -f /usr/local/include/google/protobuf-c/protobuf-c.h
2100		then
2101		    CFLAGS="$CFLAGS -I/usr/local/include/google"
2102		    LDFLAGS="$LDFLAGS -L/usr/local/lib"
2103		fi
2104	    fi
2105	    AC_PATH_PROG([PROTOC_C],[protoc-c])
2106	])
2107	if test -z "$PROTOC_C"; then
2108		AC_MSG_ERROR([The protoc-c program was not found.])
2109	fi
2110	AC_ARG_WITH([libfstrm], AS_HELP_STRING([--with-libfstrm=path],
2111		    [Path where libfstrm is installed, for dnstap]), [
2112	    CFLAGS="$CFLAGS -I$withval/include"
2113	    LDFLAGS="$LDFLAGS -L$withval/lib"
2114	    AC_PATH_PROG([FSTRM_CAPTURE], [fstrm_capture], [], [$PATH$PATH_SEPARATOR$withval/bin])
2115	],[
2116	    AC_PATH_PROG([FSTRM_CAPTURE], [fstrm_capture])
2117	])
2118
2119	AC_SEARCH_LIBS([fstrm_iothr_init], [fstrm], [],
2120		       AC_MSG_ERROR([The fstrm library was not found. Please install fstrm!]))
2121	AC_SEARCH_LIBS([protobuf_c_message_pack], [protobuf-c], [],
2122		       AC_MSG_ERROR([The protobuf-c library was not found. Please install protobuf-c!]))
2123
2124	AC_DEFINE(HAVE_DNSTAP, 1, [Define to 1 to enable dnstap support])
2125	DNSTAP=dnstap
2126	DNSTAPSRCS='${DNSTAPSRCS}'
2127	DNSTAPOBJS='${DNSTAPOBJS}'
2128	DNSTAPTARGETS='${DNSTAPTARGETS}'
2129fi
2130AC_SUBST(DNSTAP)
2131AC_SUBST(DNSTAPSRCS)
2132AC_SUBST(DNSTAPOBJS)
2133AC_SUBST(DNSTAPTARGETS)
2134
2135#
2136#  The following sets up how non-blocking i/o is established.
2137#  cygwin and solaris 2.x (x<5) require special handling.
2138#
2139case "$host" in
2140*-cygwin*) AC_DEFINE(PORT_NONBLOCK, O_NDELAY);;
2141*-solaris2.[[01234]])
2142	AC_DEFINE(PORT_NONBLOCK, O_NONBLOCK)
2143	AC_DEFINE(USE_FIONBIO_IOCTL, 1,
2144		  [Defined if you need to use ioctl(FIONBIO) instead a fcntl call to make non-blocking.])
2145	;;
2146*) AC_DEFINE(PORT_NONBLOCK, O_NONBLOCK,
2147	     [Sets which flag to pass to open/fcntl to make non-blocking (O_NDELAY/O_NONBLOCK).])
2148	;;
2149esac
2150#
2151# Solaris 2.5.1 and earlier cannot bind() then connect() a TCP socket.
2152# This prevents the source address being set.
2153#
2154case "$host" in
2155*-solaris2.[[012345]]|*-solaris2.5.1)
2156	AC_DEFINE(BROKEN_TCP_BIND_BEFORE_CONNECT, 1,
2157		  [Define if you cannot bind() before connect() for TCP sockets.])
2158	;;
2159esac
2160#
2161# The following sections deal with tools used for formatting
2162# the documentation.  They are all optional, unless you are
2163# a developer editing the documentation source.
2164#
2165
2166#
2167# Look for TeX.
2168#
2169
2170AC_PATH_PROGS(LATEX, latex, latex)
2171AC_SUBST(LATEX)
2172
2173AC_PATH_PROGS(PDFLATEX, pdflatex, pdflatex)
2174AC_SUBST(PDFLATEX)
2175
2176AC_PATH_PROGS(DBLATEX, dblatex, dblatex)
2177AC_SUBST(DBLATEX)
2178
2179#
2180# Look for w3m
2181#
2182
2183AC_PATH_PROGS(W3M, w3m, w3m)
2184AC_SUBST(W3M)
2185
2186#
2187# Look for pandoc
2188#
2189AC_PATH_PROG(PANDOC, pandoc, pandoc)
2190AC_SUBST(PANDOC)
2191
2192
2193#
2194# Look for xsltproc (libxslt)
2195#
2196
2197AC_PATH_PROG(XSLTPROC, xsltproc, xsltproc)
2198AC_SUBST(XSLTPROC)
2199
2200#
2201# Look for xmllint (libxml2)
2202#
2203
2204AC_PATH_PROG(XMLLINT, xmllint, xmllint)
2205AC_SUBST(XMLLINT)
2206
2207#
2208# Look for Doxygen
2209#
2210
2211AC_PATH_PROG(DOXYGEN, doxygen, doxygen)
2212AC_SUBST(DOXYGEN)
2213
2214#
2215# Look for curl
2216#
2217
2218AC_PATH_PROG(CURL, curl, curl)
2219AC_SUBST(CURL)
2220
2221#
2222# Subroutine for searching for an ordinary file (e.g., a stylesheet)
2223# in a number of directories:
2224#
2225#   NOM_PATH_FILE(VARIABLE, FILENAME, DIRECTORIES)
2226#
2227# If the file FILENAME is found in one of the DIRECTORIES, the shell
2228# variable VARIABLE is defined to its absolute pathname.  Otherwise,
2229# it is set to FILENAME, with no directory prefix (that's not terribly
2230# useful, but looks less confusing in substitutions than leaving it
2231# empty).  The variable VARIABLE will be substituted into output files.
2232#
2233
2234AC_DEFUN([NOM_PATH_FILE], [
2235$1=""
2236AC_MSG_CHECKING(for $2)
2237for d in $3
2238do
2239	f=$d/$2
2240	if test -f $f
2241	then
2242		$1=$f
2243		AC_MSG_RESULT($f)
2244		break
2245	fi
2246done
2247if test "X[$]$1" = "X"
2248then
2249	AC_MSG_RESULT("not found");
2250	$1=$2
2251fi
2252AC_SUBST($1)
2253])
2254
2255#
2256# Look for Docbook-XSL stylesheets.  Location probably varies by system.
2257# If it's not explicitly specified, guess where it might be found, based on
2258# where SGML stuff lives on some systems (FreeBSD is the only one we're sure
2259# of at the moment).
2260#
2261AC_MSG_CHECKING(for Docbook-XSL path)
2262AC_ARG_WITH(docbook-xsl,
2263	    AS_HELP_STRING([--with-docbook-xsl[=PATH]],
2264			   [specify path for Docbook-XSL stylesheets]),
2265   docbook_path="$withval", docbook_path="auto")
2266case "$docbook_path" in
2267auto)
2268	AC_MSG_RESULT(auto)
2269	docbook_xsl_trees="/usr/pkg/share/xsl/docbook /usr/local/share/xsl/docbook-ns /usr/local/share/xsl/docbook /usr/share/xsl/docbook /opt/local/share/xsl/docbook-xsl /opt/local/share/xsl/docbook-xsl-nons /usr/share/xml/docbook/stylesheet/docbook-xsl"
2270	;;
2271*)
2272	docbook_xsl_trees="$withval"
2273	AC_MSG_RESULT($docbook_xsl_trees)
2274	;;
2275esac
2276
2277#
2278# Look for stylesheets we need.
2279#
2280
2281NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_HTML, html/docbook.xsl, $docbook_xsl_trees)
2282NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_XHTML, xhtml/docbook.xsl, $docbook_xsl_trees)
2283NOM_PATH_FILE(XSLT_DOCBOOK_STYLE_MAN, manpages/docbook.xsl, $docbook_xsl_trees)
2284NOM_PATH_FILE(XSLT_DOCBOOK_CHUNK_HTML, html/chunk.xsl, $docbook_xsl_trees)
2285NOM_PATH_FILE(XSLT_DOCBOOK_CHUNK_XHTML, xhtml/chunk.xsl, $docbook_xsl_trees)
2286NOM_PATH_FILE(XSLT_DOCBOOK_CHUNKTOC_HTML, html/chunktoc.xsl, $docbook_xsl_trees)
2287NOM_PATH_FILE(XSLT_DOCBOOK_CHUNKTOC_XHTML, xhtml/chunktoc.xsl, $docbook_xsl_trees)
2288NOM_PATH_FILE(XSLT_DOCBOOK_MAKETOC_HTML, html/maketoc.xsl, $docbook_xsl_trees)
2289NOM_PATH_FILE(XSLT_DOCBOOK_MAKETOC_XHTML, xhtml/maketoc.xsl, $docbook_xsl_trees)
2290
2291#
2292# Same dance for dblatex
2293#
2294dblatex_xsl_trees="/usr/local/share/xml/docbook/stylesheet/dblatex /usr/pkg/share/xml/docbook/stylesheet/dblatex /usr/share/xml/docbook/stylesheet/dblatex"
2295NOM_PATH_FILE(XSLT_DBLATEX_STYLE, xsl/docbook.xsl, $dblatex_xsl_trees)
2296NOM_PATH_FILE(XSLT_DBLATEX_FASTBOOK, xsl/latex_book_fast.xsl, $dblatex_xsl_trees)
2297
2298#
2299# IDN support using libidn2
2300#
2301
2302LIBIDN2_CFLAGS=
2303LIBIDN2_LDFLAGS=
2304LIBIDN2_LIBS=
2305AC_ARG_WITH([libidn2],
2306	    [AS_HELP_STRING([--with-libidn2[=PATH]], [enable IDN support using GNU libidn2 [yes|no(default)|path]])],
2307	    [with_libidn2="$withval"], [with_libidn2="no"])
2308AS_CASE([$with_libidn2],
2309	[yes],	[PKG_CHECK_MODULES([LIBIDN2], [libidn2],
2310				   [AC_DEFINE([HAVE_LIBIDN2], [1], [Define if libidn2 was found])])],
2311	[no],	[],
2312	[*],	[save_CFLAGS="$CFLAGS"
2313		 save_CPPFLAGS="$CPPFLAGS"
2314		 save_LDFLAGS="$LDFLAGS"
2315		 save_LIBS="$LIBS"
2316		 LIBIDN2_CFLAGS="-I$with_libidn2/include"
2317		 LIBIDN2_LDFLAGS="-L$with_libidn2/lib"
2318		 CFLAGS="$LIBIDN2_CFLAGS $CFLAGS"
2319		 CPPFLAGS="$LIBIDN2_CFLAGS $CPPFLAGS"
2320		 LDFLAGS="$LIBIDN2_LDFLAGS $LDFLAGS"
2321		 AC_CHECK_HEADERS([idn2.h],
2322				  [],
2323				  [AC_MSG_ERROR([idn2.h not found])])
2324		 AC_SEARCH_LIBS([idn2_to_ascii_lz], [idn2],
2325				[LIBIDN2_LIBS="$ac_cv_search_idn2_to_ascii_lz"
2326				 AC_DEFINE([HAVE_LIBIDN2], [1], [Define if libidn2 was found])],
2327				[AC_MSG_ERROR([libidn2 requested, but not found])])
2328		 CFLAGS="$save_CFLAGS"
2329		 CPPFLAGS="$save_CPPFLAGS"
2330		 LDFLAGS="$save_LDFLAGS"
2331		 LIBS="$save_LIBS"])
2332AC_SUBST([LIBIDN2_CFLAGS])
2333AC_SUBST([LIBIDN2_LDFLAGS])
2334AC_SUBST([LIBIDN2_LIBS])
2335
2336#
2337# Check whether to build with cmocka unit testing framework
2338#
2339
2340AC_ARG_WITH([cmocka],
2341	    [AS_HELP_STRING([--with-cmocka=detect],[enable CMocka based tests (default is detect)])],
2342	    [],[with_cmocka=detect])
2343
2344AS_CASE([$with_cmocka],
2345	[no],[],
2346	[detect],[PKG_CHECK_MODULES([CMOCKA], [cmocka >= 1.0.0],
2347				    [AC_DEFINE([HAVE_CMOCKA], [1], [Use CMocka])
2348				     UNITTESTS=tests],[with_cmocka=no])],
2349	[yes],[PKG_CHECK_MODULES([CMOCKA], [cmocka >= 1.0.0],
2350				 [AC_DEFINE([HAVE_CMOCKA], [1], [Use CMocka])])
2351	                          UNITTESTS=tests],
2352	[AC_MSG_ERROR([Use PKG_CONFIG_PATH to specify path to CMocka library])]
2353       )
2354AC_SUBST([CMOCKA_CFLAGS])
2355AC_SUBST([CMOCKA_LIBS])
2356AC_SUBST(UNITTESTS)
2357
2358#
2359# Check for kyua execution engine if CMocka was requested
2360# and bail out if execution engine was not found
2361#
2362AC_ARG_VAR([KYUA], [path to kyua execution engine])
2363AS_IF([test "$with_cmocka" != "no"],
2364      [AC_PATH_PROGS([KYUA], [kyua], [])
2365       AS_IF([test -z "$KYUA"],
2366            [AC_MSG_WARN([kyua test execution engine not found])])])
2367
2368AC_SUBST([KYUA])
2369
2370#
2371# Check for -Wl,--wrap= support
2372#
2373
2374save_LDFLAGS=$LDFLAGS
2375LDFLAGS="--wrap=printf"
2376
2377LD_WRAP_TESTS=false
2378enable_ld_wrap=no
2379AC_MSG_CHECKING([for linker support for --wrap option])
2380AC_LINK_IFELSE(
2381    [AC_LANG_PROGRAM([#include <stdio.h>], [__wrap_printf("success"); return (0);])],
2382    [enable_ld_wrap=yes
2383     LD_WRAP_TESTS=true
2384     AC_DEFINE([LD_WRAP], [1], [define if the linker supports --wrap option])
2385     AC_MSG_RESULT([yes])],
2386    [AC_MSG_RESULT([no])])
2387# AM_CONDITIONAL([LD_WRAP], [test $enable_ld_wrap = yes])
2388AC_SUBST([LD_WRAP_TESTS])
2389
2390LDFLAGS=$save_LDFLAGS
2391
2392#
2393# Check for i18n
2394#
2395AC_CHECK_HEADERS(locale.h)
2396AC_CHECK_FUNCS(setlocale)
2397
2398#
2399# was --with-tuning specified?
2400#
2401AC_ARG_WITH(tuning,
2402	    AS_HELP_STRING([--with-tuning=ARG],
2403			   [Specify server tuning (large or default)]),
2404	    use_tuning="$withval", use_tuning="no")
2405
2406case "$use_tuning" in
2407	large)
2408		AC_DEFINE(TUNE_LARGE, 1, [Define to use large-system tuning.])
2409		AC_MSG_RESULT(using large-system tuning)
2410		;;
2411	no|default)
2412		AC_MSG_RESULT(using default tuning)
2413		;;
2414	yes|*)
2415		AC_MSG_ERROR([You must specify "large" or "default" for --with-tuning.])
2416		;;
2417esac
2418
2419#
2420# was --enable-querytrace specified?
2421#
2422AC_ARG_ENABLE(querytrace,
2423	      AS_HELP_STRING([--enable-querytrace],
2424			     [enable very verbose query trace logging
2425				[default=no]]),
2426	      want_querytrace="$enableval", want_querytrace="no")
2427
2428AC_MSG_CHECKING([whether to enable query trace logging])
2429case "$want_querytrace" in
2430yes)
2431	AC_MSG_RESULT(yes)
2432	AC_DEFINE(WANT_QUERYTRACE, 1, [Define to enable very verbose query trace logging.])
2433	;;
2434no)
2435	AC_MSG_RESULT(no)
2436	;;
2437*)
2438	AC_MSG_ERROR("--enable-querytrace requires yes or no")
2439	;;
2440esac
2441
2442#
2443# Was --disable-auto-validation specified?
2444#
2445validation_default=auto
2446AC_ARG_ENABLE(auto-validation,
2447	      AS_HELP_STRING([--enable-auto-validation],
2448			     [turn on DNSSEC validation by default, using the IANA root key [default=yes]]),
2449	      [:],[enable_auto_validation=yes])
2450AS_IF([test "$enable_auto_validation" = "no"],[validation_default=yes])
2451AC_DEFINE_UNQUOTED([VALIDATION_DEFAULT], ["$validation_default"], [the default value of dnssec-validation option])
2452
2453#
2454# Substitutions
2455#
2456AC_SUBST(BIND9_TOP_BUILDDIR)
2457BIND9_TOP_BUILDDIR=`pwd`
2458
2459AC_SUBST(BIND9_ISC_BUILDINCLUDE)
2460AC_SUBST(BIND9_ISCCC_BUILDINCLUDE)
2461AC_SUBST(BIND9_ISCCFG_BUILDINCLUDE)
2462AC_SUBST(BIND9_DNS_BUILDINCLUDE)
2463AC_SUBST(BIND9_NS_BUILDINCLUDE)
2464AC_SUBST(BIND9_BIND9_BUILDINCLUDE)
2465AC_SUBST(BIND9_IRS_BUILDINCLUDE)
2466if test "X$srcdir" != "X"; then
2467	BIND9_ISC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isc/include"
2468	BIND9_ISCCC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccc/include"
2469	BIND9_ISCCFG_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccfg/include"
2470	BIND9_DNS_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/dns/include"
2471	BIND9_NS_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/ns/include"
2472	BIND9_BIND9_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/bind9/include"
2473	BIND9_IRS_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/irs/include"
2474else
2475	BIND9_ISC_BUILDINCLUDE=""
2476	BIND9_ISCCC_BUILDINCLUDE=""
2477	BIND9_ISCCFG_BUILDINCLUDE=""
2478	BIND9_DNS_BUILDINCLUDE=""
2479	BIND9_NS_BUILDINCLUDE=""
2480	BIND9_BIND9_BUILDINCLUDE=""
2481	BIND9_IRS_BUILDINCLUDE=""
2482fi
2483
2484AC_SUBST_FILE(BIND9_MAKE_INCLUDES)
2485BIND9_MAKE_INCLUDES=$BIND9_TOP_BUILDDIR/make/includes
2486
2487AC_SUBST_FILE(BIND9_MAKE_RULES)
2488BIND9_MAKE_RULES=$BIND9_TOP_BUILDDIR/make/rules
2489
2490. "$srcdir/version"
2491BIND9_PRODUCT="PRODUCT=\"${PRODUCT}\""
2492AC_SUBST(BIND9_PRODUCT)
2493BIND9_DESCRIPTION="DESCRIPTION=\"${DESCRIPTION}\""
2494AC_SUBST(BIND9_DESCRIPTION)
2495BIND9_VERSION="${MAJORVER}.${MINORVER}${PATCHVER:+.}${PATCHVER}${RELEASETYPE}${RELEASEVER}${EXTENSIONS}"
2496AC_SUBST(BIND9_VERSION)
2497BIND9_MAJOR="MAJOR=${MAJORVER}.${MINORVER}"
2498AC_SUBST(BIND9_MAJOR)
2499BIND9_VERSIONSTRING="${PRODUCT} ${MAJORVER}.${MINORVER}${PATCHVER:+.}${PATCHVER}${RELEASETYPE}${RELEASEVER}${EXTENSIONS}${DESCRIPTION:+ }${DESCRIPTION}"
2500AC_SUBST(BIND9_VERSIONSTRING)
2501BIND9_VERSIONSHORT="${PRODUCT} ${MAJORVER}.${MINORVER}${PATCHVER:+.}${PATCHVER}${RELEASETYPE}${RELEASEVER}${EXTENSIONS}"
2502AC_SUBST(BIND9_VERSIONSHORT)
2503
2504BIND9_SRCID="SRCID=unset_id"
2505if test -f "${srcdir}/srcid"; then
2506	. "${srcdir}/srcid"
2507	BIND9_SRCID="SRCID=$SRCID"
2508elif test -d "${srcdir}/.git"; then
2509	BIND9_SRCID="SRCID="`(cd "${srcdir}";git rev-parse --short HEAD)`
2510fi
2511
2512AC_SUBST(BIND9_SRCID)
2513
2514if test -z "$ac_configure_args"; then
2515	BIND9_CONFIGARGS="defaults"
2516else
2517	for a in $ac_configure_args
2518	do
2519		BIND9_CONFIGARGS="$BIND9_CONFIGARGS $a"
2520	done
2521fi
2522BIND9_CONFIGARGS="`echo $BIND9_CONFIGARGS | sed 's/^ //'`"
2523BIND9_CONFIGARGS="CONFIGARGS=${BIND9_CONFIGARGS}"
2524AC_SUBST(BIND9_CONFIGARGS)
2525
2526AC_SUBST_FILE(LIBISC_API)
2527LIBISC_API="$srcdir/lib/isc/api"
2528
2529AC_SUBST_FILE(LIBISCCC_API)
2530LIBISCCC_API="$srcdir/lib/isccc/api"
2531
2532AC_SUBST_FILE(LIBISCCFG_API)
2533LIBISCCFG_API="$srcdir/lib/isccfg/api"
2534
2535AC_SUBST_FILE(LIBDNS_API)
2536LIBDNS_API="$srcdir/lib/dns/api"
2537
2538AC_SUBST_FILE(LIBDNS_MAPAPI)
2539LIBDNS_MAPAPI="$srcdir/lib/dns/mapapi"
2540
2541AC_SUBST_FILE(LIBBIND9_API)
2542LIBBIND9_API="$srcdir/lib/bind9/api"
2543
2544AC_SUBST_FILE(LIBIRS_API)
2545LIBIRS_API="$srcdir/lib/irs/api"
2546
2547AC_SUBST_FILE(LIBNS_API)
2548LIBNS_API="$srcdir/lib/ns/api"
2549
2550#
2551# Configure any DLZ drivers.
2552#
2553# If config.dlz.in selects one or more DLZ drivers, it will set
2554# CONTRIB_DLZ to a non-empty value, which will be our clue to
2555# build DLZ drivers in contrib.
2556#
2557# This section has to come after the libtool stuff because it needs to
2558# know how to name the driver object files.
2559#
2560
2561CONTRIB_DLZ=""
2562DLZ_DRIVER_INCLUDES=""
2563DLZ_DRIVER_LIBS=""
2564DLZ_DRIVER_SRCS=""
2565DLZ_DRIVER_OBJS=""
2566DLZ_SYSTEM_TEST=""
2567DLZ_DRIVER_MYSQL_INCLUDES=""
2568DLZ_DRIVER_MYSQL_LIBS=""
2569
2570#
2571# Configure support for building a shared library object
2572#
2573# Even when libtool is available it can't always be relied upon
2574# to build an object that can be dlopen()'ed, but this is necessary
2575# for building the dlzexternal system test, so we'll try it the
2576# old-fashioned way.
2577#
2578SO="so"
2579SO_CFLAGS=""
2580SO_LDFLAGS=""
2581SO_LD=""
2582SO_TARGETS=""
2583SO_STRIP="cat"
2584
2585AC_ARG_WITH([dlopen],
2586	    AS_HELP_STRING([--with-dlopen=ARG],
2587			   [support dynamically loadable DLZ and DYNDB drivers]),
2588	    [], [with_dlopen="auto"])
2589
2590
2591#
2592# If PIC is disabled, dlopen must also be
2593#
2594AS_IF([test "$pic_mode" = "no"],
2595      [AS_CASE([$with_dlopen],
2596	       [auto],[with_dlopen="no"],
2597	       [yes],[AC_MSG_ERROR([--with-dlopen requires PIC])])])
2598
2599AS_CASE([$with_dlopen],
2600	[auto|yes],[
2601	  AC_SEARCH_LIBS([dlopen],[dl])
2602	  AC_CHECK_FUNCS([dlopen dlclose dlsym],
2603			 [with_dlopen="yes"],
2604			 [with_dlopen="no"])
2605	])
2606
2607AS_IF([test "$with_dlopen" = "yes"],
2608      [AS_CASE([$host],
2609	       [*-linux*|*-gnu*],[
2610		 LDFLAGS="${LDFLAGS} -Wl,--export-dynamic"
2611		 SO_CFLAGS="-fPIC"
2612		 SO_LDFLAGS=""
2613		 AS_IF([test "$use_libtool" = "yes"],[
2614			 SO_LDFLAGS="-Xcompiler -shared"
2615			 SO_LD="${CC}"
2616		       ],[
2617			 SO_LDFLAGS="-shared"
2618			 SO_LD="${CC}"
2619		       ])
2620	       ],
2621	       [*-freebsd*|*-openbsd*|*-netbsd*],[
2622		 LDFLAGS="${LDFLAGS} -Wl,-E"
2623		 SO_CFLAGS="-fpic"
2624		 AS_IF([test "$use_libtool" = "yes"],[
2625			 SO_LDFLAGS="-Xcompiler -shared"
2626			 SO_LD="${CC}"
2627		       ],[
2628			 SO_LDFLAGS="-shared"
2629			 SO_LD="${CC}"
2630		       ])
2631	       ],
2632	       [*-darwin*],[
2633		 SO_CFLAGS="-fPIC"
2634                 SO_LD="${CC}"
2635		 AS_IF([test "$use_libtool" = "yes"],[
2636			 SO_LDFLAGS="-Xcompiler -dynamiclib -undefined dynamic_lookup"
2637		       ],[
2638			 SO_LDFLAGS="-dynamiclib -undefined dynamic_lookup"
2639		       ])
2640	       ],
2641	       [*-solaris*],[
2642		 SO_CFLAGS="-KPIC"
2643		 SO_LDFLAGS="-G -z text"
2644		 SO_LD="ld"
2645	       ],
2646	       [
2647		 SO_CFLAGS="-fPIC"
2648	       ])
2649       AS_IF([test "$GCC" = "yes"],[
2650	       SO_CFLAGS="-fPIC"
2651	       AS_IF([test -z "$SO_LD"],
2652		     [AS_IF([test "$use_libtool" = "yes"],[
2653			      SO_LDFLAGS="-Xcompiler -shared"
2654			      SO_LD="${CC}"
2655			    ],[
2656			      SO_LDFLAGS="-shared"
2657			      SO_LD="${CC}"
2658			    ])
2659		     ])
2660	     ])
2661       # If we still don't know how to make shared objects, don't make any.
2662       AS_IF([test -n "$SO_LD"],
2663	     [SO_TARGETS="\${SO_TARGETS}"
2664	      AC_DEFINE([ISC_DLZ_DLOPEN], [1],
2665			[Define to allow building of objects for dlopen().])
2666	     ])
2667      ])
2668
2669CFLAGS="$CFLAGS $SO_CFLAGS"
2670
2671AC_SUBST(SO)
2672AC_SUBST(SO_CFLAGS)
2673AC_SUBST(SO_LDFLAGS)
2674AC_SUBST(SO_LD)
2675AC_SUBST(SO_STRIP)
2676AC_SUBST(SO_TARGETS)
2677
2678#
2679# Response policy rewriting using DNS Response Policy Service (DNSRPS)
2680# interface.
2681#
2682# DNSRPS can be compiled into BIND everywhere with a reasonably
2683# modern C compiler.  It is enabled on systems with dlopen() and librpz.so.
2684#
2685dnsrps_avail=yes
2686AC_MSG_CHECKING([for librpz __attribute__s])
2687AC_COMPILE_IFELSE(
2688  [AC_LANG_PROGRAM(
2689     [[]],
2690     [[
2691       extern void f(char *p __attribute__((unused)), ...)
2692       __attribute__((format(printf,1,2))) __attribute__((__noreturn__));
2693     ]])],
2694  [
2695    librpz_have_attr=yes
2696    AC_DEFINE([LIBRPZ_HAVE_ATTR], [1], [have __attribute__s used in librpz.h])
2697    AC_MSG_RESULT([yes])
2698  ],[
2699    librpz_have_attr=no
2700    AC_MSG_RESULT([no])
2701  ])
2702
2703AC_ARG_ENABLE([dnsrps-dl],
2704	      [AS_HELP_STRING([--enable-dnsrps-dl],
2705			      [DNS Response Policy Service delayed link
2706			       [default=$librpz_dl]])],
2707	      [enable_librpz_dl="$enableval"], [enable_librpz_dl="$with_dlopen"])
2708
2709AS_IF([test "$enable_librpz_dl" = "yes" -a "$with_dlopen" = "no"],
2710      [AC_MSG_ERROR([DNS Response Policy Service delayed link requires dlopen to be enabled])])
2711
2712AC_ARG_WITH([dnsrps-libname],
2713	    [AS_HELP_STRING([--with-dnsrps-libname],
2714			    [DNSRPS provider library name (librpz.so)])],
2715	    [librpz_name="$withval"], [librpz_name="librpz.so"])
2716AC_ARG_WITH([dnsrps-dir],
2717	    [AS_HELP_STRING([--with-dnsrps-dir],
2718			    [path to DNSRPS provider library])],
2719	    [librpz_path="$withval/$librpz_name"], [librpz_path="$librpz_name"])
2720AC_DEFINE_UNQUOTED([DNSRPS_LIBRPZ_PATH], ["$librpz_path"],
2721		   [dnsrps $librpz_name])
2722AS_IF([test "$enable_librpz_dl" = "yes"],
2723      [
2724	dnsrps_lib_open=2
2725      ],[
2726	dnsrps_lib_open=1
2727	# Add librpz.so to linked libraries if we are not using dlopen()
2728	AC_SEARCH_LIBS([librpz_client_create], [rpz], [],
2729		[dnsrps_lib_open=0
2730		 dnsrps_avail=no])
2731      ])
2732AC_DEFINE_UNQUOTED([DNSRPS_LIB_OPEN], [$dnsrps_lib_open],
2733		   [0=no DNSRPS  1=static link  2=dlopen()])
2734
2735AC_ARG_ENABLE([dnsrps],
2736	      AS_HELP_STRING([--enable-dnsrps],
2737			     [enable DNS Response Policy Service API]),
2738	      [enable_dnsrps=$enableval], [enable_dnsrps=no])
2739
2740AS_IF([test "$enable_dnsrps" != "no"],[
2741	AS_IF([test "$dnsrps_avail" != "yes"],
2742	      [AC_MSG_ERROR([dlopen and librpz.so needed for DNSRPS])])
2743	AS_IF([test "$dnsrps_lib_open" = "0"],
2744	      [AC_MSG_ERROR([dlopen and librpz.so needed for DNSRPS])])
2745	AC_DEFINE([USE_DNSRPS], [1], [Enable DNS Response Policy Service API])
2746      ])
2747
2748sinclude(contrib/dlz/config.dlz.in)
2749AC_MSG_CHECKING(contributed DLZ drivers)
2750
2751if test -n "$CONTRIB_DLZ"
2752then
2753	AC_MSG_RESULT(yes)
2754	DLZ_DRIVER_RULES=contrib/dlz/drivers/rules
2755	AC_CONFIG_FILES([$DLZ_DRIVER_RULES
2756		contrib/dlz/modules/mysql/Makefile
2757		contrib/dlz/modules/mysqldyn/Makefile])
2758else
2759	AC_MSG_RESULT(no)
2760	DLZ_DRIVER_RULES=/dev/null
2761fi
2762
2763AC_SUBST(CONTRIB_DLZ)
2764AC_SUBST(DLZ_DRIVER_INCLUDES)
2765AC_SUBST(DLZ_DRIVER_LIBS)
2766AC_SUBST(DLZ_DRIVER_SRCS)
2767AC_SUBST(DLZ_DRIVER_OBJS)
2768AC_SUBST(DLZ_SYSTEM_TEST)
2769AC_SUBST(DLZ_DRIVER_MYSQL_INCLUDES)
2770AC_SUBST(DLZ_DRIVER_MYSQL_LIBS)
2771AC_SUBST_FILE(DLZ_DRIVER_RULES)
2772
2773if test "yes" = "$cross_compiling"; then
2774	if test -z "$BUILD_CC"; then
2775		AC_MSG_ERROR([BUILD_CC not set])
2776	fi
2777	BUILD_CFLAGS="$BUILD_CFLAGS"
2778	BUILD_CPPFLAGS="$BUILD_CPPFLAGS"
2779	BUILD_LDFLAGS="$BUILD_LDFLAGS"
2780	BUILD_LIBS="$BUILD_LIBS"
2781else
2782	BUILD_CC="$CC"
2783	BUILD_CFLAGS="$CFLAGS"
2784	BUILD_CPPFLAGS="$CPPFLAGS $GEN_NEED_OPTARG"
2785	BUILD_LDFLAGS="$LDFLAGS"
2786	BUILD_LIBS="$LIBS"
2787fi
2788
2789NEWFLAGS=""
2790for e in $BUILD_LDFLAGS ; do
2791    case $e in
2792	-L*)
2793	    case $host_os in
2794		netbsd*)
2795		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
2796		    NEWFLAGS="$NEWFLAGS $e $ee"
2797		    ;;
2798		freebsd*)
2799		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
2800		    NEWFLAGS="$NEWFLAGS $e $ee"
2801		    ;;
2802		solaris*)
2803		    ee=`echo $e | sed -e 's%^-L%-R%'`
2804		    NEWFLAGS="$NEWFLAGS $e $ee"
2805		    ;;
2806		*)
2807		    NEWFLAGS="$NEWFLAGS $e"
2808		    ;;
2809		esac
2810	    ;;
2811	*)
2812	    NEWFLAGS="$NEWFLAGS $e"
2813	    ;;
2814    esac
2815done
2816BUILD_LDFLAGS="$NEWFLAGS"
2817
2818NEWFLAGS=""
2819for e in $DNS_GSSAPI_LIBS ; do
2820    case $e in
2821	-L*)
2822	    case $host_os in
2823		netbsd*)
2824		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
2825		    NEWFLAGS="$NEWFLAGS $e $ee"
2826		    ;;
2827		freebsd*)
2828		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
2829		    NEWFLAGS="$NEWFLAGS $e $ee"
2830		    ;;
2831		solaris*)
2832		    ee=`echo $e | sed -e 's%^-L%-R%'`
2833		    NEWFLAGS="$NEWFLAGS $e $ee"
2834		    ;;
2835		*)
2836		    NEWFLAGS="$NEWFLAGS $e"
2837		    ;;
2838		esac
2839	    ;;
2840	*)
2841	    NEWFLAGS="$NEWFLAGS $e"
2842	    ;;
2843    esac
2844done
2845DNS_GSSAPI_LIBS="$NEWFLAGS"
2846
2847NEWFLAGS=""
2848for e in $ISC_OPENSSL_LIBS ; do
2849    case $e in
2850	-L*)
2851	    case $host_os in
2852		netbsd*)
2853		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
2854		    NEWFLAGS="$NEWFLAGS $e $ee"
2855		    ;;
2856		freebsd*)
2857		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
2858		    NEWFLAGS="$NEWFLAGS $e $ee"
2859		    ;;
2860		solaris*)
2861		    ee=`echo $e | sed -e 's%^-L%-R%'`
2862		    NEWFLAGS="$NEWFLAGS $e $ee"
2863		    ;;
2864		*)
2865		    NEWFLAGS="$NEWFLAGS $e"
2866		    ;;
2867		esac
2868	    ;;
2869	*)
2870	    NEWFLAGS="$NEWFLAGS $e"
2871	    ;;
2872    esac
2873done
2874ISC_OPENSSL_LIBS="$NEWFLAGS"
2875
2876NEWFLAGS=""
2877for e in $DNS_CRYPTO_LIBS ; do
2878    case $e in
2879	-L*)
2880	    case $host_os in
2881		netbsd*)
2882		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
2883		    NEWFLAGS="$NEWFLAGS $e $ee"
2884		    ;;
2885		freebsd*)
2886		    ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'`
2887		    NEWFLAGS="$NEWFLAGS $e $ee"
2888		    ;;
2889		solaris*)
2890		    ee=`echo $e | sed -e 's%^-L%-R%'`
2891		    NEWFLAGS="$NEWFLAGS $e $ee"
2892		    ;;
2893		*)
2894		    NEWFLAGS="$NEWFLAGS $e"
2895		    ;;
2896		esac
2897	    ;;
2898	*)
2899	    NEWFLAGS="$NEWFLAGS $e"
2900	    ;;
2901    esac
2902done
2903DNS_CRYPTO_LIBS="$NEWFLAGS"
2904
2905AC_SUBST(BUILD_CC)
2906AC_SUBST(BUILD_CFLAGS)
2907AC_SUBST(BUILD_CPPFLAGS)
2908AC_SUBST(BUILD_LDFLAGS)
2909AC_SUBST(BUILD_LIBS)
2910
2911#
2912# Commands to run at the end of config.status.
2913# Don't just put these into configure, it won't work right if somebody
2914# runs config.status directly (which autoconf allows).
2915#
2916
2917AC_CONFIG_COMMANDS(
2918	[chmod],
2919	[chmod a+x isc-config.sh doc/doxygen/doxygen-input-filter])
2920
2921#
2922# Files to configure.  These are listed here because we used to
2923# specify them as arguments to AC_OUTPUT.  It's (now) ok to move these
2924# elsewhere if there's a good reason for doing so.
2925#
2926
2927AC_CONFIG_FILES([
2928	make/Makefile
2929	make/mkdep
2930	Makefile
2931	bin/Makefile
2932	bin/check/Makefile
2933	bin/confgen/Makefile
2934	bin/confgen/unix/Makefile
2935	bin/delv/Makefile
2936	bin/dig/Makefile
2937	bin/dnssec/Makefile
2938	bin/named/Makefile
2939	bin/named/unix/Makefile
2940	bin/nsupdate/Makefile
2941	bin/pkcs11/Makefile
2942	bin/plugins/Makefile
2943	bin/python/Makefile
2944	bin/python/isc/Makefile
2945	bin/python/isc/utils.py
2946	bin/python/isc/tests/Makefile
2947	bin/python/dnssec-checkds.py
2948	bin/python/dnssec-coverage.py
2949	bin/python/dnssec-keymgr.py
2950	bin/python/isc/__init__.py
2951	bin/python/isc/checkds.py
2952	bin/python/isc/coverage.py
2953	bin/python/isc/dnskey.py
2954	bin/python/isc/eventlist.py
2955	bin/python/isc/keydict.py
2956	bin/python/isc/keyevent.py
2957	bin/python/isc/keymgr.py
2958	bin/python/isc/keyseries.py
2959	bin/python/isc/keyzone.py
2960	bin/python/isc/policy.py
2961	bin/python/isc/rndc.py
2962	bin/python/isc/tests/dnskey_test.py
2963	bin/python/isc/tests/policy_test.py
2964	bin/rndc/Makefile
2965	bin/tests/Makefile
2966	bin/tests/headerdep_test.sh
2967	bin/tests/optional/Makefile
2968	bin/tests/pkcs11/Makefile
2969	bin/tests/pkcs11/benchmarks/Makefile
2970	bin/tests/system/Makefile
2971	bin/tests/system/conf.sh
2972	bin/tests/system/dlzexternal/Makefile
2973	bin/tests/system/dlzexternal/ns1/dlzs.conf
2974	bin/tests/system/dyndb/Makefile
2975	bin/tests/system/dyndb/driver/Makefile
2976	bin/tests/system/pipelined/Makefile
2977	bin/tests/system/rndc/Makefile
2978	bin/tests/system/rpz/Makefile
2979	bin/tests/system/rsabigexponent/Makefile
2980	bin/tests/system/tkey/Makefile
2981	bin/tests/virtual-time/Makefile
2982	bin/tests/virtual-time/conf.sh
2983	bin/tools/Makefile
2984	contrib/scripts/check-secure-delegation.pl
2985	contrib/scripts/zone-edit.sh
2986	doc/Makefile
2987	doc/arm/Makefile
2988	doc/arm/noteversion.xml
2989	doc/arm/pkgversion.xml
2990	doc/arm/releaseinfo.xml
2991	doc/doxygen/Doxyfile
2992	doc/doxygen/Makefile
2993	doc/doxygen/doxygen-input-filter
2994	doc/misc/Makefile
2995	doc/tex/Makefile
2996	doc/tex/armstyle.sty
2997	doc/xsl/Makefile
2998	doc/xsl/isc-docbook-chunk.xsl
2999	doc/xsl/isc-docbook-html.xsl
3000	doc/xsl/isc-manpage.xsl
3001	doc/xsl/isc-notes-html.xsl
3002	isc-config.sh
3003	lib/Makefile
3004	lib/bind9/Makefile
3005	lib/bind9/include/Makefile
3006	lib/bind9/include/bind9/Makefile
3007	lib/dns/Makefile
3008	lib/dns/include/Makefile
3009	lib/dns/include/dns/Makefile
3010	lib/dns/include/dst/Makefile
3011	lib/dns/tests/Makefile
3012	lib/irs/Makefile
3013	lib/irs/include/Makefile
3014	lib/irs/include/irs/Makefile
3015	lib/irs/include/irs/netdb.h
3016	lib/irs/include/irs/platform.h
3017	lib/irs/tests/Makefile
3018	lib/isc/pthreads/Makefile
3019	lib/isc/pthreads/include/Makefile
3020	lib/isc/pthreads/include/isc/Makefile
3021	lib/isc/Makefile
3022	lib/isc/include/Makefile
3023	lib/isc/include/isc/Makefile
3024	lib/isc/include/isc/platform.h
3025	lib/isc/include/pk11/Makefile
3026	lib/isc/include/pkcs11/Makefile
3027	lib/isc/tests/Makefile
3028	lib/isc/unix/Makefile
3029	lib/isc/unix/include/Makefile
3030	lib/isc/unix/include/isc/Makefile
3031	lib/isc/unix/include/pkcs11/Makefile
3032	lib/isccc/Makefile
3033	lib/isccc/include/Makefile
3034	lib/isccc/include/isccc/Makefile
3035	lib/isccc/tests/Makefile
3036	lib/isccfg/Makefile
3037	lib/isccfg/include/Makefile
3038	lib/isccfg/include/isccfg/Makefile
3039	lib/isccfg/tests/Makefile
3040	lib/ns/Makefile
3041	lib/ns/include/Makefile
3042	lib/ns/include/ns/Makefile
3043	lib/ns/tests/Makefile
3044	lib/samples/Makefile
3045	lib/samples/Makefile-postinstall
3046	unit/unittest.sh
3047	fuzz/Makefile
3048])
3049
3050#
3051# Do it
3052#
3053
3054AC_OUTPUT
3055
3056#
3057# Now that the Makefiles exist we can ensure that everything is rebuilt.
3058#
3059AC_ARG_WITH(make-clean,
3060	    AS_HELP_STRING([--with-make-clean],
3061			   [run "make clean" at end of configure [yes|no]]),
3062    make_clean="$withval", make_clean="yes")
3063case "$make_clean" in
3064yes)
3065	if test "yes" != "$no_create"
3066	then
3067		if test "yes" = "$silent"
3068		then
3069			make clean > /dev/null
3070		else
3071			make clean
3072		fi
3073	fi
3074	;;
3075esac
3076
3077AC_ARG_ENABLE(full-report,
3078	      AS_HELP_STRING([--enable-full-report],
3079			     [report values of all configure options]))
3080
3081report() {
3082    echo "==============================================================================="
3083    echo "Configuration summary:"
3084    echo "-------------------------------------------------------------------------------"
3085    echo "Optional features enabled:"
3086    if test "yes" = "$enable_full_report" -o "standard" = "$locktype"; then
3087	echo "        Mutex lock type: $locktype"
3088    fi
3089    test "large" = "$use_tuning" && echo "    Large-system tuning (--with-tuning)"
3090    test "no" = "$use_dnstap" || \
3091	    echo "    Allow 'dnstap' packet logging (--enable-dnstap)"
3092    test "no" = "$use_geoip" || echo "    GeoIP access control (--with-geoip)"
3093    test "no" = "$use_gssapi" || echo "    GSS-API (--with-gssapi)"
3094    if test "yes" = "$enable_full_report" -o "aes" != "$with_cc_alg"; then
3095	echo "        Algorithm: $with_cc_alg"
3096    fi
3097
3098    # these lines are only printed if run with --enable-full-report
3099    if test "yes" = "$enable_full_report"; then
3100	test "no" = "$found_ipv6" || echo "    IPv6 support (--enable-ipv6)"
3101	test "X$PYTHON" = "X" || echo "    Python tools (--with-python)"
3102	test "X$XMLSTATS" = "X" || echo "    XML statistics (--with-libxml2)"
3103	test "X$JSONSTATS" = "X" || echo "    JSON statistics (--with-libjson)"
3104	test "X$ZLIB" = "X" || echo "    HTTP zlib compression (--with-zlib)"
3105	test "X$NZD_TOOLS" = "X" || echo "    LMDB database to store configuration for 'addzone' zones (--with-lmdb)"
3106	test "no" = "$with_libidn2" || echo "    IDN support (--with-libidn2)"
3107    fi
3108
3109    test "yes" = "$enable_dnsrps" && \
3110	echo "    DNS Response Policy Service interface (--enable-dnsrps)"
3111    test "yes" = "$enable_fixed" && \
3112	echo "    Allow 'fixed' rrset-order (--enable-fixed-rrset)"
3113    test "yes" = "$enable_backtrace" && \
3114	echo "    Print backtrace on crash (--enable-backtrace)"
3115    test "minimal" = "$want_symtable" && \
3116	echo "    Use symbol table for backtrace, named only (--enable-symtable)"
3117    test "yes" = "$want_symtable" -o "all" = "$want_symtable" && \
3118	echo "    Use symbol table for backtrace, all binaries (--enable-symtable=all)"
3119    test "no" = "$use_libtool" || echo "    Use GNU libtool (--with-libtool)"
3120    test "yes" = "$want_querytrace" && \
3121	echo "    Very verbose query trace logging (--enable-querytrace)"
3122    test "no" = "$with_cmocka" || echo "    CMocka Unit Testing Framework (--with-cmocka)"
3123
3124    test "no" = "$want_autoval" || echo "    DNSSEC validation active by default (--enable-auto-validation)"
3125
3126    test "$CRYPTO" = "pkcs11" && (
3127	echo "    Using PKCS#11 for Public-Key Cryptography (--with-native-pkcs11)"
3128	echo "    PKCS#11 module (--with-pkcs11): $with_pkcs11"
3129    )
3130
3131    echo "    Dynamically loadable zone (DLZ) drivers:"
3132    test "no" = "$use_dlz_bdb" || \
3133	echo "        Berkeley DB (--with-dlz-bdb)"
3134    test "no" = "$use_dlz_ldap" || \
3135	echo "        LDAP (--with-dlz-ldap)"
3136    test "no" = "$use_dlz_mysql" || \
3137	echo "        MySQL (--with-dlz-mysql)"
3138    test "no" = "$use_dlz_odbc" || \
3139	echo "        ODBC (--with-dlz-odbc)"
3140    test "no" = "$use_dlz_postgres" || \
3141	echo "        Postgres (--with-dlz-postgres)"
3142    test "no" = "$use_dlz_filesystem" || \
3143	echo "        Filesystem (--with-dlz-filesystem)"
3144    test "no" = "$use_dlz_stub" || \
3145	echo "        Stub (--with-dlz-stub)"
3146    test "$use_dlz_bdb $use_dlz_ldap $use_dlz_mysql $use_dlz_odbc $use_dlz_postgres $use_dlz_filesystem $use_dlz_stub" = "no no no no no no no" && echo "        None"
3147
3148    echo "-------------------------------------------------------------------------------"
3149
3150    echo "Features disabled or unavailable on this platform:"
3151    test "no" = "$found_ipv6" && echo "    IPv6 support (--enable-ipv6)"
3152    test "large" = "$use_tuning" || echo "    Large-system tuning (--with-tuning)"
3153
3154    test "no" = "$use_dnstap" && \
3155	    echo "    Allow 'dnstap' packet logging (--enable-dnstap)"
3156    test "no" = "$use_geoip" && echo "    GeoIP access control (--with-geoip)"
3157    test "no" = "$use_gssapi" && echo "    GSS-API (--with-gssapi)"
3158
3159    test "no" = "$enable_dnsrps" && \
3160	echo "    DNS Response Policy Service interface (--enable-dnsrps)"
3161
3162    test "yes" = "$enable_fixed" || \
3163	echo "    Allow 'fixed' rrset-order (--enable-fixed-rrset)"
3164
3165    test "no" = "$want_autoval" && echo "    DNSSEC validation requires configuration (--disable-auto-validation)"
3166
3167    test "$CRYPTO" = "pkcs11" || (
3168	echo "    Using PKCS#11 for Public-Key Cryptography (--without-native-pkcs11)"
3169    )
3170
3171    test "yes" = "$enable_backtrace" || \
3172	echo "    Print backtrace on crash (--enable-backtrace)"
3173    test "yes" = "$want_querytrace" || \
3174	echo "    Very verbose query trace logging (--enable-querytrace)"
3175
3176    test "yes" = "$use_libtool" || echo "    Use GNU libtool (--with-libtool)"
3177    test "no" = "$with_cmocka" && echo "    CMocka Unit Testing Framework (--with-cmocka)"
3178
3179    test "X$PYTHON" = "X" && echo "    Python tools (--with-python)"
3180    test "X$XMLSTATS" = "X" && echo "    XML statistics (--with-libxml2)"
3181    test "X$JSONSTATS" = "X" && echo "    JSON statistics (--with-libjson)"
3182    test "X$ZLIB" = "X" && echo "    HTTP zlib compression (--with-zlib)"
3183    test "X$NZD_TOOLS" = "X" && echo "    LMDB database to store configuration for 'addzone' zones (--with-lmdb)"
3184    test "no" = "$with_libidn2" && echo "    IDN support (--with-libidn2)"
3185
3186    echo "-------------------------------------------------------------------------------"
3187    echo "Configured paths:"
3188    echo "    prefix: $prefix"
3189    echo "    sysconfdir: $sysconfdir"
3190    echo "    localstatedir: $localstatedir"
3191    echo "-------------------------------------------------------------------------------"
3192    echo "Compiler: $CC"
3193    $CC --version 2>&1 | sed 's/^/    /'
3194
3195    if test "X$ac_unrecognized_opts" != "X"; then
3196	echo "Unrecognized options:"
3197	echo "    $ac_unrecognized_opts"
3198    fi
3199
3200    if test "yes" != "$enable_full_report"; then
3201	echo "-------------------------------------------------------------------------------"
3202	echo "For more detail, use --enable-full-report."
3203    fi
3204    echo "==============================================================================="
3205}
3206
3207if test "yes" != "$silent"; then
3208	report
3209fi
3210
3211# Tell Emacs to edit this file in shell mode.
3212# Local Variables:
3213# mode: sh
3214# End:
3215