diff options
Diffstat (limited to 'configure.ac')
-rw-r--r-- | configure.ac | 3150 |
1 files changed, 3150 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..fb6f172 --- /dev/null +++ b/configure.ac @@ -0,0 +1,3150 @@ +# Copyright (C) Internet Systems Consortium, Inc. ("ISC") +# +# SPDX-License-Identifier: MPL-2.0 +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, you can obtain one at https://mozilla.org/MPL/2.0/. +# +# See the COPYRIGHT file distributed with this work for additional +# information regarding copyright ownership. + +AC_INIT(BIND, [9.16], [https://gitlab.isc.org/isc-projects/bind9/-/issues/new?issuable_template=Bug], [], [https://www.isc.org/downloads/]) +AC_PREREQ([2.60]) + +# +# Enable maintainer mode by default, but allow to disable it in the CI +# +AM_MAINTAINER_MODE([enable]) + +AC_CONFIG_HEADER(config.h) +AC_CONFIG_MACRO_DIR([m4]) + +AC_CANONICAL_HOST + +# +# Enable system extensions to C and POSIX +# +AC_USE_SYSTEM_EXTENSIONS + +# +# Enable large file support +# +AC_SYS_LARGEFILE +AC_FUNC_FSEEKO + +LFS_CFLAGS=`getconf LFS_CFLAGS 2>/dev/null` +LFS_LDFLAGS=`getconf LFS_LDFLAGS 2>/dev/null` +LFS_LIBS=`getconf LFS_LIBS 2>/dev/null` + +AC_SUBST([LFS_CFLAGS]) +AC_SUBST([LFS_LDFLAGS]) +AC_SUBST([LFS_LIBS]) + +# Enable RFC 3542 APIs on macOS +AC_DEFINE([__APPLE_USE_RFC_3542], [1], [Select RFC3542 IPv6 API on macOS]) + +AC_PROG_MAKE_SET + +AC_PROG_LIBTOOL +AC_PROG_INSTALL +AC_PROG_LN_S +AX_POSIX_SHELL +AC_PROG_MKDIR_P + +AC_SUBST(STD_CINCLUDES) +AC_SUBST(STD_CDEFINES) +AC_SUBST(STD_CWARNINGS) +AC_SUBST(CCOPT) +AC_SUBST(CCNOOPT) +AC_SUBST(BACKTRACECFLAGS) + +# +# Use pkg-config +# + +PKG_PROG_PKG_CONFIG +AS_IF([test -z "$PKG_CONFIG"], + [AC_MSG_ERROR([The pkg-config script could not be found or is too old.])]) + +# [pairwise: --enable-buffer-useinline, --disable-buffer-useinline] +AC_ARG_ENABLE(buffer_useinline, + AS_HELP_STRING([--enable-buffer-useinline], + [define ISC_BUFFER_USEINLINE when compiling + [default=yes]]), + if test yes = "${enable}" + then + AC_DEFINE([ISC_BUFFER_USEINLINE], [1], + [Define if you want to use inline buffers]) + fi, + AC_DEFINE([ISC_BUFFER_USEINLINE], [1])) + +# [pairwise: --enable-warn-shadow, --disable-warn-shadow] +AC_ARG_ENABLE([warn_shadow], + [AS_HELP_STRING([--enable-warn-shadow], + [turn on -Wshadow when compiling])]) + +# [pairwise: --enable-warn-error, --disable-warn-error] +AC_ARG_ENABLE([warn_error], + [AS_HELP_STRING([--enable-warn-error], + [turn on -Werror when compiling])]) + +# [pairwise: --enable-developer, --disable-developer] +AC_ARG_ENABLE([developer], + [AS_HELP_STRING([--enable-developer], + [enable developer build settings])]) + +XTARGETS= +AS_IF([test "$enable_developer" = "yes"], + [STD_CDEFINES="$STD_CDEFINES -DISC_MEM_DEFAULTFILL=1 -DISC_LIST_CHECKINIT=1" + test "${enable_fixed_rrset+set}" = set || enable_fixed_rrset=yes + test "${enable_querytrace+set}" = set || enable_querytrace=yes + test "${with_cmocka+set}" = set || with_cmocka=yes + test "${with_dlz_filesystem+set}" = set || with_dlz_filesystem=yes + test "${enable_symtable+set}" = set || enable_symtable=all + test "${enable_warn_error+set}" = set || enable_warn_error=yes + test "${enable_warn_shadow+set}" = set || enable_warn_shadow=yes + test "${with_zlib+set}" = set || with_zlib=yes + XTARGETS='${XTARGETS}' + ]) +AC_SUBST([XTARGETS]) + +# Fuzzing is not included in pairwise testing as fuzzing tools are +# not present in the relevant Docker image. +# +# [pairwise: skip] +AC_ARG_ENABLE([fuzzing], + [AS_HELP_STRING([--enable-fuzzing=<afl|libfuzzer>], + [Enable fuzzing using American Fuzzy Lop or libFuzzer (default=no)])], + [], + [enable_fuzzing=no]) + +AC_MSG_CHECKING([whether to enable fuzzing mode]) +AS_CASE([$enable_fuzzing], + [no],[AC_MSG_RESULT([no])], + [afl],[ + AC_MSG_RESULT([using AFL]) + AC_DEFINE([ENABLE_AFL], [1], + [Define to enable American Fuzzy Lop test harness]) + CFLAGS="$CFLAGS -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1" + LIBS="$LIBS -lpthread"], + [libfuzzer],[ + AC_MSG_RESULT([using libFuzzer]) + CFLAGS="$CFLAGS -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1 -fsanitize=fuzzer,address,undefined" + LDFLAGS="$LDFLAGS -fsanitize=fuzzer,address,undefined"], + [*],[AC_MSG_ERROR([You need to explicitly select the fuzzer])]) + +AS_IF([test "$enable_fuzzing" = "afl"], + [AC_MSG_CHECKING("for AFL enabled compiler") + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], + [#ifndef __AFL_COMPILER + #error AFL compiler required + #endif + ])], + [AC_MSG_RESULT([yes])], + [AC_MSG_ERROR([set CC=afl-<gcc|clang> when --enable-fuzzing=afl is used])]) + ]) + +# +# Make very sure that these are the first files processed by +# config.status, since we use the processed output as the input for +# AC_SUBST_FILE() substitutions in other files. +# +AC_CONFIG_FILES([make/rules make/includes]) + +AC_PATH_PROG(AR, ar) +ARFLAGS="cruv" +AC_SUBST(AR) +AC_SUBST(ARFLAGS) + +# The POSIX ln(1) program. Non-POSIX systems may substitute +# "copy" or something. +LN=ln +AC_SUBST(LN) + +case "$AR" in + "") + AC_MSG_ERROR([ +ar program not found. Please fix your PATH to include the directory in +which ar resides, or set AR in the environment with the full path to ar. +]) + + ;; +esac + +# +# Look for w3m +# +AC_PATH_PROGS(W3M, w3m, w3m) +AC_SUBST(W3M) + +# +# Look for pandoc +# +AC_PATH_PROG(PANDOC, pandoc, pandoc) +AC_SUBST(PANDOC) + +# +# Perl is optional; it is used only by some of the system test scripts. +# Note: the backtrace feature (see below) uses perl to build the symbol table, +# but it still compiles without perl, in which case an empty table will be used. +# +AC_PATH_PROGS(PERL, perl5 perl) +AC_SUBST(PERL) + +# +# Python is also optional but required by default so that dnssec-keymgr gets +# installed unless explicitly prevented by the user using --without-python. +# +testminvers='import sys +if (sys.version_info < (2,7)) or (sys.version_info < (3,2) and sys.version_info >= (3,0)): + exit(1)' + +testargparse='try: import argparse +except: exit(1)' + +testply='try: import ply +except: exit(1)' + +testsetuptools='try: from setuptools import setup +except: exit(1)' + +testdistutils='try: from distutils.core import setup +except: exit(1)' + +default_with_python="python python3 python3.11 python3.10 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python2 python2.7" + +AC_ARG_VAR([PYTHON], [path to python executable]) + +# [pairwise: --with-python, --without-python] +AC_ARG_WITH([python], + AS_HELP_STRING([--with-python=PATH], + [specify path to Python interpreter]), + [], [with_python=$default_with_python]) + +# [pairwise: skip] +AC_ARG_WITH([python-install-dir], + AS_HELP_STRING([--with-python-install-dir=PATH], + [installation directory for Python modules]), + [], with_python_install_dir="") + +AS_IF([test "$with_python" = "yes"], + [with_python=$default_with_python]) + +AS_IF([test "$with_python" = "no"], + [AC_MSG_CHECKING([for Python support]) + unset PYTHON + AC_MSG_RESULT([disabled])], + [for p in $with_python + do + AS_CASE([$p], + [/*],[PYTHON="$p"]) + + AC_PATH_PROG([PYTHON], [$p]) + # Do not cache the result of the check from the previous line. If the + # first found Python interpreter has missing module dependencies and + # the result of the above check is cached, subsequent module checks + # will erroneously keep on using the cached path to the first found + # Python interpreter instead of different ones. + unset ac_cv_path_PYTHON + + AS_IF([test -z "$PYTHON"], [continue]) + + AC_MSG_CHECKING([if $PYTHON is python2 version >= 2.7 or python3 version >= 3.2]) + AS_IF(["$PYTHON" -c "$testminvers" 2>/dev/null], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + unset PYTHON + continue]) + + AC_MSG_CHECKING([Python module 'argparse']) + AS_IF(["$PYTHON" -c "$testargparse" 2>/dev/null], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + unset PYTHON + continue]) + + AC_MSG_CHECKING([Python module 'ply']) + AS_IF(["$PYTHON" -c "$testply" 2>/dev/null], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + unset PYTHON + continue]) + + AC_MSG_CHECKING([Python module 'setuptools']) + AS_IF(["$PYTHON" -c "$testsetuptools" 2>/dev/null], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_CHECKING([Python module 'distutils']) + AS_IF(["$PYTHON" -c "$testdistutils" 2>/dev/null], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + unset PYTHON + continue])]) + + # Stop looking any further once we find a Python interpreter + # satisfying all requirements. + break + done + + AS_IF([test "X$PYTHON" = "X"], + [AC_MSG_CHECKING([for Python support]) + AC_MSG_RESULT([no]) + AC_MSG_ERROR([m4_normalize( + [Python >= 2.7 or >= 3.2 and the PLY package + are required for dnssec-keymgr and other + Python-based tools. PLY may be + available from your OS package manager + as python-ply or python3-ply; it can also + be installed via pip. To build without + Python/PLY, use --without-python.] + )])])]) + +PYTHON_TOOLS='' +CHECKDS='' +COVERAGE='' +KEYMGR='' +AS_IF([test "X$PYTHON" != "X"], + [PYTHON_TOOLS=python + CHECKDS=checkdstool + COVERAGE=coverage + KEYMGR=keymgr + PYTHON_INSTALL_DIR="$with_python_install_dir" + AS_IF([test -n "$with_python_install_dir"], + [PYTHON_INSTALL_LIB="--install-lib=$with_python_install_dir"])]) +AC_SUBST(CHECKDS) +AC_SUBST(COVERAGE) +AC_SUBST(KEYMGR) +AC_SUBST(PYTHON_TOOLS) +AC_SUBST(PYTHON_INSTALL_DIR) +AC_SUBST(PYTHON_INSTALL_LIB) + +# +# expanded_sysconfdir is needed for replacement in the python utilities +# +expanded_sysconfdir=`eval echo $sysconfdir` +AC_SUBST(expanded_sysconfdir) + +# +# Make sure INSTALL uses an absolute path, else it will be wrong in all +# Makefiles, since they use make/rules.in and INSTALL will be adjusted by +# configure based on the location of the file where it is substituted. +# Since in BIND9 INSTALL is only substituted into make/rules.in, an immediate +# subdirectory of install-sh, This relative path will be wrong for all +# directories more than one level down from install-sh. +# +case "$INSTALL" in + /*) + ;; + *) + # + # Not all systems have dirname. + # + changequote({, }) + ac_dir="`echo $INSTALL | sed 's%/[^/]*$%%'`" + changequote([, ]) + + ac_prog="`echo $INSTALL | sed 's%.*/%%'`" + test "X$ac_dir" = "X$ac_prog" && ac_dir=. + test -d "$ac_dir" && ac_dir="`(cd \"$ac_dir\" && pwd)`" + INSTALL="$ac_dir/$ac_prog" + ;; +esac + +AC_PATH_PROGS([PYTEST], [pytest-3 py.test-3 pytest py.test pytest-pypy], []) +AS_IF([test -z "$PYTEST"], + [AC_MSG_WARN([pytest not found, some system tests will be skipped])]) +AC_SUBST([PYTEST]) + + +AC_PROG_CC +AC_PROG_CC_C99 + +# +# Using Solaris linker with gcc on Solaris breaks Thread Local Storage +# +AS_CASE([$host], + [*-solaris*],[ + AS_IF([test "$GCC" = "yes"], + [LDFLAGS="$LDFLAGS -zrelax=transtls" + AC_MSG_WARN([When using GNU C Compiler on Solaris, -zrelax=transtls linker flag is used to fix bug in Thread Local Storage]) + ]) + ], + [*-darwin*],[LDFLAGS="$LDFLAGS -Wl,-flat_namespace"]) + +# +# CCNOOPT defaults to -O0 on gcc and disables optimization when is last +# +if test "X$CCNOOPT" = "X" -a "X$GCC" = "Xyes"; then + CCNOOPT="-O0" +fi + +AC_HEADER_STDC + +AC_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,,, +[$ac_includes_default +#ifdef HAVE_SYS_PARAM_H +# include <sys/param.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +# include <sys/socket.h> +#endif +]) + +# +# Check for thread local storage +# +AC_CHECK_HEADERS([threads.h], + [ + AC_MSG_CHECKING([for C11 Thread-Local Storage using thread_local]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [ + #include <threads.h> + ],[ + static thread_local int tls = 0; + return (tls); + ]) + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_THREAD_LOCAL],[1],[Define if thread_local keyword is available]) + AC_DEFINE([HAVE_TLS],[1],[Define if Thread-Local Storage is available]) + ],[ + AC_MSG_ERROR([Thread Local Storage support required, update your toolchain to build BIND 9]) + ]) + ],[ + AC_MSG_CHECKING([for Thread-Local Storage using __thread]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [ + ],[ + static __thread int tls = 0; + return (tls); + ]) + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE___THREAD],[1],[Define if __thread keyword is available]) + AC_DEFINE([HAVE_TLS],[1],[Define if Thread-Local Storage is available]) + ],[ + AC_MSG_ERROR([Thread Local Storage support required, update your toolchain to build BIND 9]) + ]) + ]) + +AC_C_CONST +AC_C_INLINE +AC_C_VOLATILE +AC_C_FLEXIBLE_ARRAY_MEMBER + +# +# Check for yield support on ARM processors +# +AS_CASE([$host], + [arm*], + [AC_MSG_CHECKING([for yield instruction support]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], + [[__asm__ __volatile__ ("yield")]])], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_ARM_YIELD], [1], + [define if the ARM yield instruction is available])], + [AC_MSG_RESULT([no])])]) + +# +# Check for pause support on SPARC processors +# +AS_CASE([$host], + [sparc*], + [AC_MSG_CHECKING([for pause instruction support]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], + [[__asm__ __volatile__ ("pause")]])], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_SPARC_PAUSE], [1], + [define if the SPARC pause instruction is available])], + [AC_MSG_RESULT([no])])]) + +AC_CHECK_FUNCS([sysctlbyname]) + +# +# Check for the existence of mmap to enable the fast format zones +# +AC_CHECK_FUNCS(mmap) + +# +# Older versions of HP/UX don't define seteuid() and setegid() +# +AC_CHECK_FUNCS(seteuid setresuid) +AC_CHECK_FUNCS(setegid setresgid) + +AC_TYPE_SIZE_T +AC_TYPE_SSIZE_T +AC_TYPE_UINTPTR_T + +AC_HEADER_TIME + +# +# check for uname library routine +# +AC_MSG_CHECKING([for uname]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include <sys/utsname.h> + #include <stdio.h> + ]], + [[ + struct utsname uts; + uname(&uts); + printf("running on %s %s %s for %s\n", + uts.sysname, uts.release, uts.version, uts.machine); + ]])], + [AC_MSG_RESULT(yes) + AC_DEFINE([HAVE_UNAME], [1], [define if uname is available]) + ], + [AC_MSG_RESULT(no) + AC_MSG_WARN([uname is not correctly supported]) + ]) + +# +# check for GCC noreturn attribute +# +AC_MSG_CHECKING(for GCC noreturn attribute) +AC_TRY_COMPILE([],[void foo() __attribute__((noreturn));], + [AC_MSG_RESULT(yes) + ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE" + ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST __attribute__((noreturn))"], + [AC_MSG_RESULT(no) + ISC_PLATFORM_NORETURN_PRE="#define ISC_PLATFORM_NORETURN_PRE" + ISC_PLATFORM_NORETURN_POST="#define ISC_PLATFORM_NORETURN_POST"]) +AC_SUBST(ISC_PLATFORM_NORETURN_PRE) +AC_SUBST(ISC_PLATFORM_NORETURN_POST) + +# +# check for GCC malloc attribute +# +AX_GCC_FUNC_ATTRIBUTE([malloc]) + +AC_MSG_CHECKING([for extended malloc attributes]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[ + #include <stddef.h> + #include <stdlib.h> + __attribute__ ((malloc, malloc (free, 1)) + void * xmalloc(size_t sz) { return malloc(sz); } + ]], + [[ + void *p = xmalloc(8); + free(p); + ]])], + [AC_MSG_RESULT(yes) + AC_DEFINE([HAVE_MALLOC_EXT_ATTR], [1], [define if extended attributes for malloc are available]) + ], + [AC_MSG_RESULT(no)]) + +# +# check for GCC returns_nonnull attribute +# +AX_GCC_FUNC_ATTRIBUTE([returns_nonnull]) + +# +# check if we have kqueue +# +# [pairwise: --enable-kqueue, --disable-kqueue] +AC_ARG_ENABLE([kqueue], + [AS_HELP_STRING([--enable-kqueue], + [use BSD kqueue when available [default=yes]])], + [], enable_kqueue="yes") + +AS_IF([test "$enable_kqueue" = "yes"], + [AC_CHECK_FUNCS([kqueue])]) + +# +# check if we have epoll. Linux kernel 2.4 has epoll_create() which fails, +# so we need to try running the code, not just test its existence. +# +# [pairwise: --enable-epoll, --disable-epoll] +AC_ARG_ENABLE([epoll], + [AS_HELP_STRING([--enable-epoll], + [use Linux epoll when available [default=auto]])], + [], [enable_epoll="yes"]) + +AS_IF([test "$enable_epoll" = "yes"], + [AC_CHECK_FUNCS([epoll_create1])]) + +# +# check if we support /dev/poll +# +# [pairwise: --enable-devpoll, --disable-devpoll] +AC_ARG_ENABLE([devpoll], + [AS_HELP_STRING([--enable-devpoll], + [use /dev/poll when available [default=yes]])], + [], [enable_devpoll="yes"]) +AS_IF([test "$enable_devpoll" = "yes"], + [AC_CHECK_HEADERS([sys/devpoll.h devpoll.h])]) + +# +# Find the machine's endian flavor. +# +AC_C_BIGENDIAN + +# +# GeoIP support? +# +# Should be on by default if libmaxminddb exists. +# +# [pairwise: skip] +AC_ARG_WITH([geoip2], + [AS_HELP_STRING([--with-geoip2], + [deprecated, use --with-maxminddb])], + [AC_MSG_WARN([--with-geoip2 is DEPRECATED and will be removed in a future release, use --with-maxminddb instead])], + [with_geoip2="auto"]) + +# [pairwise: --enable-geoip --with-maxminddb=auto, --enable-geoip --with-maxminddb=yes, --disable-geoip] +AC_ARG_ENABLE([geoip], + [AS_HELP_STRING([--disable-geoip], + [support GeoIP2 geolocation ACLs if available [default=yes]])], + [], [enable_geoip="yes"]) + +# [pairwise: skip] +AC_ARG_WITH([maxminddb], + [AS_HELP_STRING([--with-maxminddb=PATH], + [Build with MaxMind GeoIP2 support (auto|yes|no|path) [default=auto]])], + [], [with_maxminddb="$with_geoip2"]) + +GEOIP2LINKSRCS= +GEOIP2LINKOBJS= +AS_IF([test "$enable_geoip" = "yes"], + [AS_CASE([$with_maxminddb], + [no],[AC_MSG_ERROR([Use '--disable-geoip' to disable the GeoIP])], + [auto],[PKG_CHECK_MODULES([MAXMINDDB], [libmaxminddb], + [AC_DEFINE([HAVE_GEOIP2], [1], [Build with GeoIP2 support]) + PKG_CHECK_VAR([MAXMINDDB_PREFIX], [libmaxminddb], [prefix], [], [AC_MSG_ERROR([libmaxminddb prefix not found in pkg-config; set MAXMINDDB_PREFIX in the environment])]) + GEOIP2LINKSRCS='${GEOIP2LINKSRCS}' + GEOIP2LINKOBJS='${GEOIP2LINKOBJS}' + ],[:])], + [yes],[PKG_CHECK_MODULES([MAXMINDDB], [libmaxminddb], + [AC_DEFINE([HAVE_GEOIP2], [1], [Build with GeoIP2 support]) + PKG_CHECK_VAR([MAXMINDDB_PREFIX], [libmaxminddb], [prefix], [], [AC_MSG_ERROR([libmaxminddb prefix not found in pkg-config; set MAXMINDDB_PREFIX in the environment])]) + GEOIP2LINKSRCS='${GEOIP2LINKSRCS}' + GEOIP2LINKOBJS='${GEOIP2LINKOBJS}' + ])], + [ # default + AX_SAVE_FLAGS([maxminddb]) + MAXMINDDB_CFLAGS="-I$with_maxminddb/include" + MAXMINDDB_LIBS="-L$with_maxminddb/lib" + CFLAGS="$CFLAGS $MAXMINDDB_CFLAGS" + LDFLAGS="$LDFLAGS $MAXMINDDB_LIBS" + AC_SEARCH_LIBS([MMDB_open], [maxminddb], + [AC_DEFINE([HAVE_GEOIP2], [1], [Build with GeoIP2 support]) + GEOIP2LINKSRCS='${GEOIP2LINKSRCS}' + GEOIP2LINKOBJS='${GEOIP2LINKOBJS}' + MAXMINDDB_LIBS="$MAXMINDDB_LIBS $ac_cv_search_MMDB_open" + AC_MSG_NOTICE([GeoIP2 default database path set to $with_maxminddb/share/GeoIP]) + AS_VAR_COPY([MAXMINDDB_PREFIX], [with_maxminddb]) + ], + [AC_MSG_ERROR([GeoIP2 requested, but libmaxminddb not found])]) + AX_RESTORE_FLAGS([maxminddb]) + ]) + AC_ARG_VAR([MAXMINDDB_PREFIX], [value of prefix for MAXMINDDB, overriding pkg-config]) +]) + +AC_SUBST([MAXMINDDB_CFLAGS]) +AC_SUBST([MAXMINDDB_LIBS]) +AC_SUBST([GEOIP2LINKSRCS]) +AC_SUBST([GEOIP2LINKOBJS]) + +# +# Do we have arc4random(), etc ? +# +AC_CHECK_FUNCS(arc4random arc4random_buf arc4random_uniform getrandom) + +AX_PTHREAD + +LIBS="$PTHREAD_LIBS $LIBS" +CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +CC="$PTHREAD_CC" + +AC_CHECK_FUNCS([pthread_attr_getstacksize pthread_attr_setstacksize]) + +# [pairwise: --with-locktype=adaptive, --with-locktype=standard] +AC_ARG_WITH([locktype], + AS_HELP_STRING([--with-locktype=ARG], + [Specify mutex lock type + (adaptive or standard)]), + [], [with_locktype="adaptive"]) + +AS_CASE([$with_locktype], + [adaptive],[ + AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[ + #ifndef _GNU_SOURCE + #define _GNU_SOURCE + #endif + #include <pthread.h> + ]], + [[ + return (PTHREAD_MUTEX_ADAPTIVE_NP); + ]] + )], + [AC_MSG_RESULT([using adaptive lock type]) + AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], 1, + [Support for PTHREAD_MUTEX_ADAPTIVE_NP]) ], + [AC_MSG_RESULT([using standard lock type])] + )], + [standard],[AC_MSG_RESULT([using standard lock type])], + [AC_MSG_ERROR([You must specify "adaptive" or "standard" for --with-locktype.])] + ) + +AC_CHECK_HEADERS([sched.h]) + +AC_SEARCH_LIBS([sched_yield],[rt]) +AC_CHECK_FUNCS([sched_yield pthread_yield pthread_yield_np]) + +# Look for functions relating to thread naming +AC_CHECK_FUNCS([pthread_setname_np pthread_set_name_np]) +AC_CHECK_HEADERS([pthread_np.h], [], [], [#include <pthread.h>]) + +# libuv +PKG_CHECK_MODULES([LIBUV], [libuv >= 1.37.0], [], + [PKG_CHECK_MODULES([LIBUV], [libuv >= 1.0.0 libuv < 1.35.0], [], + [AC_MSG_ERROR([libuv >= 1.0.0 (except 1.35.0 and 1.36.0) not found])])]) + +AX_SAVE_FLAGS([libuv]) +CFLAGS="$CFLAGS $LIBUV_CFLAGS" +LIBS="$LIBS $LIBUV_LIBS" + +# libuv recvmmsg support +AC_CHECK_DECLS([UV_UDP_MMSG_FREE, UV_UDP_MMSG_CHUNK], [], [], [[#include <uv.h>]]) +AC_MSG_CHECKING([whether struct msghdr uses padding for alignment]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <sys/socket.h>], + [const struct msghdr h = { .__pad1 = 0, .__pad2 = 0 };])], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_DECL_UV_UDP_RECVMMSG], + [0], [Disable recvmmsg support on systems with MUSL glibc])], + [AC_MSG_RESULT([no]) + AC_CHECK_DECLS([UV_UDP_RECVMMSG], [], [], [[#include <uv.h>]])]) + +AX_RESTORE_FLAGS([libuv]) + +# +# flockfile is usually provided by pthreads +# +AC_CHECK_FUNCS([flockfile getc_unlocked]) + +# +# Look for sysconf to allow detection of the number of processors. +# +AC_CHECK_FUNCS([sysconf]) + +AC_SUBST(ALWAYS_DEFINES) + +AC_MSG_CHECKING(for libtool) + +# [pairwise: --with-libtool, --without-libtool] +AC_ARG_WITH(libtool, AS_HELP_STRING([--with-libtool], [use GNU libtool]), + use_libtool="$withval", use_libtool="no") +NO_LIBTOOL_ISCLIBS= +NO_LIBTOOL_DNSLIBS= +case $use_libtool in + yes) + AC_MSG_RESULT(yes) + AM_PROG_LIBTOOL + O=lo + A=la + LIBTOOL_MKDEP_SED='s;\.o;\.lo;' + LIBTOOL_MODE_COMPILE='--mode=compile' + LIBTOOL_MODE_INSTALL='--mode=install' + LIBTOOL_MODE_LINK='--mode=link' + LIBTOOL_MODE_UNINSTALL='--mode=uninstall' + INSTALL_LIBRARY='${INSTALL_PROGRAM}' + AC_DEFINE([USE_LIBTOOL],[1],[Define if libtool is used for compilation]) + ;; + *) + AC_MSG_RESULT(no) + O=o + A=a + LIBTOOL= + AC_SUBST(LIBTOOL) + LIBTOOL_MKDEP_SED= + LIBTOOL_MODE_COMPILE= + LIBTOOL_MODE_INSTALL= + LIBTOOL_MODE_LINK= + LIBTOOL_MODE_UNINSTALL= + INSTALL_LIBRARY='${INSTALL_DATA}' + NO_LIBTOOL_ISCLIBS='${NO_LIBTOOL_ISCLIBS}' + NO_LIBTOOL_DNSLIBS='${NO_LIBTOOL_DNSLIBS}' + ;; +esac +AC_SUBST(INSTALL_LIBRARY) +AC_SUBST(NO_LIBTOOL_ISCLIBS) +AC_SUBST(NO_LIBTOOL_DNSLIBS) + +# +# Do we want to use pthread rwlock? +# +# [pairwise: --enable-pthread-rwlock, --disable-pthread-rwlock] +AC_ARG_ENABLE([pthread_rwlock], + [AS_HELP_STRING([--enable-pthread-rwlock], + [use pthread rwlock instead of internal rwlock implementation])], + [], [enable_pthread_rwlock=no]) + +AS_IF([test "$enable_pthread_rwlock" = "yes"], + [AC_CHECK_FUNCS([pthread_rwlock_rdlock], [], + [AC_MSG_ERROR([pthread_rwlock_rdlock requested but not found])]) + AC_DEFINE([USE_PTHREAD_RWLOCK],[1],[Define if you want to use pthread rwlock implementation]) + ]) + +CRYPTO=OpenSSL + +# +# OpenSSL/LibreSSL is mandatory +# +PKG_CHECK_MODULES([OPENSSL], [libssl libcrypto], [], + [AX_CHECK_OPENSSL([:],[AC_MSG_FAILURE([OpenSSL/LibreSSL not found])])]) + +AX_SAVE_FLAGS([openssl]) + +# +# This maintenance branch of BIND 9 does not support new OpenSSL APIs +# introduced in version 3.0.0. Suppress compiler warnings about using +# functions deprecated in newer OpenSSL versions as they will not be +# addressed in BIND 9.16. +# +OPENSSL_CFLAGS="$OPENSSL_CFLAGS -DOPENSSL_SUPPRESS_DEPRECATED" + +CFLAGS="$CFLAGS $OPENSSL_CFLAGS" +LIBS="$LIBS $OPENSSL_LIBS" + +AC_MSG_CHECKING([for OpenSSL >= 1.0.0 or LibreSSL >= 2.7.0]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include <openssl/opensslv.h>]], + [[#if (!defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER < 0x1000000fL)) || \\ + (defined(LIBRESSL_VERSION_NUMBER) && (LIBRESSL_VERSION_NUMBER < 0x02070000fL)) + #error OpenSSL >= 1.0.0 or LibreSSL >= 2.7.0 required + #endif + ]])], + [AC_MSG_RESULT([yes])], + [AC_MSG_FAILURE([not found])]) + +# +# Check for functions added in OpenSSL or LibreSSL +# + +AC_CHECK_FUNCS([OPENSSL_init_ssl OPENSSL_init_crypto OPENSSL_cleanup]) +AC_CHECK_FUNCS([CRYPTO_zalloc]) +AC_CHECK_FUNCS([EVP_CIPHER_CTX_new EVP_CIPHER_CTX_free]) +AC_CHECK_FUNCS([EVP_MD_CTX_new EVP_MD_CTX_free EVP_MD_CTX_reset]) +AC_CHECK_FUNCS([HMAC_CTX_new HMAC_CTX_free HMAC_CTX_reset HMAC_CTX_get_md]) +AC_CHECK_FUNCS([SSL_read_ex SSL_peek_ex SSL_write_ex]) +AC_CHECK_FUNCS([BIO_read_ex BIO_write_ex]) +AC_CHECK_FUNCS([BN_GENCB_new]) +AC_CHECK_FUNCS([SSL_CTX_up_ref]) +AC_CHECK_FUNCS([SSL_CTX_set_min_proto_version]) + +# +# Check for algorithm support in OpenSSL +# + +AC_CHECK_FUNCS([ECDSA_sign ECDSA_verify], [:], + [AC_MSG_FAILURE([ECDSA support in OpenSSL is mandatory.])]) + +AC_MSG_CHECKING([for ECDSA P-256 support]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include <openssl/evp.h> + #include <openssl/ec.h>]], + [[EC_KEY *key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);]])], + [AC_MSG_RESULT([yes])], + [AC_MSG_FAILURE([not found. ECDSA P-256 support in OpenSSL is mandatory.])]) + +AC_MSG_CHECKING([for ECDSA P-384 support]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include <openssl/evp.h> + #include <openssl/ec.h>]], + [[EC_KEY *key = EC_KEY_new_by_curve_name(NID_secp384r1);]])], + [AC_MSG_RESULT([yes])], + [AC_MSG_FAILURE([not found. ECDSA P-384 support in OpenSSL is mandatory.])]) + +AC_MSG_CHECKING([for Ed25519 support]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include <openssl/evp.h> + #include <openssl/ec.h>]], + [[EC_KEY *key = EC_KEY_new_by_curve_name(NID_ED25519);]])], + [AC_DEFINE([HAVE_OPENSSL_ED25519], [1], [define if OpenSSL supports Ed25519]) + AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no])]) + +AC_MSG_CHECKING([for Ed448 support]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include <openssl/evp.h> + #include <openssl/ec.h>]], + [[EC_KEY *key = EC_KEY_new_by_curve_name(NID_ED448);]])], + [AC_DEFINE([HAVE_OPENSSL_ED448], [1], [define if OpenSSL supports Ed448]) + AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no])]) + +# +# Check for OpenSSL SHA-1 support +# +AC_CHECK_FUNCS([EVP_sha1], [:], + [AC_MSG_FAILURE([SHA-1 support in OpenSSL is mandatory.])]) + +# +# Check for OpenSSL SHA-2 support +# +AC_CHECK_FUNCS([EVP_sha224 EVP_sha256 EVP_sha384 EVP_sha512], [:], + [AC_MSG_FAILURE([SHA-2 support in OpenSSL is mandatory.])]) + +# +# Check for OpenSSL AES support +# +AC_CHECK_FUNCS([EVP_aes_128_ecb EVP_aes_192_ecb EVP_aes_256_ecb], [:], + [AC_MSG_FAILURE([AES support in OpenSSL is mandatory.])]) + +# +# Check for OpenSSL 1.1.x/LibreSSL functions +# +AC_CHECK_FUNCS([DH_get0_key ECDSA_SIG_get0 RSA_set0_key]) + +AC_CHECK_FUNCS([TLS_server_method TLS_client_method]) + +# +# Check whether FIPS mode is available and whether we should enable it +# +# FIPS is not included in pairwise testing as the relevant Docker image +# does not support FIPS mode. +# +# [pairwise: skip] +AC_ARG_ENABLE([fips-mode], + [AS_HELP_STRING([--enable-fips-mode], + [enable FIPS mode in OpenSSL library [default=no]])], + [], [enable_fips_mode="no"]) + +AC_MSG_CHECKING([whether to enable FIPS mode in OpenSSL library]) +AS_CASE([$enable_fips_mode], + [yes], [AC_MSG_RESULT([yes]) + AC_CHECK_FUNCS([FIPS_mode], + [], [AC_MSG_FAILURE([OpenSSL FIPS mode requested but not available.])])], + [no], [AC_MSG_RESULT([no])]) + +AX_RESTORE_FLAGS([openssl]) + +AC_SUBST([OPENSSL_CFLAGS]) +AC_SUBST([OPENSSL_LIBS]) + +PKCS11_TOOLS= +PKCS11_TEST= +PKCS11_MANS= +# +# was --enable-native-pkcs11 specified? +# +# DNSRPS builds are included in pairwise testing here and not later because both +# --enable-native-pkcs11 and --enable-dnsrps-dl require --with-dlopen and the +# ordering of the set of ./configure arguments generated during pairwise testing +# is random. +# +# [pairwise: --enable-native-pkcs11 --enable-dnsrps --enable-dnsrps-dl --with-dlopen, --disable-native-pkcs11 --enable-dnsrps --enable-dnsrps-dl --with-dlopen, --disable-native-pkcs11 --enable-dnsrps --enable-dnsrps-dl --with-dlopen, --disable-native-pkcs11 --disable-dnsrps --without-dlopen] +AC_ARG_ENABLE(native-pkcs11, + AS_HELP_STRING([--enable-native-pkcs11], + [use native PKCS11 for public-key crypto [default=no]]), + [:], [enable_native_pkcs11="no"]) + +AC_MSG_CHECKING([for PKCS11 for Public-Key Cryptography]) +AS_CASE([$enable_native_pkcs11], + [no],[AC_MSG_RESULT([no])], + [yes],[PKCS11_TOOLS=pkcs11 + PKCS11_TEST=pkcs11 + PKCS11_MANS='${pkcs11_man8_MANS}' + CRYPTO=pkcs11 + AS_IF([$use_threads], + [:], + [AC_MSG_ERROR([PKCS11 requires threading support])]) + AC_MSG_RESULT([yes]) + AC_CHECK_FUNCS([getpassphrase]) + ]) +AC_SUBST([PKCS11_TEST]) +AC_SUBST([PKCS11_TOOLS]) +AC_SUBST([PKCS11_MANS]) + +AC_SUBST([CRYPTO]) +AS_CASE([$CRYPTO], + [pkcs11],[AC_DEFINE([USE_PKCS11], [1], [define if PKCS11 is used for Public-Key Cryptography])], + [AC_DEFINE([USE_OPENSSL], [1], [define if OpenSSL is used for Public-Key Cryptography])]) + +# preparation for automake +# AM_CONDITIONAL([PKCS11_TOOLS], [test "$with_native_pkcs11" = "yes"]) + +# +# was --with-pkcs11 specified? +# +# [pairwise: skip] +AC_ARG_WITH([pkcs11], + [AS_HELP_STRING([--with-pkcs11[=PATH]], + [Build with PKCS11 support [no|path] (PATH is for the PKCS11 provider)])], + [:], [with_pkcs11="undefined"]) + +AS_CASE([$with_pkcs11], + [yes|auto],[AC_MSG_ERROR([--with-pkcs11 needs explicit path to the PKCS11 library])], + [no|undefined],[with_pkcs11="undefined"]) +AC_DEFINE_UNQUOTED([PK11_LIB_LOCATION], ["$with_pkcs11"], [define the default PKCS11 library path]) + +# for PKCS11 benchmarks + +have_clock_gt=no +AC_CHECK_FUNC(clock_gettime,have_clock_gt=yes,) +if test "no" = "$have_clock_gt"; then + AC_CHECK_LIB(rt,clock_gettime,have_clock_gt=rt,) +fi + +if test "no" != "$have_clock_gt"; then + AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [Define if clock_gettime is available.]) +fi + +if test "rt" = "$have_clock_gt"; then + LIBS="-lrt $LIBS" +fi + +AC_MSG_CHECKING(for GSSAPI library) + +# [pairwise: --with-gssapi=yes, --with-gssapi=auto, --without-gssapi] +AC_ARG_WITH(gssapi, + AS_HELP_STRING([--with-gssapi=[PATH|[/path/]krb5-config]], + [Specify path for system-supplied GSSAPI + [default=auto]]), + use_gssapi="$withval", use_gssapi="auto") + +# first try using krb5-config, if that does not work then fall back to "yes" method. + +case "$use_gssapi" in +*/krb5-config|krb5-config) + AC_MSG_RESULT(trying $use_gssapi) + if test krb5-config = "$use_gssapi" + then + AC_PATH_PROG(KRB5_CONFIG, $use_gssapi) + else + KRB5_CONFIG="$use_gssapi" + fi + gssapi_cflags=`$KRB5_CONFIG --cflags gssapi` + gssapi_libs=`$KRB5_CONFIG --libs gssapi` + krb5_cflags=`$KRB5_CONFIG --cflags krb5` + krb5_libs=`$KRB5_CONFIG --libs krb5` + saved_cppflags="$CPPFLAGS" + CPPFLAGS="$gssapi_cflags $krb5_cflags $CPPFLAGS" + AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h, + [ISC_PLATFORM_GSSAPIHEADER="#define ISC_PLATFORM_GSSAPIHEADER <$ac_header>"]) + if test "" = "$ISC_PLATFORM_GSSAPIHEADER"; then + AC_MSG_RESULT([krb5-config: gssapi.h not found]) + CPPFLAGS="$saved_cppflags" + use_gssapi="yes" + else + AC_CHECK_HEADERS(krb5/krb5.h krb5.h, + [ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <$ac_header>"]) + if test "" = "$ISC_PLATFORM_KRB5HEADER"; then + AC_MSG_RESULT([krb5-config: krb5.h not found]) + CPPFLAGS="$saved_cppflags" + use_gssapi="yes" + else + CPPFLAGS="$saved_cppflags" + saved_libs="$LIBS" + LIBS="$gssapi_libs $krb5_libs $LIBS" + AC_MSG_CHECKING([krb5-config linking as $LIBS]) + AC_TRY_LINK( , [gss_acquire_cred();krb5_init_context()], + gssapi_linked=yes, gssapi_linked=no) + case $gssapi_linked in + yes) AC_MSG_RESULT([krb5-config: linked]);; + no) AC_MSG_RESULT([krb5-config: could not determine proper GSSAPI linkage]) + use_gssapi="yes" + ;; + esac + LIBS=$saved_libs + fi + fi + if test "yes" = "$use_gssapi"; then + AC_MSG_CHECKING([for GSSAPI library, non krb5-config method]) + fi + ;; +esac + +case "$host" in +*darwin*) + if test "yes" = "$use_gssapi" -o "auto" = "$use_gssapi" + then + use_gssapi=framework + fi + ;; +esac + +# gssapi is just the framework, we really require kerberos v5, so +# look for those headers (the gssapi headers must be there, too) +# The problem with this implementation is that it doesn't allow +# for the specification of gssapi and krb5 headers in different locations, +# which probably ought to be fixed although fixing might raise the issue of +# trying to build with incompatible versions of gssapi and krb5. +if test "yes" = "$use_gssapi" -o "auto" = "$use_gssapi" +then + # first, deal with the obvious + if test \( -f /usr/include/kerberosv5/krb5.h -o \ + -f /usr/include/krb5/krb5.h -o \ + -f /usr/include/krb5.h \) -a \ + \( -f /usr/include/gssapi.h -o \ + -f /usr/include/gssapi/gssapi.h \) + then + use_gssapi=/usr + else + krb5dirs="/usr/local /usr/local/krb5 /usr/local/kerberosv5 /usr/local/kerberos /usr/pkg /usr/krb5 /usr/kerberosv5 /usr/kerberos /usr" + for d in $krb5dirs + do + if test -f $d/include/gssapi/gssapi_krb5.h -o \ + -f $d/include/krb5.h + then + if test -f $d/include/gssapi/gssapi.h -o \ + -f $d/include/gssapi.h + then + use_gssapi=$d + break + fi + fi + done + if test "auto" = "$use_gssapi" + then + use_gssapi="no" + fi + fi +fi + +case "$use_gssapi" in + no) + AC_MSG_RESULT(disabled) + USE_GSSAPI='' + ;; + yes) + AC_MSG_ERROR([--with-gssapi must specify a path]) + ;; + */krb5-config|krb5-config) + USE_GSSAPI='-DGSSAPI' + DST_GSSAPI_INC="$gssapi_cflags $krb5_cflags" + DNS_GSSAPI_LIBS="$gssapi_libs $krb5_libs" + ;; + framework) + USE_GSSAPI='-DGSSAPI' + ISC_PLATFORM_GSSAPIHEADER="#define ISC_PLATFORM_GSSAPIHEADER <Kerberos/Kerberos.h>" + ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <Kerberos/Kerberos.h>" + DNS_GSSAPI_LIBS="-framework Kerberos" + AC_MSG_RESULT(framework) + ;; + + *) + AC_MSG_RESULT(looking in $use_gssapi/lib) + USE_GSSAPI='-DGSSAPI' + saved_cppflags="$CPPFLAGS" + CPPFLAGS="-I$use_gssapi/include $CPPFLAGS" + AC_CHECK_HEADERS(gssapi.h gssapi/gssapi.h, + [ISC_PLATFORM_GSSAPIHEADER="#define ISC_PLATFORM_GSSAPIHEADER <$ac_header>" + gssapi_hack="#include <$ac_header>"]) + + if test "" = "$ISC_PLATFORM_GSSAPIHEADER"; then + AC_MSG_ERROR([gssapi.h not found]) + fi + + AC_CHECK_HEADERS(gssapi_krb5.h gssapi/gssapi_krb5.h, + [ISC_PLATFORM_GSSAPI_KRB5_HEADER="#define ISC_PLATFORM_GSSAPI_KRB5_HEADER <$ac_header>" + gssapi_krb5_hack="#include <$ac_header>"]) + + AC_CHECK_HEADERS(krb5.h krb5/krb5.h kerberosv5/krb5.h, + [ISC_PLATFORM_KRB5HEADER="#define ISC_PLATFORM_KRB5HEADER <$ac_header>" + krb5_hack="#include <$ac_header>"]) + + if test "" = "$ISC_PLATFORM_KRB5HEADER"; then + AC_MSG_ERROR([krb5.h not found]) + fi + + # + # XXXDCL This probably doesn't work right on all systems. + # It will need to be worked on as problems become evident. + # + # Essentially the problems here relate to two different + # areas. The first area is building with either KTH + # or MIT Kerberos, particularly when both are present on + # the machine. The other is static versus dynamic linking. + # + # On the KTH vs MIT issue, Both have libkrb5 that can mess + # up the works if one implementation ends up trying to + # use the other's krb. This is unfortunately a situation + # that very easily arises. + # + # Dynamic linking when the dependency information is built + # into MIT's libgssapi_krb5 or KTH's libgssapi magically makes + # all such problems go away, but when that setup is not + # present, because either the dynamic libraries lack + # dependencies or static linking is being done, then the + # problems start to show up. + saved_libs="$LIBS" + for TRY_LIBS in \ + "-lgssapi_krb5" \ + "-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err" \ + "-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lresolv" \ + "-lgssapi" \ + "-lgssapi -lkrb5 -ldes -lcrypt -lasn1 -lroken -lcom_err" \ + "-lgssapi -lkrb5 -lcrypt -lasn1 -lroken -lcom_err" \ + "-lgssapi -lkrb5 -lgssapi_krb5 -lcrypt -lasn1 -lroken -lcom_err" \ + "-lgssapi -lkrb5 -lhx509 -lcrypt -lasn1 -lroken -lcom_err" \ + "-lgss -lkrb5" + do + # Note that this does not include $saved_libs, because + # on FreeBSD machines this configure script has added + # -L/usr/local/lib to LIBS, which can make the + # -lgssapi_krb5 test succeed with shared libraries even + # when you are trying to build with KTH in /usr/lib. + if test "/usr" = "$use_gssapi" + then + LIBS="$TRY_LIBS $ISC_OPENSSL_LIBS" + else + LIBS="-L$use_gssapi/lib $TRY_LIBS $ISC_OPENSSL_LIBS" + fi + AC_MSG_CHECKING(linking as $TRY_LIBS) + AC_TRY_LINK([ +#include <sys/types.h> +$gssapi_hack +$gssapi_krb5_hack +$krb5_hack + ] , [gss_acquire_cred(NULL, NULL, 0, NULL, 0, NULL, NULL, NULL);krb5_init_context(NULL); +#if defined(HAVE_GSSAPI_KRB5_H) || defined(HAVE_GSSAPI_GSSAPI_KRB5_H) +gsskrb5_register_acceptor_identity(NULL); +#endif], + gssapi_linked=yes, gssapi_linked=no) + case $gssapi_linked in + yes) AC_MSG_RESULT(yes); break ;; + no) AC_MSG_RESULT(no) ;; + esac + done + + CPPFLAGS="$saved_cppflags" + + case $gssapi_linked in + no) AC_MSG_ERROR(could not determine proper GSSAPI linkage) ;; + esac + + # + # XXXDCL Major kludge. Tries to cope with KTH in /usr/lib + # but MIT in /usr/local/lib and trying to build with KTH. + # /usr/local/lib can end up earlier on the link lines. + # Like most kludges, this one is not only inelegant it + # is also likely to be the wrong thing to do at least as + # many times as it is the right thing. Something better + # needs to be done. + # + if test "/usr" = "$use_gssapi" -a \ + -f /usr/local/lib/libkrb5.a; then + FIX_KTH_VS_MIT=yes + fi + + case "$FIX_KTH_VS_MIT" in + yes) + case "$enable_static_linking" in + yes) gssapi_lib_suffix=".a" ;; + *) gssapi_lib_suffix=".so" ;; + esac + + for lib in $LIBS; do + case $lib in + -L*) + ;; + -l*) + new_lib=`echo $lib | + sed -e s%^-l%$use_gssapi/lib/lib% \ + -e s%$%$gssapi_lib_suffix%` + NEW_LIBS="$NEW_LIBS $new_lib" + ;; + *) + AC_MSG_ERROR([KTH vs MIT Kerberos confusion!]) + ;; + esac + done + LIBS="$NEW_LIBS" + ;; + esac + + DST_GSSAPI_INC="-I$use_gssapi/include" + DNS_GSSAPI_LIBS="$LIBS" + + AC_MSG_RESULT(using GSSAPI from $use_gssapi/lib and $use_gssapi/include) + LIBS="$saved_libs" + ;; +esac + +AC_SUBST(ISC_PLATFORM_GSSAPIHEADER) +AC_SUBST(ISC_PLATFORM_GSSAPI_KRB5_HEADER) +AC_SUBST(ISC_PLATFORM_KRB5HEADER) + +AC_SUBST(USE_GSSAPI) +AC_SUBST(DST_GSSAPI_INC) +AC_SUBST(DNS_GSSAPI_LIBS) +DNS_CRYPTO_LIBS="$DNS_GSSAPI_LIBS" + +# +# Applications linking with libdns also need to link with these libraries. +# + +AC_SUBST(DNS_CRYPTO_LIBS) + +# +# was --with-lmdb specified? +# +AC_MSG_CHECKING(for lmdb library) + +# [pairwise: --with-lmdb=auto, --with-lmdb=yes, --without-lmdb] +AC_ARG_WITH(lmdb, + AS_HELP_STRING([--with-lmdb[=PATH]], + [build with LMDB library [yes|no|path]]), + use_lmdb="$withval", use_lmdb="auto") + +have_lmdb="" +case "$use_lmdb" in + no) + LMDB_LIBS="" + ;; + auto|yes) + for d in /usr /usr/local /opt/local + do + if test -f "${d}/include/lmdb.h" + then + if test ${d} != /usr + then + LMDB_CFLAGS="-I ${d}/include" + LMDB_LIBS="-L${d}/lib" + fi + have_lmdb="yes" + fi + done + ;; + *) + if test -f "${use_lmdb}/include/lmdb.h" + then + LMDB_CFLAGS="-I${use_lmdb}/include" + LMDB_LIBS="-L${use_lmdb}/lib" + have_lmdb="yes" + else + AC_MSG_ERROR([$use_lmdb/include/lmdb.h not found.]) + fi + ;; +esac + +if test "X${have_lmdb}" != "X" +then + AC_MSG_RESULT(yes) + AX_SAVE_FLAGS([lmdb]) + CFLAGS="$CFLAGS $LMDB_CFLAGS" + LIBS="$LIBS $LMDB_LIBS" + AC_SEARCH_LIBS([mdb_env_create], [lmdb], [], + [AC_MSG_ERROR([found lmdb include but not library.]) + have_lmdb=""]) + LMDB_LIBS="$LMDB_LIBS $ac_cv_search_mdb_env_create" + AX_RESTORE_FLAGS([lmdb]) +elif test "X$use_lmdb" = Xyes +then + AC_MSG_ERROR([include/lmdb.h not found.]) +else + AC_MSG_RESULT(no) +fi +AC_SUBST([LMDB_CFLAGS]) +AC_SUBST([LMDB_LIBS]) + +NZD_TOOLS="" +NZDSRCS= +NZDTARGETS= +if test "X${have_lmdb}" != "X" +then + AC_DEFINE(HAVE_LMDB, 1, [Define if lmdb was found]) + NZD_TOOLS="nzd" + NZDSRCS='${NZDSRCS}' + NZDTARGETS='${NZDTARGETS}' + NZD_MANS='${nzd_man8_MANS}' +fi +AC_SUBST(NZD_TOOLS) +AC_SUBST(NZDSRCS) +AC_SUBST(NZDTARGETS) +AC_SUBST(NZD_MANS) + +# +# was --with-libxml2 specified? +# +# [pairwise: --with-libxml2=auto, --with-libxml2=yes, --without-libxml2] +AC_ARG_WITH([libxml2], + [AS_HELP_STRING([--with-libxml2], + [build with libxml2 library [yes|no|auto] (default is auto)])], + [], [with_libxml2="auto"]) + +AS_CASE([$with_libxml2], + [no],[], + [auto],[PKG_CHECK_MODULES([LIBXML2], [libxml-2.0 >= 2.6.0], + [AC_DEFINE([HAVE_LIBXML2], [1], [Use libxml2 library])], + [:])], + [yes],[PKG_CHECK_MODULES([LIBXML2], [libxml-2.0 >= 2.6.0], + [AC_DEFINE([HAVE_LIBXML2], [1], [Use libxml2 library])])], + [AC_MSG_ERROR([Specifying libxml2 installation path is not supported, adjust PKG_CONFIG_PATH instead])]) + +# +# DEPRECATED +# +# [pairwise: skip] +AC_ARG_WITH([libjson], + [AS_HELP_STRING([--with-libjson], + [deprecated, use --with-json-c])], + [AC_MSG_WARN([--with-libjson is DEPRECATED and will be removed in a future release, use --with-json-c instead])], + [with_libjson="detect"]) + +# +# was --with-json-c specified? +# +# [pairwise: --with-json-c=detect, --with-json-c=yes, --without-json-c] +AC_ARG_WITH([json-c], + [AS_HELP_STRING([--with-json-c], + [build with json-c library [yes|no|detect] (default is detect)])], + [], [with_json_c="$with_libjson"]) + +AS_CASE([$with_json_c], + [no],[], + [detect],[PKG_CHECK_MODULES([JSON_C], [json-c >= 0.11], + [AC_DEFINE([HAVE_JSON_C], [1], [Use json-c library])], + [:])], + [yes],[PKG_CHECK_MODULES([JSON_C], [json-c >= 0.11], + [AC_DEFINE([HAVE_JSON_C], [1], [Use json-c library])])], + [AC_MSG_ERROR([Specifying json-c installation path is not supported, adjust PKG_CONFIG_PATH instead])] + ) + +AC_SUBST([JSON_C_CFLAGS]) +AC_SUBST([JSON_C_LIBS]) + +# [pairwise: --with-zlib=auto, --with-zlib=yes, --without-zlib] +AC_ARG_WITH([zlib], + [AS_HELP_STRING([--with-zlib], + [build with zlib for HTTP compression + [default=yes]])], + [], with_zlib="auto") + +AS_CASE([$with_zlib], + [no],[], + [auto],[PKG_CHECK_MODULES([ZLIB], [zlib], + [AC_DEFINE([HAVE_ZLIB], [1], [Use zlib library])], + [:])], + [yes],[PKG_CHECK_MODULES([ZLIB], [zlib], + [AC_DEFINE([HAVE_ZLIB], [1], [Use zlib library])])], + [AC_MSG_ERROR([Specifying zlib installation path is not supported, adjust PKG_CONFIG_PATH instead])]) +AC_SUBST([ZLIB_CFLAGS]) +AC_SUBST([ZLIB_LIBS]) + +# +# In solaris 10, SMF can manage named service +# +AC_CHECK_LIB(scf, smf_enable_instance) + +# +# Additional compiler settings. +# +MKDEPCC="$CC" + +MKDEPCFLAGS="-M" +AS_CASE([$host], + [*-solaris*],[ + AS_IF([test "$GCC" != "yes"], + [MKDEPCFLAGS="-xM"])]) + +AS_IF([test "$GCC" = "yes"], + [STD_CWARNINGS="$STD_CWARNINGS -W -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wformat -Wpointer-arith -Wno-missing-field-initializers"] + ) + +AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing], + [STD_CWARNINGS="$STD_CWARNINGS -fno-strict-aliasing"]) +AX_CHECK_COMPILE_FLAG([-Werror -fno-delete-null-pointer-checks], + [STC_CWARNINGS="$STD_CWARNINGS -fno-delete-null-pointer-checks"]) +AS_IF([test "$enable_warn_shadow" = "yes"], + [AX_CHECK_COMPILE_FLAG([-Wshadow], + [STD_CWARNINGS="$STD_CWARNINGS -Wshadow"])]) +AS_IF([test "$enable_warn_error" = "yes"], + [AX_CHECK_COMPILE_FLAG([-Werror], + [STD_CWARNINGS="$STD_CWARNINGS -Werror"])]) + +AC_SUBST([MKDEPCC]) +AC_SUBST([MKDEPCFLAGS]) +AC_SUBST([MKDEPPROG]) + +# +# -lxnet buys us one big porting headache... standards, gotta love 'em. +# +# AC_CHECK_LIB(xnet, socket, , +# AC_CHECK_LIB(socket, socket) +# ) +# +# Use this for now, instead: +# +case "$host" in + *-linux*) + ;; + *) + AC_CHECK_LIB(socket, socket) + AC_CHECK_LIB(nsl, inet_addr) + ;; +esac + +# +# Work around Solaris's select() limitations. +# +case "$host" in + *-solaris2.[[89]]|*-solaris2.1?) + AC_DEFINE(FD_SETSIZE, 65536, + [Solaris hack to get select_large_fdset.]) + ;; +esac + +# +# Purify support +# +AC_MSG_CHECKING(whether to use purify) + +# Purify is not included in pairwise testing as that tool is not present +# in the relevant Docker image. +# +# [pairwise: skip] +AC_ARG_WITH(purify, + AS_HELP_STRING([--with-purify[=PATH]],[use Rational purify]), + use_purify="$withval", use_purify="no") + +case "$use_purify" in + no) + ;; + yes) + AC_PATH_PROG(purify_path, purify, purify) + ;; + *) + purify_path="$use_purify" + ;; +esac + +case "$use_purify" in + no) + AC_MSG_RESULT(no) + PURIFY="" + ;; + *) + if test -f "$purify_path" || test purify = "$purify_path"; then + AC_MSG_RESULT($purify_path) + PURIFYFLAGS="`echo $PURIFYOPTIONS`" + PURIFY="$purify_path $PURIFYFLAGS" + else + AC_MSG_ERROR([$purify_path not found. + +Please choose the proper path with the following command: + + configure --with-purify=PATH +]) + fi + ;; +esac + +AC_SUBST(PURIFY) + +# +# Google/Great Performance Tools CPU Profiler +# +AC_MSG_CHECKING(whether to use gperftools profiler) + +# Google/Great Performance Tools CPU Profiler is not included in +# pairwise testing as that tool is not present in the relevant Docker +# image. +# +# [pairwise: skip] +AC_ARG_WITH(gperftools-profiler, + AS_HELP_STRING([--with-gperftools-profiler], + [use gperftools CPU profiler]), + use_profiler="$withval", use_profiler="no") + +case $use_profiler in + yes) + AC_MSG_RESULT(yes) + AC_DEFINE([HAVE_GPERFTOOLS_PROFILER], 1, + [Define to use gperftools CPU profiler.]) + LIBS="$LIBS -lprofiler" + ;; + *) + AC_MSG_RESULT(no) + ;; +esac + +# +# enable/disable dumping stack backtrace. Also check if the system supports +# glibc-compatible backtrace() function. +# +# [pairwise: --enable-backtrace, --disable-backtrace] +AC_ARG_ENABLE([backtrace], + [AS_HELP_STRING([--enable-backtrace], + [log stack backtrace on abort [default=yes]])], + [], [enable_backtrace="yes"]) + +AS_IF([test "$enable_backtrace" = "yes"], + [AC_DEFINE([USE_BACKTRACE], [1], [define if we can use backtrace]) + AC_CHECK_LIB(execinfo,backtrace,EXILIBS=-lexecinfo,EXILIBS=) + LIBS="$LIBS $EXILIBS" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include <execinfo.h>]], + [[return (backtrace((void **)0, 0));]] + )], + [AC_DEFINE([HAVE_LIBCTRACE], [1], [define if system have backtrace function])], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include <stddef.h>]], + [[return _Unwind_Backtrace(NULL, NULL);]] + )], + [AC_DEFINE([HAVE_UNWIND_BACKTRACE], [1], [define if the compiler supports _Unwind_Backtrace()])] + )] + )]) + +# [pairwise: --enable-symtable, --disable-symtable] +AC_ARG_ENABLE(symtable, + AS_HELP_STRING([--enable-symtable], + [use internal symbol table for backtrace + [all|minimal(default)|none]]), + want_symtable="$enableval", want_symtable="minimal") +case $want_symtable in +yes|all|minimal) # "yes" is a hidden value equivalent to "minimal" + if test "" = "$PERL" + then + AC_MSG_ERROR([Internal symbol table requires perl but no perl is found. +Install perl or explicitly disable the feature by --disable-symtable.]) + fi + if test "yes" = "$use_libtool"; then + AC_MSG_WARN([Internal symbol table does not work with libtool. Disabling symbol table.]) + else + # we generate the internal symbol table only for those systems + # known to work to avoid unexpected build failure. Also, warn + # about unsupported systems when the feature is enabled + # manually. + case $host_os in + freebsd*|netbsd*|openbsd*|linux*|solaris*|darwin*) + MKSYMTBL_PROGRAM="$PERL" + if test "all" = "$want_symtable"; then + ALWAYS_MAKE_SYMTABLE="yes" + fi + ;; + *) + if test "yes" = "$want_symtable" -o "all" = "$want_symtable" + then + AC_MSG_WARN([this system is not known to generate internal symbol table safely; disabling it]) + fi + esac + fi + ;; +*) + ;; +esac +AC_SUBST(MKSYMTBL_PROGRAM) +AC_SUBST(ALWAYS_MAKE_SYMTABLE) + +# +# File name extension for static archive files, for those few places +# where they are treated differently from dynamic ones. +# +SA=a + +AC_SUBST(O) +AC_SUBST(A) +AC_SUBST(SA) +AC_SUBST(LIBTOOL_MKDEP_SED) +AC_SUBST(LIBTOOL_MODE_COMPILE) +AC_SUBST(LIBTOOL_MODE_INSTALL) +AC_SUBST(LIBTOOL_MODE_LINK) +AC_SUBST(LIBTOOL_MODE_UNINSTALL) + +BIND9_CO_RULE=".c.$O:" +AC_SUBST(BIND9_CO_RULE) + +# +# Here begins a very long section to determine the system's networking +# capabilities. The order of the tests is significant. +# + +# +# We do the IPv6 compilation checking after libtool so that we can put +# the right suffix on the files. +# +AC_MSG_CHECKING([for IPv6 structures]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[ + #include <sys/types.h> + #include <sys/socket.h> + #include <netinet/in.h> + ]], + [[ + struct sockaddr_in6 sin6; + struct in6_addr in6; + struct in6_pktinfo in6_pi; + struct sockaddr_storage storage; + in6 = in6addr_any; + in6 = in6addr_loopback; + sin6.sin6_scope_id = 0; + return (0); + ]])], + [AC_MSG_RESULT([yes])], + [AC_MSG_FAILURE([IPv6 support is mandatory])]) + +# +# Allow forcibly disabling TCP Fast Open support as autodetection might yield +# confusing results on some systems (e.g. FreeBSD; see set_tcp_fastopen() +# comment in lib/isc/unix/socket.c). +# +# [pairwise: --enable-tcp-fastopen, --disable-tcp-fastopen] +AC_ARG_ENABLE([tcp_fastopen], + [AS_HELP_STRING([--disable-tcp-fastopen], + [disable TCP Fast Open support [default=yes]])], + [], [enable_tcp_fastopen="yes"]) + +AS_IF([test "$enable_tcp_fastopen" = "yes"], + [AC_DEFINE([ENABLE_TCP_FASTOPEN], [1], [define if you want TCP_FASTOPEN enabled if available])]) + +# +# Check for some other useful functions that are not ever-present. +# +AC_CHECK_FUNCS([strlcpy strlcat strnstr]) + +AC_SUBST(READLINE_LIB) + +# [pairwise: --with-readline=auto, --with-readline=yes, --without-readline] +AC_ARG_WITH(readline, + AS_HELP_STRING([--with-readline[=LIBSPEC]], + [specify readline library [default auto]]), + use_readline="$withval", use_readline="auto") +case "$use_readline" in +no) ;; +*) + saved_LIBS="$LIBS" + case "$use_readline" in + yes|auto) try_readline="-ledit"; or_readline="-lreadline" ;; + *) try_readline="$use_readline" + esac + for readline in "$try_readline" $or_readline + do + LIBS="$readline" + AC_MSG_NOTICE(checking for readline with $readline) + AC_CHECK_FUNCS(readline) + if test "yes" = "$ac_cv_func_readline" + then + READLINE_LIB="$readline" + break + fi + for lib in -lterminfo -ltermcap -lncurses -lcurses + do + AC_MSG_NOTICE(checking for readline with $readline $lib) + unset ac_cv_func_readline + LIBS="$readline $lib" + AC_CHECK_FUNCS(readline) + if test "yes" = "$ac_cv_func_readline" + then + READLINE_LIB="$readline $lib" + break + fi + done + if test "yes" = "$ac_cv_func_readline" + then + break + fi + done + if test "auto" != "$use_readline" && + test "X$READLINE_LIB" = "X" + then + AC_MSG_ERROR([The readline library was not found.]) + fi + LIBS="$saved_LIBS" + ;; +esac +if test "yes" = "$ac_cv_func_readline" +then + case "$READLINE_LIB" in + *edit*) + AC_CHECK_HEADERS(editline/readline.h) + AC_CHECK_HEADERS(edit/readline/readline.h) + AC_CHECK_HEADERS(edit/readline/history.h) + ;; + esac + AC_CHECK_HEADERS(readline/readline.h) + AC_CHECK_HEADERS(readline/history.h) +fi + +AC_SUBST(DST_EXTRA_OBJS) +AC_SUBST(DST_EXTRA_SRCS) + +# +# Security Stuff +# +# Note it is very recommended to *not* disable chroot(), +# this is only because chroot() was made obsolete by Posix. +# +# [pairwise: --enable-chroot, --disable-chroot] +AC_ARG_ENABLE(chroot, AS_HELP_STRING([--disable-chroot], [disable chroot])) +case "$enable_chroot" in + yes|'') + AC_CHECK_FUNCS(chroot) + ;; + no) + ;; +esac + +LIBCAP_LIBS="" +AC_MSG_CHECKING([whether to enable Linux capabilities]) + +# [pairwise: --enable-linux-caps, --disable-linux-caps] +AC_ARG_ENABLE([linux-caps], + [AS_HELP_STRING([--disable-linux-caps], + [disable Linux capabilities])], + [], + [AS_CASE([$host], + [*-linux*],[enable_linux_caps=yes], + [enable_linux_caps=no])]) + +AS_IF([test "$enable_linux_caps" = "yes"], + [AC_MSG_RESULT([yes]) + AC_CHECK_HEADERS([sys/capability.h], + [], + [AC_MSG_ERROR(m4_normalize([sys/capability.h header is required for Linux capabilities support. + Either install libcap or use --disable-linux-caps.]))]) + AX_SAVE_FLAGS([cap]) + AC_SEARCH_LIBS([cap_set_proc], [cap], + [LIBCAP_LIBS="$ac_cv_search_cap_set_proc"], + [AC_MSG_ERROR(m4_normalize([libcap is required for Linux capabilities support. + Either install libcap or use --disable-linux-caps.]))]) + AX_RESTORE_FLAGS([cap])], + [AC_MSG_RESULT([no])]) +AC_SUBST([LIBCAP_LIBS]) + +AC_CHECK_HEADERS(sys/un.h, +ISC_PLATFORM_HAVESYSUNH="#define ISC_PLATFORM_HAVESYSUNH 1" +, +ISC_PLATFORM_HAVESYSUNH="#undef ISC_PLATFORM_HAVESYSUNH" +) +AC_SUBST(ISC_PLATFORM_HAVESYSUNH) + +case "$host" in +*-solaris*) + AC_DEFINE(NEED_SECURE_DIRECTORY, 1, + [Define if connect does not honour the permission on the UNIX domain socket.]) + ;; +esac + +# +# Time Zone Stuff +# +AC_CHECK_FUNCS([tzset]) + +AC_MSG_CHECKING(for optarg declaration) +AC_TRY_COMPILE([ +#include <unistd.h> +], +[optarg = 0;], +[AC_MSG_RESULT(yes)], +[AC_MSG_RESULT(no) +GEN_NEED_OPTARG="-DNEED_OPTARG=1" +AC_DEFINE(NEED_OPTARG, 1, [Defined if extern char *optarg is not declared.])]) + +# +# Check for nanoseconds in file stats +# +AC_MSG_CHECKING([for st_mtim.tv_nsec]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include <sys/fcntl.h>]], + [[struct stat s; + return(s.st_mtim.tv_nsec); + ]])], + [AC_DEFINE([HAVE_STAT_NSEC], [1], [define if struct stat has st_mtim.tv_nsec field])]) + +# +# Check for if_nametoindex() for IPv6 scoped addresses support +# +AC_CHECK_FUNCS([if_nametoindex]) + +ISC_ATOMIC_LIBS="" +AC_CHECK_HEADERS( + [stdatomic.h], + [AC_MSG_CHECKING([for memory model aware atomic operations]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include <stdatomic.h>]], + [[atomic_int_fast32_t val = 0; atomic_fetch_add_explicit(&val, 1, memory_order_relaxed);]] + )], + [AC_MSG_RESULT([stdatomic.h]) + AC_MSG_CHECKING([whether -latomic is needed for 64-bit stdatomic.h functions]) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include <stdatomic.h>]], + [[atomic_int_fast64_t val = 0; atomic_fetch_add_explicit(&val, 1, memory_order_relaxed);]] + )], + [AC_MSG_RESULT([no])], + [ISC_ATOMIC_LIBS="-latomic" + AX_SAVE_FLAGS([atomic]) + LIBS="$LIBS $ISC_ATOMIC_LIBS" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include <stdatomic.h>]], + [[atomic_int_fast64_t val = 0; atomic_fetch_add_explicit(&val, 1, memory_order_relaxed);]] + )], + [AC_MSG_RESULT([yes])], + [AC_MSG_FAILURE([libatomic needed, but linking with -latomic failed, please fix your toolchain.])]) + AX_RESTORE_FLAGS([atomic]) + ]) + ], + [AC_MSG_FAILURE([stdatomic.h header found, but compilation failed, please fix your toolchain.])] + )], + [AC_MSG_CHECKING([for memory model aware atomic operations]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include <inttypes.h>]], + [[int32_t val = 0; __atomic_fetch_add(&val, 1, __ATOMIC_RELAXED);]] + )], + [AC_MSG_RESULT([__atomic builtins]) + AC_DEFINE([HAVE___ATOMIC], [1], [define if __atomic builtins are not available]) + AC_MSG_CHECKING([whether -latomic is needed for 64-bit __atomic builtins]) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include <inttypes.h>]], + [[int64_t val = 0; __atomic_fetch_add(&val, 1, __ATOMIC_RELAXED);]] + )], + [AC_MSG_RESULT([no])], + [ISC_ATOMIC_LIBS="-latomic" + AX_SAVE_FLAGS([atomic]) + LIBS="$LIBS $ISC_ATOMIC_LIBS" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include <inttypes.h>]], + [[int64_t val = 0; __atomic_fetch_add(&val, 1, __ATOMIC_RELAXED);]] + )], + [AC_MSG_RESULT([yes])], + [AC_MSG_FAILURE([libatomic needed, but linking with -latomic failed, please fix your toolchain.])]) + AX_RESTORE_FLAGS([atomic]) + ]) + ], + [AC_MSG_RESULT([__sync builtins]) + ]) + ]) +LIBS="$LIBS $ISC_ATOMIC_LIBS" + +AC_CHECK_HEADERS([stdalign.h]) + +AC_CHECK_HEADERS([uchar.h]) + +# +# Check for __builtin_unreachable +# +AC_MSG_CHECKING([compiler support for __builtin_unreachable()]) +AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[]], + [[__builtin_unreachable();]] + )], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_BUILTIN_UNREACHABLE], [1], [define if the compiler supports __builtin_unreachable().]) + ], + [AC_MSG_RESULT([no]) + ]) + +# +# Check for __builtin_expect +# +AC_MSG_CHECKING([compiler support for __builtin_expect]) +AC_TRY_LINK(, [ + return (__builtin_expect(1, 1) ? 1 : 0); +], [ + have_builtin_expect=yes + AC_MSG_RESULT(yes) +], [ + have_builtin_expect=no + AC_MSG_RESULT(no) +]) +if test "yes" = "$have_builtin_expect"; then + AC_DEFINE(HAVE_BUILTIN_EXPECT, 1, [Define to 1 if the compiler supports __builtin_expect.]) +fi + +# +# Check for __builtin_clz +# +AC_MSG_CHECKING([compiler support for __builtin_clz]) +AC_TRY_LINK(, [ + return (__builtin_clz(0xff) == 24 ? 1 : 0); +], [ + have_builtin_clz=yes + AC_MSG_RESULT(yes) +], [ + have_builtin_clz=no + AC_MSG_RESULT(no) +]) +if test "yes" = "$have_builtin_clz"; then + AC_DEFINE(HAVE_BUILTIN_CLZ, 1, [Define to 1 if the compiler supports __builtin_clz.]) +fi + +# +# Activate "rrset-order fixed" or not? +# +# [pairwise: --enable-fixed-rrset, --disable-fixed-rrset] +AC_ARG_ENABLE(fixed-rrset, + AS_HELP_STRING([--enable-fixed-rrset], + [enable fixed rrset ordering [default=no]]), + enable_fixed="$enableval", enable_fixed="no") +case "$enable_fixed" in + yes) + AC_DEFINE(DNS_RDATASET_FIXED, 1, + [Define to enable "rrset-order fixed" syntax.]) + ;; + no) + ;; + *) + ;; +esac + +# +# Activate dnstap? +# +# [pairwise: --enable-dnstap, --disable-dnstap] +AC_ARG_ENABLE(dnstap, + AS_HELP_STRING([--enable-dnstap], + [enable dnstap support + (requires fstrm, protobuf-c)]), + use_dnstap=$enableval, use_dnstap=no) + +DNSTAP= +DNSTAPSRCS= +DNSTAPOBJS= +DNSTAPTARGETS= +if test "x$use_dnstap" != "xno"; then + + # [pairwise: skip] + AC_ARG_WITH([protobuf-c], + AS_HELP_STRING([--with-protobuf-c=path], + [Path where protobuf-c is installed, for dnstap]), [ + # workaround for protobuf-c includes at old dir + # before protobuf-c-1.0.0 + if test -f $withval/include/google/protobuf-c/protobuf-c.h + then + PROTOBUF_C_CFLAGS="-I$withval/include/google" + else + PROTOBUF_C_CFLAGS="-I$withval/include" + fi + PROTOBUF_C_LIBS="-L$withval/lib" + AC_PATH_PROG([PROTOC_C], [protoc-c], [], + [$PATH$PATH_SEPARATOR$withval/bin]) + ], [ + # workaround for protobuf-c includes at old dir + # before protobuf-c-1.0.0 + if test -f /usr/include/google/protobuf-c/protobuf-c.h + then + PROTOBUF_C_CFLAGS="-I/usr/include/google" + else + if test -f /usr/local/include/google/protobuf-c/protobuf-c.h + then + PROTOBUF_C_CFLAGS="-I/usr/local/include/google" + PROTOBUF_C_LIBS="-L/usr/local/lib" + elif test -f /opt/local/include/google/protobuf-c/protobuf-c.h + then + PROTOBUF_C_CFLAGS="-I/opt/local/include/google" + PROTOBUF_C_LIBS="-L/opt/local/lib" + fi + fi + AC_PATH_PROG([PROTOC_C],[protoc-c]) + ]) + if test -z "$PROTOC_C"; then + AC_MSG_ERROR([The protoc-c program was not found.]) + fi + + # [pairwise: skip] + AC_ARG_WITH([libfstrm], AS_HELP_STRING([--with-libfstrm=path], + [Path where libfstrm is installed, for dnstap]), [ + FSTRM_CFLAGS="-I$withval/include" + FSTRM_LIBS="-L$withval/lib" + AC_PATH_PROG([FSTRM_CAPTURE], [fstrm_capture], [], [$PATH$PATH_SEPARATOR$withval/bin]) + ],[ + for d in /usr /usr/local /opt/local + do + if test -f "${d}/include/fstrm.h" + then + if test ${d} != /usr + then + FSTRM_CFLAGS="-I${d}/include" + FSTRM_LIBS="-L${d}/lib" + fi + have_fstrm="$d" + break + fi + done + if test -z "$have_fstrm"; then + AC_PATH_PROG([FSTRM_CAPTURE], [fstrm_capture]) + else + AC_PATH_PROG([FSTRM_CAPTURE], [fstrm_capture], [], [$PATH$PATH_SEPARATOR$have_fstrm/bin]) + fi + ]) + AX_SAVE_FLAGS([dnstap]) + CFLAGS="$CFLAGS $PROTOBUF_C_CFLAGS $FSTRM_CFLAGS" + LIBS="$LDFLAGS $PROTOBUF_C_LIBS $FSTRM_LIBS" + + AC_SEARCH_LIBS([fstrm_iothr_init], [fstrm], [], + AC_MSG_ERROR([The fstrm library was not found. Please install fstrm!])) + FSTRM_LIBS="$FSTRM_LIBS $ac_cv_search_fstrm_iothr_init" + + AC_SEARCH_LIBS([protobuf_c_message_pack], [protobuf-c], [], + AC_MSG_ERROR([The protobuf-c library was not found. Please install protobuf-c!])) + PROTOBUF_C_LIBS="$PROTOBUF_C_LIBS $ac_cv_search_protobuf_c_message_pack" + + AX_RESTORE_FLAGS([dnstap]) + AC_DEFINE(HAVE_DNSTAP, 1, [Define to 1 to enable dnstap support]) + DNSTAP=dnstap + DNSTAPSRCS='${DNSTAPSRCS}' + DNSTAPOBJS='${DNSTAPOBJS}' + DNSTAPTARGETS='${DNSTAPTARGETS}' + DNSTAP_MANS='${dnstap_man1_MANS}' +fi +AC_SUBST(DNSTAP) +AC_SUBST(DNSTAPSRCS) +AC_SUBST(DNSTAPOBJS) +AC_SUBST(DNSTAPTARGETS) +AC_SUBST(DNSTAP_MANS) +AC_SUBST([PROTOBUF_C_CFLAGS]) +AC_SUBST([PROTOBUF_C_LIBS]) +AC_SUBST([FSTRM_CFLAGS]) +AC_SUBST([FSTRM_LIBS]) + +# +# The following sets up how non-blocking i/o is established. +# cygwin and solaris 2.x (x<5) require special handling. +# +case "$host" in +*-cygwin*) AC_DEFINE(PORT_NONBLOCK, O_NDELAY);; +*-solaris2.[[01234]]) + AC_DEFINE(PORT_NONBLOCK, O_NONBLOCK) + AC_DEFINE(USE_FIONBIO_IOCTL, 1, + [Defined if you need to use ioctl(FIONBIO) instead a fcntl call to make non-blocking.]) + ;; +*) AC_DEFINE(PORT_NONBLOCK, O_NONBLOCK, + [Sets which flag to pass to open/fcntl to make non-blocking (O_NDELAY/O_NONBLOCK).]) + ;; +esac +# +# Solaris 2.5.1 and earlier cannot bind() then connect() a TCP socket. +# This prevents the source address being set. +# +case "$host" in +*-solaris2.[[012345]]|*-solaris2.5.1) + AC_DEFINE(BROKEN_TCP_BIND_BEFORE_CONNECT, 1, + [Define if you cannot bind() before connect() for TCP sockets.]) + ;; +esac +# +# The following sections deal with tools used for formatting +# the documentation. They are all optional, unless you are +# a developer editing the documentation source. +# + +# +# The following sections deal with tools used for formatting +# the documentation. They are all optional, unless you are +# a developer editing the documentation source. +# + +# +# Look for sphinx-build +# +AC_ARG_VAR([SPHINX_BUILD], [path to sphinx-build binary used to build the documentation]) +AC_PATH_PROG([SPHINX_BUILD], [sphinx-build], [:]) +AM_CONDITIONAL([HAVE_SPHINX_BUILD], [test "$SPHINX_BUILD" != ":"]) + +AC_PATH_PROG([XELATEX], [xelatex], [:]) +AC_PATH_PROG([LATEXMK], [latexmk], [:]) +AM_CONDITIONAL([HAVE_XELATEX], [test "$XELATEX" != ":" && test "$LATEXMK" != ":"]) + +# +# Build the man pages only if we have prebuilt manpages or we can build them from RST sources +# +BUILD_MANPAGES= +AS_IF([test -e doc/man/named.conf.5in || test "$SPHINX_BUILD" != ":"], + [BUILD_MANPAGES=man]) +AC_SUBST([BUILD_MANPAGES]) + +# +# Pull release date from CHANGES file last modification date +# for reproducible builds +# +release_date=`date -u -r CHANGES +%Y-%m-%d` +AC_SUBST([RELEASE_DATE], $release_date) + +# Don't build the documentation if the sphinx-build is not present +PDFTARGET= +HTMLTARGET= +MANSRCS= +AS_IF([test -n "$SPHINX_BUILD"],[ + MANSRCS='$(MANPAGES_IN)' + HTMLTARGET='html dirhtml' + AC_PATH_PROGS([PDFLATEX], [pdflatex], []) + AC_PATH_PROGS([LATEXMK], [latexmk], []) + AS_IF([test -n "$PDFLATEX" && test -n "$LATEXMK"],[ + PDFTARGET='pdf' + ]) + ]) +AC_SUBST([HTMLTARGET]) +AC_SUBST([PDFTARGET]) +AC_SUBST([MANSRCS]) + +# +# Look for Doxygen +# +AC_PATH_PROGS([DOXYGEN], [doxygen]) +AC_SUBST(DOXYGEN) + +# +# Look for curl +# + +AC_PATH_PROG(CURL, curl, curl) +AC_SUBST(CURL) + +# +# Look for xsltproc +# + +AC_PATH_PROG(XSLTPROC, xsltproc, xsltproc) +AC_SUBST(XSLTPROC) + +# +# IDN support using libidn2 +# + +LIBIDN2_CFLAGS= +LIBIDN2_LDFLAGS= +LIBIDN2_LIBS= + +# [pairwise: --with-libidn2=yes, --without-libidn2] +AC_ARG_WITH([libidn2], + [AS_HELP_STRING([--with-libidn2[=PATH]], [enable IDN support using GNU libidn2 [yes|no(default)|path]])], + [with_libidn2="$withval"], [with_libidn2="no"]) +AS_CASE([$with_libidn2], + [yes], [PKG_CHECK_MODULES([LIBIDN2], [libidn2], + [AC_DEFINE([HAVE_LIBIDN2], [1], [Define if libidn2 was found])])], + [no], [], + [*], [AX_SAVE_FLAGS([libidn2]) + LIBIDN2_CFLAGS="-I$with_libidn2/include" + LIBIDN2_LDFLAGS="-L$with_libidn2/lib" + CFLAGS="$LIBIDN2_CFLAGS $CFLAGS" + CPPFLAGS="$LIBIDN2_CFLAGS $CPPFLAGS" + LDFLAGS="$LIBIDN2_LDFLAGS $LDFLAGS" + AC_CHECK_HEADERS([idn2.h], + [], + [AC_MSG_ERROR([idn2.h not found])]) + AC_SEARCH_LIBS([idn2_to_ascii_lz], [idn2], + [LIBIDN2_LIBS="$ac_cv_search_idn2_to_ascii_lz" + AC_DEFINE([HAVE_LIBIDN2], [1], [Define if libidn2 was found])], + [AC_MSG_ERROR([libidn2 requested, but not found])]) + AX_RESTORE_FLAGS([libidn2])]) +AC_SUBST([LIBIDN2_CFLAGS]) +AC_SUBST([LIBIDN2_LDFLAGS]) +AC_SUBST([LIBIDN2_LIBS]) + +# +# Check whether to build with cmocka unit testing framework +# +# [pairwise: --with-cmocka=detect, --with-cmocka=yes, --without-cmocka] +AC_ARG_WITH([cmocka], + [AS_HELP_STRING([--with-cmocka=detect],[enable CMocka based tests (default is detect)])], + [],[with_cmocka=detect]) + +AS_CASE([$with_cmocka], + [no],[], + [detect],[PKG_CHECK_MODULES([CMOCKA], [cmocka >= 1.1.3], + [AC_DEFINE([HAVE_CMOCKA], [1], [Use CMocka]) + with_cmocka=yes],[with_cmocka=no])], + [yes],[PKG_CHECK_MODULES([CMOCKA], [cmocka >= 1.1.3], + [AC_DEFINE([HAVE_CMOCKA], [1], [Use CMocka])])], + [AC_MSG_ERROR([Use PKG_CONFIG_PATH to specify path to CMocka library])] + ) +AC_SUBST([CMOCKA_CFLAGS]) +AC_SUBST([CMOCKA_LIBS]) + +AC_DEFINE([SKIPPED_TEST_EXIT_CODE], [0], [Exit code for skipped tests]) + +# +# Check for kyua execution engine if CMocka was requested +# and bail out if execution engine was not found +# +AC_ARG_VAR([KYUA], [path to kyua execution engine]) +AS_IF([test "$with_cmocka" != "no"], + [AC_PATH_PROGS([KYUA], [kyua], []) + AS_IF([test -z "$KYUA"], + [AC_MSG_WARN([kyua test execution engine not found])], + [UNITTESTS=tests])]) +AC_SUBST([KYUA]) +AC_SUBST([UNITTESTS]) + +# +# Check for -Wl,--wrap= support +# + +LD_WRAP_TESTS=false +AC_MSG_CHECKING([for linker support for --wrap option]) +AX_SAVE_FLAGS([wrap]) +LDFLAGS="-Wl,--wrap,exit" +AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[#include <stdlib.h> + void __real_exit (int status); + void __wrap_exit (int status) { __real_exit (0); } + ]], + [[exit (1);]])], + [LD_WRAP_TESTS=true + AC_DEFINE([LD_WRAP], [1], [define if the linker supports --wrap option]) + AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no])]) +AX_RESTORE_FLAGS([wrap]) + +AC_SUBST([LD_WRAP_TESTS]) + +# +# Check for i18n +# +AC_CHECK_HEADERS(locale.h) +AC_CHECK_FUNCS(setlocale) + +# +# was --with-tuning specified? +# +# [pairwise: --with-tuning=small, --without-tuning] +AC_ARG_WITH([tuning], + AS_HELP_STRING([--with-tuning=ARG], + [Specify server tuning (default or small)]), + [],[with_tuning=no]) + +AS_CASE([$with_tuning], + [small],[AC_MSG_NOTICE(using small system tuning)], + [AC_DEFINE(TUNE_LARGE, 1, [Define to use default system tuning.]) + AC_MSG_NOTICE(using default system tuning)]) + +# +# was --enable-querytrace specified? +# +# [pairwise: --enable-querytrace, --disable-querytrace] +AC_ARG_ENABLE(querytrace, + AS_HELP_STRING([--enable-querytrace], + [enable very verbose query trace logging + [default=no]]), + want_querytrace="$enableval", want_querytrace="no") + +AC_MSG_CHECKING([whether to enable query trace logging]) +case "$want_querytrace" in +yes) + AC_MSG_RESULT(yes) + AC_DEFINE(WANT_QUERYTRACE, 1, [Define to enable very verbose query trace logging.]) + ;; +no) + AC_MSG_RESULT(no) + ;; +*) + AC_MSG_ERROR("--enable-querytrace requires yes or no") + ;; +esac + +# +# Was --disable-auto-validation specified? +# + +validation_default=auto + +# [pairwise: --enable-auto-validation, --disable-auto-validation] +AC_ARG_ENABLE(auto-validation, + AS_HELP_STRING([--enable-auto-validation], + [turn on DNSSEC validation by default, using the IANA root key [default=yes]]), + [:],[enable_auto_validation=yes]) +AS_IF([test "$enable_auto_validation" = "no"],[validation_default=yes]) +AC_DEFINE_UNQUOTED([VALIDATION_DEFAULT], ["$validation_default"], [the default value of dnssec-validation option]) + +# +# Substitutions +# +AC_SUBST(BIND9_TOP_BUILDDIR) +BIND9_TOP_BUILDDIR=`pwd` + +AC_SUBST(BIND9_ISC_BUILDINCLUDE) +AC_SUBST(BIND9_ISCCC_BUILDINCLUDE) +AC_SUBST(BIND9_ISCCFG_BUILDINCLUDE) +AC_SUBST(BIND9_DNS_BUILDINCLUDE) +AC_SUBST(BIND9_NS_BUILDINCLUDE) +AC_SUBST(BIND9_BIND9_BUILDINCLUDE) +AC_SUBST(BIND9_IRS_BUILDINCLUDE) +if test "X$srcdir" != "X"; then + BIND9_ISC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isc/include" + BIND9_ISCCC_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccc/include" + BIND9_ISCCFG_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/isccfg/include" + BIND9_DNS_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/dns/include" + BIND9_NS_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/ns/include" + BIND9_BIND9_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/bind9/include" + BIND9_IRS_BUILDINCLUDE="-I${BIND9_TOP_BUILDDIR}/lib/irs/include" +else + BIND9_ISC_BUILDINCLUDE="" + BIND9_ISCCC_BUILDINCLUDE="" + BIND9_ISCCFG_BUILDINCLUDE="" + BIND9_DNS_BUILDINCLUDE="" + BIND9_NS_BUILDINCLUDE="" + BIND9_BIND9_BUILDINCLUDE="" + BIND9_IRS_BUILDINCLUDE="" +fi + +AC_SUBST_FILE(BIND9_MAKE_INCLUDES) +BIND9_MAKE_INCLUDES=$BIND9_TOP_BUILDDIR/make/includes + +AC_SUBST_FILE(BIND9_MAKE_RULES) +BIND9_MAKE_RULES=$BIND9_TOP_BUILDDIR/make/rules + +. "$srcdir/version" +BIND9_PRODUCT="PRODUCT=\"${PRODUCT}\"" +AC_SUBST(BIND9_PRODUCT) +BIND9_DESCRIPTION="DESCRIPTION=\"${DESCRIPTION}\"" +AC_SUBST(BIND9_DESCRIPTION) +BIND9_VERSION="${MAJORVER}.${MINORVER}${PATCHVER:+.}${PATCHVER}${RELEASETYPE}${RELEASEVER}${EXTENSIONS}" +AC_SUBST(BIND9_VERSION) +BIND9_MAJOR="MAJOR=${MAJORVER}.${MINORVER}" +AC_SUBST(BIND9_MAJOR) +BIND9_VERSIONSTRING="${PRODUCT} ${MAJORVER}.${MINORVER}${PATCHVER:+.}${PATCHVER}${RELEASETYPE}${RELEASEVER}${EXTENSIONS}${DESCRIPTION:+ }${DESCRIPTION}" +AC_SUBST(BIND9_VERSIONSTRING) + +BIND9_SRCID="SRCID=unset_id" +if test -f "${srcdir}/srcid"; then + . "${srcdir}/srcid" + BIND9_SRCID="SRCID=$SRCID" +elif test -d "${srcdir}/.git"; then + BIND9_SRCID="SRCID="`(cd "${srcdir}";git rev-parse --short HEAD)` +fi + +AC_SUBST(BIND9_SRCID) + +if test -z "$ac_configure_args"; then + BIND9_CONFIGARGS="defaults" +else + for a in $ac_configure_args + do + BIND9_CONFIGARGS="$BIND9_CONFIGARGS $a" + done +fi +BIND9_CONFIGARGS="`echo $BIND9_CONFIGARGS | sed 's/^ //'`" +BIND9_CONFIGARGS="CONFIGARGS=${BIND9_CONFIGARGS}" +AC_SUBST(BIND9_CONFIGARGS) + +AC_SUBST_FILE(LIBDNS_MAPAPI) +LIBDNS_MAPAPI="$srcdir/lib/dns/mapapi" + +# +# Configure any DLZ drivers. +# +# If config.dlz.in selects one or more DLZ drivers, it will set +# CONTRIB_DLZ to a non-empty value, which will be our clue to +# build DLZ drivers in contrib. +# +# This section has to come after the libtool stuff because it needs to +# know how to name the driver object files. +# + +CONTRIB_DLZ="" +DLZ_DRIVER_INCLUDES="" +DLZ_DRIVER_LIBS="" +DLZ_DRIVER_SRCS="" +DLZ_DRIVER_OBJS="" +DLZ_SYSTEM_TEST="" +DLZ_DRIVER_MYSQL_INCLUDES="" +DLZ_DRIVER_MYSQL_LIBS="" + +# +# Configure support for building a shared library object +# +# Even when libtool is available it can't always be relied upon +# to build an object that can be dlopen()'ed, but this is necessary +# for building the dlzexternal system test, so we'll try it the +# old-fashioned way. +# +SO="so" +SO_CFLAGS="" +SO_LDFLAGS="" +SO_LD="" +SO_TARGETS="" +SO_STRIP="cat" + +# [pairwise: skip] +AC_ARG_WITH([dlopen], + AS_HELP_STRING([--with-dlopen=ARG], + [support dynamically loadable DLZ and DYNDB drivers]), + [], [with_dlopen="auto"]) + + +# +# If PIC is disabled, dlopen must also be +# +AS_IF([test "$pic_mode" = "no"], + [AS_CASE([$with_dlopen], + [auto],[with_dlopen="no"], + [yes],[AC_MSG_ERROR([--with-dlopen requires PIC])])]) + +AS_CASE([$with_dlopen], + [auto|yes],[ + # -fsanitize=thread hijacks dlopen and dlclose so use dlsym. + AC_SEARCH_LIBS([dlsym],[dl]) + AC_CHECK_FUNCS([dlopen dlclose dlsym], + [with_dlopen="yes"], + [with_dlopen="no"]) + ]) + +AS_IF([test "$with_dlopen" = "yes"], + [AS_CASE([$host], + [*-linux*|*-gnu*],[ + LDFLAGS="${LDFLAGS} -Wl,--export-dynamic" + SO_CFLAGS="-fPIC" + SO_LDFLAGS="" + AS_IF([test "$use_libtool" = "yes"],[ + SO_LDFLAGS="-Xcompiler -shared" + SO_LD="${CC}" + ],[ + SO_LDFLAGS="-shared" + SO_LD="${CC}" + ]) + ], + [*-freebsd*|*-openbsd*|*-netbsd*],[ + LDFLAGS="${LDFLAGS} -Wl,-E" + SO_CFLAGS="-fpic" + AS_IF([test "$use_libtool" = "yes"],[ + SO_LDFLAGS="-Xcompiler -shared" + SO_LD="${CC}" + ],[ + SO_LDFLAGS="-shared" + SO_LD="${CC}" + ]) + ], + [*-darwin*],[ + SO_CFLAGS="-fPIC" + SO_LD="${CC}" + AS_IF([test "$use_libtool" = "yes"],[ + SO_LDFLAGS="-Xcompiler -dynamiclib -undefined dynamic_lookup" + ],[ + SO_LDFLAGS="-dynamiclib -undefined dynamic_lookup" + ]) + ], + [*-solaris*],[ + SO_CFLAGS="-KPIC" + SO_LDFLAGS="-G -z text" + SO_LD="ld" + ], + [ia64-hp-hpux*],[ + SO_CFLAGS="+z" + SO_LDFLAGS="-b" + SO_LD="${CC}" + ], + [ + SO_CFLAGS="-fPIC" + ]) + AS_IF([test "$GCC" = "yes"],[ + SO_CFLAGS="-fPIC" + AS_IF([test -z "$SO_LD"], + [AS_IF([test "$use_libtool" = "yes"],[ + SO_LDFLAGS="-Xcompiler -shared" + SO_LD="${CC}" + ],[ + SO_LDFLAGS="-shared" + SO_LD="${CC}" + ]) + ]) + ]) + # If we still don't know how to make shared objects, don't make any. + AS_IF([test -n "$SO_LD"], + [SO_TARGETS="\${SO_TARGETS}" + AC_DEFINE([ISC_DLZ_DLOPEN], [1], + [Define to allow building of objects for dlopen().]) + ]) + ]) + +AS_IF([test "$with_dlopen" = "no" -a "$enable_native_pkcs11" = "yes"], + [AC_MSG_ERROR([PKCS11 requires dlopen() support])]) + +CFLAGS="$CFLAGS $SO_CFLAGS" + +AC_SUBST(SO) +AC_SUBST(SO_CFLAGS) +AC_SUBST(SO_LDFLAGS) +AC_SUBST(SO_LD) +AC_SUBST(SO_STRIP) +AC_SUBST(SO_TARGETS) + +# +# Response policy rewriting using DNS Response Policy Service (DNSRPS) +# interface. +# +# DNSRPS can be compiled into BIND everywhere with a reasonably +# modern C compiler. It is enabled on systems with dlopen() and librpz.so. +# +dnsrps_avail=yes +AC_MSG_CHECKING([for librpz __attribute__s]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[]], + [[ + extern void f(char *p __attribute__((unused)), ...) + __attribute__((format(printf,1,2))) __attribute__((__noreturn__)); + ]])], + [ + librpz_have_attr=yes + AC_DEFINE([LIBRPZ_HAVE_ATTR], [1], [have __attribute__s used in librpz.h]) + AC_MSG_RESULT([yes]) + ],[ + librpz_have_attr=no + AC_MSG_RESULT([no]) + ]) + +# DNSRPS builds are included in pairwise testing along --enable-native-pkcs11 +# tests above as both of these features require --with-dlopen (see also the +# relevant comment there). +# +# [pairwise: skip] +AC_ARG_ENABLE([dnsrps-dl], + [AS_HELP_STRING([--enable-dnsrps-dl], + [DNS Response Policy Service delayed link + [default=$librpz_dl]])], + [enable_librpz_dl="$enableval"], [enable_librpz_dl="$with_dlopen"]) + +AS_IF([test "$enable_librpz_dl" = "yes" -a "$with_dlopen" = "no"], + [AC_MSG_ERROR([DNS Response Policy Service delayed link requires dlopen to be enabled])]) + +# [pairwise: skip] +AC_ARG_WITH([dnsrps-libname], + [AS_HELP_STRING([--with-dnsrps-libname], + [DNSRPS provider library name (librpz.so)])], + [librpz_name="$withval"], [librpz_name="librpz.so"]) + +# [pairwise: skip] +AC_ARG_WITH([dnsrps-dir], + [AS_HELP_STRING([--with-dnsrps-dir], + [path to DNSRPS provider library])], + [librpz_path="$withval/$librpz_name"], [librpz_path="$librpz_name"]) +AC_DEFINE_UNQUOTED([DNSRPS_LIBRPZ_PATH], ["$librpz_path"], + [dnsrps $librpz_name]) +AS_IF([test "$enable_librpz_dl" = "yes"], + [ + dnsrps_lib_open=2 + ],[ + dnsrps_lib_open=1 + # Add librpz.so to linked libraries if we are not using dlopen() + AC_SEARCH_LIBS([librpz_client_create], [rpz], [], + [dnsrps_lib_open=0 + dnsrps_avail=no]) + ]) +AC_DEFINE_UNQUOTED([DNSRPS_LIB_OPEN], [$dnsrps_lib_open], + [0=no DNSRPS 1=static link 2=dlopen()]) + +# [pairwise: skip] +AC_ARG_ENABLE([dnsrps], + AS_HELP_STRING([--enable-dnsrps], + [enable DNS Response Policy Service API]), + [enable_dnsrps=$enableval], [enable_dnsrps=no]) + +AS_IF([test "$enable_dnsrps" != "no"],[ + AS_IF([test "$dnsrps_avail" != "yes"], + [AC_MSG_ERROR([dlopen and librpz.so needed for DNSRPS])]) + AS_IF([test "$dnsrps_lib_open" = "0"], + [AC_MSG_ERROR([dlopen and librpz.so needed for DNSRPS])]) + AC_DEFINE([USE_DNSRPS], [1], [Enable DNS Response Policy Service API]) + ]) + +sinclude(contrib/dlz/config.dlz.in) +AC_MSG_CHECKING(contributed DLZ drivers) + +# +# Support for constructor and destructor attributes +# +AX_GCC_FUNC_ATTRIBUTE([constructor]) +AX_GCC_FUNC_ATTRIBUTE([destructor]) + +if test -n "$CONTRIB_DLZ" +then + AC_MSG_RESULT(yes) + DLZ_DRIVER_RULES=contrib/dlz/drivers/rules + AC_CONFIG_FILES([$DLZ_DRIVER_RULES + contrib/dlz/modules/mysql/Makefile + contrib/dlz/modules/mysqldyn/Makefile]) +else + AC_MSG_RESULT(no) + DLZ_DRIVER_RULES=/dev/null +fi + +AC_SUBST(CONTRIB_DLZ) +AC_SUBST(DLZ_DRIVER_INCLUDES) +AC_SUBST(DLZ_DRIVER_LIBS) +AC_SUBST(DLZ_DRIVER_SRCS) +AC_SUBST(DLZ_DRIVER_OBJS) +AC_SUBST(DLZ_SYSTEM_TEST) +AC_SUBST(DLZ_DRIVER_MYSQL_INCLUDES) +AC_SUBST(DLZ_DRIVER_MYSQL_LIBS) +AC_SUBST_FILE(DLZ_DRIVER_RULES) + +if test "yes" = "$cross_compiling"; then + if test -z "$BUILD_CC"; then + AC_MSG_ERROR([BUILD_CC not set]) + fi + BUILD_CFLAGS="$BUILD_CFLAGS" + BUILD_CPPFLAGS="$BUILD_CPPFLAGS" + BUILD_LDFLAGS="$BUILD_LDFLAGS" + BUILD_LIBS="$BUILD_LIBS" +else + BUILD_CC="$CC" + BUILD_CFLAGS="$CFLAGS" + BUILD_CPPFLAGS="$CPPFLAGS $GEN_NEED_OPTARG" + BUILD_LDFLAGS="$LDFLAGS" + BUILD_LIBS="$LIBS" +fi + +NEWFLAGS="" +for e in $BUILD_LDFLAGS ; do + case $e in + -L*) + case $host_os in + netbsd*) + ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + freebsd*) + ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + solaris*) + ee=`echo $e | sed -e 's%^-L%-R%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + *) + NEWFLAGS="$NEWFLAGS $e" + ;; + esac + ;; + *) + NEWFLAGS="$NEWFLAGS $e" + ;; + esac +done +BUILD_LDFLAGS="$NEWFLAGS" + +NEWFLAGS="" +for e in $DNS_GSSAPI_LIBS ; do + case $e in + -L*) + case $host_os in + netbsd*) + ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + freebsd*) + ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + solaris*) + ee=`echo $e | sed -e 's%^-L%-R%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + *) + NEWFLAGS="$NEWFLAGS $e" + ;; + esac + ;; + *) + NEWFLAGS="$NEWFLAGS $e" + ;; + esac +done +DNS_GSSAPI_LIBS="$NEWFLAGS" + +NEWFLAGS="" +for e in $ISC_OPENSSL_LIBS ; do + case $e in + -L*) + case $host_os in + netbsd*) + ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + freebsd*) + ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + solaris*) + ee=`echo $e | sed -e 's%^-L%-R%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + *) + NEWFLAGS="$NEWFLAGS $e" + ;; + esac + ;; + *) + NEWFLAGS="$NEWFLAGS $e" + ;; + esac +done +ISC_OPENSSL_LIBS="$NEWFLAGS" + +NEWFLAGS="" +for e in $DNS_CRYPTO_LIBS ; do + case $e in + -L*) + case $host_os in + netbsd*) + ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + freebsd*) + ee=`echo $e | sed -e 's%^-L%-Wl,-rpath,%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + solaris*) + ee=`echo $e | sed -e 's%^-L%-R%'` + NEWFLAGS="$NEWFLAGS $e $ee" + ;; + *) + NEWFLAGS="$NEWFLAGS $e" + ;; + esac + ;; + *) + NEWFLAGS="$NEWFLAGS $e" + ;; + esac +done +DNS_CRYPTO_LIBS="$NEWFLAGS" + +AC_SUBST(BUILD_CC) +AC_SUBST(BUILD_CFLAGS) +AC_SUBST(BUILD_CPPFLAGS) +AC_SUBST(BUILD_LDFLAGS) +AC_SUBST(BUILD_LIBS) + +# +# Commands to run at the end of config.status. +# Don't just put these into configure, it won't work right if somebody +# runs config.status directly (which autoconf allows). +# + +AC_CONFIG_COMMANDS( + [chmod], + [chmod a+x doc/doxygen/doxygen-input-filter]) + +# +# Files to configure. These are listed here because we used to +# specify them as arguments to AC_OUTPUT. It's (now) ok to move these +# elsewhere if there's a good reason for doing so. +# + +AC_CONFIG_FILES([ + Makefile + bin/Makefile + bin/check/Makefile + bin/confgen/Makefile + bin/confgen/unix/Makefile + bin/delv/Makefile + bin/dig/Makefile + bin/dnssec/Makefile + bin/named/Makefile + bin/named/unix/Makefile + bin/nsupdate/Makefile + bin/pkcs11/Makefile + bin/plugins/Makefile + bin/python/Makefile + bin/python/dnssec-checkds.py + bin/python/dnssec-coverage.py + bin/python/dnssec-keymgr.py + bin/python/isc/Makefile + bin/python/isc/__init__.py + bin/python/isc/checkds.py + bin/python/isc/coverage.py + bin/python/isc/dnskey.py + bin/python/isc/eventlist.py + bin/python/isc/keydict.py + bin/python/isc/keyevent.py + bin/python/isc/keymgr.py + bin/python/isc/keyseries.py + bin/python/isc/keyzone.py + bin/python/isc/policy.py + bin/python/isc/rndc.py + bin/python/isc/tests/Makefile + bin/python/isc/tests/dnskey_test.py + bin/python/isc/tests/policy_test.py + bin/python/isc/utils.py + bin/rndc/Makefile + bin/tests/Makefile + bin/tests/headerdep_test.sh + bin/tests/optional/Makefile + bin/tests/pkcs11/Makefile + bin/tests/pkcs11/benchmarks/Makefile + bin/tests/system/Makefile + bin/tests/system/conf.sh + bin/tests/system/dlzexternal/Makefile + bin/tests/system/dlzexternal/ns1/dlzs.conf + bin/tests/system/dyndb/Makefile + bin/tests/system/dyndb/driver/Makefile + bin/tests/system/pipelined/Makefile + bin/tests/system/rndc/Makefile + bin/tests/system/rpz/Makefile + bin/tests/system/rsabigexponent/Makefile + bin/tests/system/tkey/Makefile + bin/tools/Makefile + contrib/scripts/check-secure-delegation.pl + contrib/scripts/zone-edit.sh + doc/Makefile + doc/arm/Makefile + doc/doxygen/Doxyfile + doc/doxygen/Makefile + doc/doxygen/doxygen-input-filter + doc/man/Makefile + doc/misc/Makefile + fuzz/Makefile + lib/Makefile + lib/bind9/Makefile + lib/bind9/include/Makefile + lib/bind9/include/bind9/Makefile + lib/dns/Makefile + lib/dns/include/Makefile + lib/dns/include/dns/Makefile + lib/dns/include/dst/Makefile + lib/dns/tests/Makefile + lib/irs/Makefile + lib/irs/include/Makefile + lib/irs/include/irs/Makefile + lib/irs/include/irs/netdb.h + lib/irs/include/irs/platform.h + lib/irs/tests/Makefile + lib/isc/Makefile + lib/isc/include/Makefile + lib/isc/include/isc/Makefile + lib/isc/include/isc/platform.h + lib/isc/include/pk11/Makefile + lib/isc/include/pkcs11/Makefile + lib/isc/netmgr/Makefile + lib/isc/pthreads/Makefile + lib/isc/pthreads/include/Makefile + lib/isc/pthreads/include/isc/Makefile + lib/isc/tests/Makefile + lib/isc/unix/Makefile + lib/isc/unix/include/Makefile + lib/isc/unix/include/isc/Makefile + lib/isccc/Makefile + lib/isccc/include/Makefile + lib/isccc/include/isccc/Makefile + lib/isccc/tests/Makefile + lib/isccfg/Makefile + lib/isccfg/include/Makefile + lib/isccfg/include/isccfg/Makefile + lib/isccfg/tests/Makefile + lib/ns/Makefile + lib/ns/include/Makefile + lib/ns/include/ns/Makefile + lib/ns/tests/Makefile + make/Makefile + make/mkdep + unit/unittest.sh + util/check-make-install +]) + +# +# Do it +# + +AC_OUTPUT + +# +# Now that the Makefiles exist we can ensure that everything is rebuilt. +# +# [pairwise: --with-make-clean, --without-make-clean] +AC_ARG_WITH(make-clean, + AS_HELP_STRING([--with-make-clean], + [run "make clean" at end of configure [yes|no]]), + make_clean="$withval", make_clean="yes") +case "$make_clean" in +yes) + if test "yes" != "$no_create" + then + if test "yes" = "$silent" + then + make clean > /dev/null + else + make clean + fi + fi + ;; +esac + +# [pairwise: --enable-full-report, --disable-full-report] +AC_ARG_ENABLE(full-report, + AS_HELP_STRING([--enable-full-report], + [report values of all configure options])) + +report() { + echo "===============================================================================" + echo "Configuration summary:" + echo "-------------------------------------------------------------------------------" + echo "Optional features enabled:" + if test "yes" = "$enable_full_report" -o "standard" = "$with_locktype"; then + echo " Mutex lock type: $with_locktype" + fi + test "small" = "$with_tuning" && echo " Small-system tuning (--with-tuning)" + test "no" = "$use_dnstap" || \ + echo " Allow 'dnstap' packet logging (--enable-dnstap)" + test -z "$MAXMINDDB_LIBS" || echo " GeoIP2 access control (--enable-geoip)" + test "no" = "$use_gssapi" || echo " GSS-API (--with-gssapi)" + + # these lines are only printed if run with --enable-full-report + if test "yes" = "$enable_full_report"; then + test "no" = "$found_ipv6" || echo " IPv6 support (--enable-ipv6)" + test "X$PYTHON" = "X" || echo " Python tools (--with-python)" + test "X$LIBXML2_LIBS" = "X" || echo " XML statistics (--with-libxml2)" + test "X$JSON_C_LIBS" = "X" || echo " JSON statistics (--with-json-c): $JSON_C_CFLAGS $JSON_C_LIBS" + test "X$ZLIB_LIBS" = "X" || echo " HTTP zlib compression (--with-zlib)" + test "X$NZD_TOOLS" = "X" || echo " LMDB database to store configuration for 'addzone' zones (--with-lmdb)" + test "no" = "$with_libidn2" || echo " IDN support (--with-libidn2)" + fi + + test "yes" = "$enable_dnsrps" && \ + echo " DNS Response Policy Service interface (--enable-dnsrps)" + test "yes" = "$enable_fixed" && \ + echo " Allow 'fixed' rrset-order (--enable-fixed-rrset)" + test "yes" = "$enable_backtrace" && \ + echo " Print backtrace on crash (--enable-backtrace)" + test "minimal" = "$want_symtable" && \ + echo " Use symbol table for backtrace, named only (--enable-symtable)" + test "yes" = "$want_symtable" -o "all" = "$want_symtable" && \ + echo " Use symbol table for backtrace, all binaries (--enable-symtable=all)" + test "no" = "$use_libtool" || echo " Use GNU libtool (--with-libtool)" + test "yes" = "$want_querytrace" && \ + echo " Very verbose query trace logging (--enable-querytrace)" + test "no" = "$with_cmocka" || echo " CMocka Unit Testing Framework (--with-cmocka)" + + test "auto" = "$validation_default" && echo " DNSSEC validation active by default (--enable-auto-validation)" + + test "$CRYPTO" = "pkcs11" && ( + echo " Using PKCS#11 for Public-Key Cryptography (--with-native-pkcs11)" + echo " PKCS#11 module (--with-pkcs11): $with_pkcs11" + echo " +--------------------------------------------+" + echo " | ==== WARNING ==== |" + echo " | |" + echo " | The use of native PKCS#11 for Public-Key |" + echo " | Cryptography in BIND 9 has been deprecated |" + echo " | in favor of OpenSSL engine_pkcs11 from the |" + echo " | OpenSC project. The --with-native-pkcs11 |" + echo " | configuration option will be removed from |" + echo " | the next major BIND 9 release. The option |" + echo " | to use the engine_pkcs11 OpenSSL engine is |" + echo " | already available in BIND 9; please see |" + echo " | the ARM section on PKCS#11 for details. |" + echo " +--------------------------------------------+" + ) + + dlz_enabled=no + + echo " Dynamically loadable zone (DLZ) drivers:" + AS_IF([test "$use_dlz_bdb" != "no"], + [AS_ECHO([" Berkeley DB (--with-dlz-bdb)"]) + dlz_enabled=yes]) + AS_IF([test "$use_dlz_ldap" != "no"], + [AS_ECHO([" LDAP (--with-dlz-ldap)"]) + dlz_enabled=yes]) + AS_IF([test "$use_dlz_mysql" != "no"], + [AS_ECHO([" MySQL (--with-dlz-mysql)"]) + dlz_enabled=yes]) + AS_IF([test "$use_dlz_odbc" != "no"], + [AS_ECHO([" ODBC (--with-dlz-odbc)"]) + dlz_enabled=yes]) + AS_IF([test "$use_dlz_postgres" != "no"], + [AS_ECHO([" Postgres (--with-dlz-postgres)"]) + dlz_enabled=yes]) + AS_IF([test "$use_dlz_filesystem" != "no"], + [AS_ECHO([" Filesystem (--with-dlz-filesystem)"]) + dlz_enabled=yes]) + AS_IF([test "$use_dlz_stub" != "no"], + [AS_ECHO([" Stub (--with-dlz-stub)"]) + dlz_enabled=yes]) + + AS_IF([test "$dlz_enabled" = "no"], + [AS_ECHO([" None"])], + [AS_ECHO([" +--------------------------------------------------------+"]) + AS_ECHO([" | ==== DEPRECATION WARNING ==== |"]) + AS_ECHO([" +--------------------------------------------------------+"]) + AS_ECHO([" | Old-style DLZ drivers have been deprecated in favor of |"]) + AS_ECHO([" | DLZ modules. The DLZ drivers configuration option will |"]) + AS_ECHO([" | be removed from the next major BIND 9 release. |"]) + AS_ECHO([" | |"]) + AS_ECHO([" | The option to use the DLZ modules is already available |"]) + AS_ECHO([" | in BIND 9; please see the ARM section on DLZ modules. |"]) + AS_ECHO([" +--------------------------------------------------------+"]) + ]) + + echo "-------------------------------------------------------------------------------" + + echo "Features disabled or unavailable on this platform:" + test "no" = "$found_ipv6" && echo " IPv6 support (--enable-ipv6)" + test "small" = "$with_tuning" || echo " Small-system tuning (--with-tuning)" + + test "no" = "$use_dnstap" && \ + echo " Allow 'dnstap' packet logging (--enable-dnstap)" + test -z "$MAXMINDDB_LIBS" && echo " GeoIP2 access control (--enable-geoip)" + test "no" = "$use_gssapi" && echo " GSS-API (--with-gssapi)" + + test "no" = "$enable_dnsrps" && \ + echo " DNS Response Policy Service interface (--enable-dnsrps)" + + test "yes" = "$enable_fixed" || \ + echo " Allow 'fixed' rrset-order (--enable-fixed-rrset)" + + test "yes" = "$validation_default" && echo " DNSSEC validation requires configuration (--enablee-auto-validation)" + + test "$CRYPTO" = "pkcs11" || ( + echo " Using PKCS#11 for Public-Key Cryptography (--with-native-pkcs11)" + ) + + test "yes" = "$enable_backtrace" || \ + echo " Print backtrace on crash (--enable-backtrace)" + test "yes" = "$want_querytrace" || \ + echo " Very verbose query trace logging (--enable-querytrace)" + + test "yes" = "$use_libtool" || echo " Use GNU libtool (--with-libtool)" + test "no" = "$with_cmocka" && echo " CMocka Unit Testing Framework (--with-cmocka)" + + test "X$PYTHON" = "X" && echo " Python tools (--with-python)" + test "X$LIBXML2_LIBS" = "X" && echo " XML statistics (--with-libxml2)" + test "X$JSON_C_LIBS" = "X" && echo " JSON statistics (--with-json-c)" + test "X$ZLIB_LIBS" = "X" && echo " HTTP zlib compression (--with-zlib)" + test "X$NZD_TOOLS" = "X" && echo " LMDB database to store configuration for 'addzone' zones (--with-lmdb)" + test "no" = "$with_libidn2" && echo " IDN support (--with-libidn2)" + + echo "-------------------------------------------------------------------------------" + echo "Configured paths:" + echo " prefix: $prefix" + echo " sysconfdir: $sysconfdir" + echo " localstatedir: $localstatedir" + echo "-------------------------------------------------------------------------------" + echo "Compiler: $CC" + AS_IF([test "$GCC" = "yes"], + [$CC --version 2>&1 | sed 's/^/ /'], + [AS_CASE([$host], + [*-solaris*],[$CC -V 2>&1 | sed 's/^/ /'], + [$CC --version 2>&1 | sed 's/^/ /'])]) + + if test "X$ac_unrecognized_opts" != "X"; then + echo "Unrecognized options:" + echo " $ac_unrecognized_opts" + fi + + if test "yes" != "$enable_full_report"; then + echo "-------------------------------------------------------------------------------" + echo "For more detail, use --enable-full-report." + fi + echo "===============================================================================" +} + +if test "yes" != "$silent"; then + report +fi + +# Tell Emacs to edit this file in shell mode. +# Local Variables: +# mode: sh +# End: |