1# Copyright (C) Internet Systems Consortium, Inc. ("ISC") 2# 3# SPDX-License-Identifier: MPL-2.0 4# 5# This Source Code Form is subject to the terms of the Mozilla Public 6# License, v. 2.0. If a copy of the MPL was not distributed with this 7# file, you can obtain one at https://mozilla.org/MPL/2.0/. 8# 9# See the COPYRIGHT file distributed with this work for additional 10# information regarding copyright ownership. 11 12# 13# Defining the version in m4 requires a bit of dancing around, 14# so the strings are properly concatenated, as you can't use 15# a shell variable in AC_INIT 16# 17m4_define([bind_VERSION_MAJOR], 9)dnl 18m4_define([bind_VERSION_MINOR], 20)dnl 19m4_define([bind_VERSION_PATCH], 4)dnl 20m4_define([bind_VERSION_EXTRA], )dnl 21m4_define([bind_DESCRIPTION], [(Stable Release)])dnl 22m4_define([bind_SRCID], [m4_esyscmd_s([git rev-parse --short HEAD | cut -b1-7])])dnl 23m4_define([bind_PKG_VERSION], [[bind_VERSION_MAJOR.bind_VERSION_MINOR.bind_VERSION_PATCH]bind_VERSION_EXTRA])dnl 24 25# 26# Autoconf initialization 27# 28AC_INIT([BIND], bind_PKG_VERSION, [https://gitlab.isc.org/isc-projects/bind9/-/issues/new?issuable_template=Bug], [], [https://www.isc.org/downloads/]) 29AC_PREREQ([2.69]) 30 31AC_DEFINE([PACKAGE_VERSION_MAJOR], ["][bind_VERSION_MAJOR]["], [BIND 9 Major part of the version]) 32AC_DEFINE([PACKAGE_VERSION_MINOR], ["][bind_VERSION_MINOR]["], [BIND 9 Minor part of the version]) 33AC_DEFINE([PACKAGE_VERSION_PATCH], ["][bind_VERSION_PATCH]["], [BIND 9 Patch part of the version]) 34AC_DEFINE([PACKAGE_VERSION_EXTRA], ["][bind_VERSION_EXTRA]["], [BIND 9 Extra part of the version]) 35AC_DEFINE([PACKAGE_DESCRIPTION], [m4_ifnblank(bind_DESCRIPTION, [" ]bind_DESCRIPTION["], [])], [An extra string to print after PACKAGE_STRING]) 36AC_DEFINE([PACKAGE_SRCID], ["][bind_SRCID]["], [A short hash from git]) 37 38bind_CONFIGARGS="${ac_configure_args:-default}" 39AC_DEFINE_UNQUOTED([PACKAGE_CONFIGARGS], ["$bind_CONFIGARGS"], [Either 'defaults' or used ./configure options]) 40 41AC_DEFINE([PACKAGE_BUILDER], ["make"], [make or Visual Studio]) 42 43# 44# Get the Canonical System Type 45# 46AC_CANONICAL_BUILD 47AC_CANONICAL_HOST 48AC_CANONICAL_TARGET 49 50AC_CONFIG_SRCDIR([bin/named/main.c]) 51AM_INIT_AUTOMAKE([1.14 tar-pax foreign subdir-objects dist-xz no-dist-gzip -Wall -Werror]) 52AM_SILENT_RULES([yes]) 53AM_EXTRA_RECURSIVE_TARGETS([test unit doc]) 54 55AC_CONFIG_HEADERS([config.h]) 56AC_CONFIG_MACRO_DIR([m4]) 57 58# 59# Enable maintainer mode by default only when building from git repository 60# and not cross compling 61# 62AS_IF([test "$cross_compiling" = no], 63 [AM_MAINTAINER_MODE(m4_ifset([bind_SRCID],[enable],[disable]))], 64 [AM_MAINTAINER_MODE([disable])]) 65 66# 67# Enable system extensions to C and POSIX 68# 69AC_USE_SYSTEM_EXTENSIONS 70 71# 72# Compiler compatibility flags 73# 74m4_version_prereq([2.70], 75 [AC_PROG_CC], 76 [AC_PROG_CC_C99]) 77AC_PROG_CPP_WERROR 78 79# 80# Find build compiler when cross compiling 81# 82AX_PROG_CC_FOR_BUILD 83 84# 85# Find the machine's endian flavor. 86# 87AC_C_BIGENDIAN 88 89# 90# Enable large file support 91# 92AC_SYS_LARGEFILE 93AC_FUNC_FSEEKO 94 95# Enable RFC 3542 APIs on macOS 96AC_DEFINE([__APPLE_USE_RFC_3542], [1], [Select RFC3542 IPv6 API on macOS]) 97 98AC_PROG_MAKE_SET 99 100# Checks for programs. 101m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) # call AM_PROG_AR only if available 102 103AC_PROG_INSTALL 104AC_PROG_LN_S 105AX_POSIX_SHELL 106AC_PROG_MKDIR_P 107 108# Initialize libtool 109LT_INIT([disable-static dlopen pic-only]) 110 111DLOPEN_LIBS="$lt_cv_dlopen_libs" 112AC_SUBST(DLOPEN_LIBS) 113 114AS_IF([test "$enable_static" != "no" && test "$enable_developer" != "yes"], 115 [AC_MSG_ERROR([Static linking is not supported as it disables dlopen() and certain security features (e.g. RELRO, ASLR)])]) 116 117 118# 119# Set the default CFLAGS, CPPFLAGS, and LDFLAGS 120# 121STD_CFLAGS="-Wall -Wextra -Wwrite-strings -Wpointer-arith -Wno-missing-field-initializers -Wformat -Wshadow" 122 123# These should be always errors 124STD_CFLAGS="$STD_CFLAGS -Werror=implicit-function-declaration -Werror=missing-prototypes -Werror=format-security -Werror=parentheses -Werror=implicit -Werror=strict-prototypes -Werror=vla" 125 126# Disable false positives generated by GCC 11+ and ASAN 127AC_COMPILE_IFELSE( 128 [AC_LANG_PROGRAM([[]], 129 [[#if __GNUC__ >= 11 && defined(__SANITIZE_ADDRESS__) 130 #error Address Sanitizer enabled 131 #endif 132 ]])], 133 [], 134 [STD_CFLAGS="$STD_CFLAGS -Wno-stringop-overread"]) 135 136# Silence GCC 11.1+ note about the changed alignment, see GL #4841 137AS_CASE([$target_cpu],[i?86],[STD_CFLAGS="$STD_CFLAGS -Wno-psabi"]) 138 139STD_LDFLAGS="" 140 141# ... except in test code 142TEST_CFLAGS="-Wno-vla" 143 144# Fortify the sources by default (we undefine the macro first in case 145# the compiler has a different built-in setting) 146STD_CPPFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2" 147 148# 149# Additional compiler settings. 150# 151AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing], 152 [STD_CFLAGS="$STD_CFLAGS -fno-strict-aliasing"]) 153# Clang only issues a warning so use -Werror to force a error. 154AX_CHECK_COMPILE_FLAG([-Werror -fno-delete-null-pointer-checks], 155 [STD_CFLAGS="$STD_CFLAGS -fno-delete-null-pointer-checks"]) 156AX_CHECK_COMPILE_FLAG([-fdiagnostics-show-option], 157 [STD_CFLAGS="$STD_CFLAGS -fdiagnostics-show-option"]) 158 159AX_CHECK_LINK_FLAG([-Wl,--export-dynamic], 160 [STD_LDFLAGS="$STD_LDFLAGS -Wl,--export-dynamic"]) 161 162host_macos=no 163AS_CASE([$host],[*-darwin*],[host_macos=yes]) 164AM_CONDITIONAL([HOST_MACOS], [test "$host_macos" = "yes"]) 165 166# 167# Change defaults for developers if not explicity set. 168# Needs to be before the option is tested. 169# 170# [pairwise: --enable-developer, --disable-developer] 171AC_ARG_ENABLE([developer], 172 [AS_HELP_STRING([--enable-developer], 173 [enable developer build settings])]) 174 175AS_IF([test "$enable_developer" = "yes"], 176 [DEVELOPER_MODE=yes 177 STD_CPPFLAGS="$STD_CPPFLAGS -DISC_MEM_DEFAULTFILL=1 -DISC_MEM_TRACKLINES=1 -DISC_LIST_CHECKINIT=1 -DISC_STATS_CHECKUNDERFLOW=1 -DDNS_RBTDB_STRONG_RWLOCK_CHECK=1 -DISC_MUTEX_ERROR_CHECK=1" 178 test "${enable_fixed_rrset+set}" = set || enable_fixed_rrset=yes 179 test "${enable_querytrace+set}" = set || enable_querytrace=yes 180 test "${with_cmocka+set}" = set || with_cmocka=yes 181 test "${with_zlib+set}" = set || with_zlib=yes 182 test "${enable_warn_error+set}" = set || enable_warn_error=yes 183 ]) 184 185AC_SUBST([DEVELOPER_MODE]) 186AC_SUBST([STD_CFLAGS]) 187AC_SUBST([STD_CPPFLAGS]) 188AC_SUBST([STD_LDFLAGS]) 189AC_SUBST([TEST_CFLAGS]) 190 191# [pairwise: --enable-warn-error, --disable-warn-error] 192AC_ARG_ENABLE([warn_error], 193 [AS_HELP_STRING([--enable-warn-error], 194 [turn on -Werror when compiling])], 195 [],[enable_warn_error=no]) 196AS_IF([test "$enable_warn_error" = "yes"], 197 [STD_CFLAGS="$STD_CFLAGS -Werror"]) 198 199# 200# Use pkg-config 201# 202 203PKG_PROG_PKG_CONFIG 204AS_IF([test -z "$PKG_CONFIG"], 205 [AC_MSG_ERROR([The pkg-config script could not be found or is too old.])]) 206 207# 208# Pick Userspace-RCU flavor (developer only option) 209# 210# [pairwise: skip] 211AC_ARG_WITH([liburcu], 212 [AS_HELP_STRING([--with-liburcu=FLAVOR], 213 [Build with Userspace-RCU variant (developer-only option) (membarrier|qsbr|mb|bp) [default=membarrier]]))], 214 [], [with_liburcu=membarrier]) 215 216AC_MSG_CHECKING([liburcu flavor]) 217AS_CASE([$with_liburcu], 218 [membarrier], 219 [RCU_FLAVOR="liburcu" 220 AC_DEFINE([RCU_MEMBARRIER], [1], [Build with membarrier Userspace-RCU flavor])], 221 [qsbr], 222 [RCU_FLAVOR="liburcu-qsbr" 223 AC_DEFINE([RCU_QSBR], [1], [Build with QSBR Userspace-RCU flavor])], 224 [mb], 225 [RCU_FLAVOR="liburcu-mb" 226 AC_DEFINE([RCU_MB], [1], [Build with mb Userspace-RCU flavor])], 227 [bp], 228 [RCU_FLAVOR="liburcu-bp" 229 AC_DEFINE([RCU_BP], [1], [Build with bulletproof Userspace-RCU flavor])], 230 [AC_MSG_ERROR([Invalid Userspace-RCU flavor picked])]) 231 232AS_IF([test "$with_liburcu" != "membarrier" && test "$enable_developer" != "yes"], 233 [AC_MSG_ERROR([Changing Userspace-RCU variant is allowed only in developer mode])]) 234 235AC_MSG_RESULT([$RCU_FLAVOR]) 236 237# 238# liburcu << v0.13.0 didn't add -lurcu-common and some toolchains would 239# not add it automatically - we need to add it explicitly in such case. 240# 241PKG_CHECK_MODULES([LIBURCU], [$RCU_FLAVOR >= 0.13.0 liburcu-cds >= 0.13.0], [], 242 [PKG_CHECK_MODULES([LIBURCU], [$RCU_FLAVOR >= 0.10.0 liburcu-cds >= 0.10.0], 243 [LIBURCU_LIBS="$LIBURCU_LIBS -lurcu-common"])]) 244 245AC_DEFINE_UNQUOTED([RCU_FLAVOR], ["$RCU_FLAVOR"], [Chosen Userspace-RCU flavor]) 246 247PKG_CHECK_VERSION([RCU_VERSION], [$RCU_FLAVOR]) 248AC_DEFINE_UNQUOTED([RCU_VERSION], ["$RCU_VERSION"], [Compile-time Userspace-RCU version]) 249 250CFLAGS="$CFLAGS $LIBURCU_CFLAGS" 251LIBS="$LIBS $LIBURCU_LIBS" 252 253# 254# Userspace-RCU inlining doesn't work for rcu_deference() with some combination 255# of C compiler and library version. 256# 257AC_MSG_CHECKING([whether we can inline small liburcu functions]) 258AC_COMPILE_IFELSE( 259 [AC_LANG_PROGRAM([[#define URCU_INLINE_SMALL_FUNCTIONS 1 260 #include <urcu.h>]], 261 [[struct opaque *a; struct opaque *b = rcu_dereference(a);]])], 262 [AC_MSG_RESULT([yes]) 263 AC_DEFINE([URCU_INLINE_SMALL_FUNCTIONS], [1], [Inline small (less than 10 lines) functions])], 264 [AC_MSG_RESULT([no])]) 265 266# Fuzzing is not included in pairwise testing as fuzzing tools are 267# not present in the relevant Docker image. 268# 269# [pairwise: skip] 270AC_ARG_ENABLE([fuzzing], 271 [AS_HELP_STRING([--enable-fuzzing=<afl|libfuzzer|ossfuzz>], 272 [Enable fuzzing using American Fuzzy Lop or libFuzzer (default=no)])], 273 [], 274 [enable_fuzzing=no]) 275 276AC_MSG_CHECKING([whether to enable fuzzing mode]) 277AS_CASE([$enable_fuzzing], 278 [no],[AC_MSG_RESULT([no])], 279 [afl],[ 280 AC_MSG_RESULT([using AFL]) 281 AC_DEFINE([ENABLE_AFL], [1], 282 [Define to enable American Fuzzy Lop test harness]) 283 STD_CFLAGS="$STD_CFLAGS -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1" 284 FUZZ_LOG_COMPILER="afl.sh"], 285 [libfuzzer],[ 286 AC_MSG_RESULT([using libFuzzer]) 287 STD_CFLAGS="$STD_CFLAGS -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1 -fsanitize=fuzzer-no-link,address,undefined" 288 LDFLAGS="$LDFLAGS -fsanitize=address,undefined" 289 FUZZ_LDFLAGS="-fsanitize=fuzzer,address,undefined" 290 FUZZ_LOG_COMPILER="libfuzzer.sh"], 291 [ossfuzz],[ 292 AC_MSG_RESULT([using OSS-Fuzz]) 293 FUZZ_LDFLAGS="$LIB_FUZZING_ENGINE"], 294 [*],[AC_MSG_ERROR([You need to explicitly select the fuzzer])]) 295AM_CONDITIONAL([HAVE_FUZZ_LOG_COMPILER], [test -n "$FUZZ_LOG_COMPILER"]) 296AC_SUBST([FUZZ_LOG_COMPILER]) 297AC_SUBST([FUZZ_LDFLAGS]) 298 299AS_IF([test "$enable_fuzzing" = "afl"], 300 [AC_MSG_CHECKING("for AFL enabled compiler") 301 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], 302 [#ifndef __AFL_COMPILER 303 #error AFL compiler required 304 #endif 305 ])], 306 [AC_MSG_RESULT([yes])], 307 [AC_MSG_ERROR([set CC=afl-<gcc|clang> when --enable-fuzzing=afl is used])]) 308 ]) 309 310# 311# Perl is optional; it is used only by some of the system test scripts. 312# 313AC_PATH_PROGS([PERL], [perl5 perl]) 314AC_SUBST([PERL]) 315AM_CONDITIONAL([HAVE_PERL], [test -n "$PERL"]) 316 317# 318# Python is optional, it is used only by some of the system test scripts. 319# 320AM_PATH_PYTHON([3.6], [], [:]) 321AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != ":"]) 322 323AC_PATH_PROGS([PYTEST], [pytest-3 py.test-3 pytest py.test pytest-pypy], []) 324AS_IF([test -z "$PYTEST"], 325 [AC_MSG_WARN([pytest not found, some system tests will be skipped])]) 326AC_SUBST([PYTEST]) 327AM_CONDITIONAL([HAVE_PYTEST], [test -n "$PYTEST"]) 328 329# 330# xsltproc is optional, it is used only by system test scripts. 331# 332AC_PATH_PROG([XSLTPROC], [xsltproc]) 333 334# 335# Using Solaris linker with gcc on Solaris breaks Thread Local Storage 336# 337AS_CASE([$host], 338 [*-solaris*],[ 339 AS_IF([test "$GCC" = "yes"], 340 [LDFLAGS="$LDFLAGS -zrelax=transtls" 341 AC_MSG_WARN([When using GNU C Compiler on Solaris, -zrelax=transtls linker flag is used to fix bug in Thread Local Storage]) 342 ]) 343 ]) 344 345AC_CHECK_HEADERS([sys/param.h sys/socket.h]) 346AC_CHECK_HEADERS([fcntl.h regex.h sys/time.h unistd.h sys/mman.h sys/sockio.h sys/select.h sys/sysctl.h net/if6.h net/route.h linux/netlink.h linux/rtnetlink.h], [], [], 347 [$ac_includes_default 348 #ifdef HAVE_SYS_PARAM_H 349 # include <sys/param.h> 350 #endif 351 #ifdef HAVE_SYS_SOCKET_H 352 # include <sys/socket.h> 353 #endif 354 ]) 355 356# 357# Check for C11 thread local storage 358# 359# NOTE: OpenBSD doesn't ship <threads.h>, so we can't require it (yet). 360# 361AC_CHECK_HEADERS([threads.h]) 362 363# 364# C11 Atomic Operations 365# 366 367AC_CHECK_HEADERS([stdatomic.h], 368 [], 369 [AC_MSG_ERROR([C11 Atomic Operations required, update your toolchain to build BIND 9])]) 370 371AC_COMPILE_IFELSE( 372 [AC_LANG_PROGRAM( 373 [[#include <stdatomic.h>]], 374 [[atomic_int_fast32_t val = 0; atomic_fetch_add_explicit(&val, 1, memory_order_relaxed);]] 375 )], 376 [AC_MSG_CHECKING([whether -latomic is needed for 64-bit stdatomic.h functions]) 377 AC_LINK_IFELSE( 378 [AC_LANG_PROGRAM( 379 [[#include <stdatomic.h>]], 380 [[atomic_int_fast64_t val = 0; atomic_fetch_add_explicit(&val, 1, memory_order_relaxed);]] 381 )], 382 [AC_MSG_RESULT([no])], 383 [LIBS="$LIBS -latomic" 384 AC_LINK_IFELSE( 385 [AC_LANG_PROGRAM( 386 [[#include <stdatomic.h>]], 387 [[atomic_int_fast64_t val = 0; atomic_fetch_add_explicit(&val, 1, memory_order_relaxed);]] 388 )], 389 [AC_MSG_RESULT([yes])], 390 [AC_MSG_FAILURE([libatomic needed, but linking with -latomic failed, please fix your toolchain.])]) 391 ]) 392 ], 393 [AC_MSG_FAILURE([stdatomic.h header found, but compilation failed, please fix your toolchain.])]) 394 395AC_CHECK_HEADERS([stdnoreturn.h], 396 [], 397 [AC_MSG_ERROR([C11 standard headers not found, update your toolchain.])]) 398 399AC_C_CONST 400AC_C_INLINE 401AC_C_VOLATILE 402 403# 404# Check for yield support on ARM processors 405# 406AS_CASE([$host], 407 [arm*|aarch64*], 408 [AC_MSG_CHECKING([for ARM yield instruction support]) 409 AC_COMPILE_IFELSE( 410 [AC_LANG_PROGRAM([[]], 411 [[__asm__ __volatile__ ("yield")]])], 412 [AC_MSG_RESULT([yes]) 413 AC_DEFINE([HAVE_ARM_YIELD], [1], 414 [define if the ARM yield instruction is available])], 415 [AC_MSG_RESULT([no])])]) 416 417# 418# Check for pause support on SPARC processors 419# 420AS_CASE([$host], 421 [sparc*], 422 [AC_MSG_CHECKING([for pause instruction support]) 423 AC_COMPILE_IFELSE( 424 [AC_LANG_PROGRAM([[]], 425 [[__asm__ __volatile__ ("pause")]])], 426 [AC_MSG_RESULT([yes]) 427 AC_DEFINE([HAVE_SPARC_PAUSE], [1], 428 [define if the SPARC pause instruction is available])], 429 [AC_MSG_RESULT([no])])]) 430 431AC_CHECK_FUNCS([sysctlbyname]) 432 433AC_TYPE_SIZE_T 434AC_TYPE_SSIZE_T 435AC_TYPE_UINTPTR_T 436 437# 438# check for uname library routine 439# 440AC_MSG_CHECKING([for uname]) 441AC_COMPILE_IFELSE( 442 [AC_LANG_PROGRAM( 443 [[#include <sys/utsname.h> 444 #include <stdio.h> 445 ]], 446 [[ 447 struct utsname uts; 448 uname(&uts); 449 printf("running on %s %s %s for %s\n", 450 uts.sysname, uts.release, uts.version, uts.machine); 451 ]])], 452 [AC_MSG_RESULT(yes) 453 AC_DEFINE([HAVE_UNAME], [1], [define if uname is available]) 454 ], 455 [AC_MSG_RESULT(no) 456 AC_MSG_WARN([uname is not correctly supported]) 457 ]) 458 459# 460# check for GCC noreturn attribute 461# 462AX_GCC_FUNC_ATTRIBUTE([noreturn]) 463 464# 465# check for GCC malloc attribute 466# 467AX_GCC_FUNC_ATTRIBUTE([malloc]) 468 469AC_MSG_CHECKING([for extended malloc attributes]) 470AC_COMPILE_IFELSE( 471 [AC_LANG_PROGRAM( 472 [[ 473 #include <stddef.h> 474 #include <stdlib.h> 475 __attribute__ ((malloc, malloc (free, 1)) 476 void * xmalloc(size_t sz) { return malloc(sz); } 477 ]], 478 [[ 479 void *p = xmalloc(8); 480 free(p); 481 ]])], 482 [AC_MSG_RESULT(yes) 483 AC_DEFINE([HAVE_MALLOC_EXT_ATTR], [1], [define if extended attributes for malloc are available]) 484 ], 485 [AC_MSG_RESULT(no)]) 486 487# 488# check for GCC returns_nonnull attribute 489# 490AX_GCC_FUNC_ATTRIBUTE([returns_nonnull]) 491 492# 493# how to link math functions? 494# 495AC_SEARCH_LIBS([sqrt],[m]) 496 497# 498# GeoIP support? 499# 500# Should be on by default if libmaxminddb exists. 501# 502# [pairwise: --enable-geoip --with-maxminddb=auto, --enable-geoip --with-maxminddb=yes, --disable-geoip] 503AC_ARG_ENABLE([geoip], 504 [AS_HELP_STRING([--disable-geoip], 505 [support GeoIP2 geolocation ACLs if available [default=yes]])], 506 [], [enable_geoip="yes"]) 507 508# [pairwise: skip] 509AC_ARG_WITH([maxminddb], 510 [AS_HELP_STRING([--with-maxminddb=PATH], 511 [Build with MaxMind GeoIP2 support (auto|yes|no|path) [default=auto]])], 512 [], [with_maxminddb="auto"]) 513 514AS_IF([test "$enable_geoip" = "yes"], 515 [AS_CASE([$with_maxminddb], 516 [no],[AC_MSG_ERROR([Use '--disable-geoip' to disable the GeoIP])], 517 [auto],[PKG_CHECK_MODULES([MAXMINDDB], [libmaxminddb], 518 [AC_DEFINE([HAVE_GEOIP2], [1], [Build with GeoIP2 support]) 519 PKG_CHECK_VAR([MAXMINDDB_PREFIX], [libmaxminddb], [prefix], [], [AC_MSG_ERROR([libmaxminddb prefix not found in pkg-config; set MAXMINDDB_PREFIX in the environment])]) 520 ],[:])], 521 [yes],[PKG_CHECK_MODULES([MAXMINDDB], [libmaxminddb], 522 [AC_DEFINE([HAVE_GEOIP2], [1], [Build with GeoIP2 support]) 523 PKG_CHECK_VAR([MAXMINDDB_PREFIX], [libmaxminddb], [prefix], [], [AC_MSG_ERROR([libmaxminddb prefix not found in pkg-config; set MAXMINDDB_PREFIX in the environment])]) 524 ])], 525 [ # default 526 AX_SAVE_FLAGS([maxminddb]) 527 MAXMINDDB_CFLAGS="-I$with_maxminddb/include" 528 MAXMINDDB_LIBS="-L$with_maxminddb/lib" 529 CFLAGS="$CFLAGS $MAXMINDDB_CFLAGS" 530 LIBS="$LIBS $MAXMINDDB_LIBS" 531 AC_SEARCH_LIBS([MMDB_open], [maxminddb], 532 [AC_DEFINE([HAVE_GEOIP2], [1], [Build with GeoIP2 support]) 533 MAXMINDDB_LIBS="$MAXMINDDB_LIBS $ac_cv_search_MMDB_open" 534 AC_MSG_NOTICE([GeoIP2 default database path set to $with_maxminddb/share/GeoIP]) 535 AS_VAR_COPY([MAXMINDDB_PREFIX], [with_maxminddb]) 536 ], 537 [AC_MSG_ERROR([GeoIP2 requested, but libmaxminddb not found])]) 538 AX_RESTORE_FLAGS([maxminddb]) 539 ]) 540 AC_ARG_VAR([MAXMINDDB_PREFIX], [value of prefix for MAXMINDDB, overriding pkg-config]) 541]) 542 543AM_CONDITIONAL([HAVE_GEOIP2], [test -n "$MAXMINDDB_LIBS"]) 544 545AC_SUBST([MAXMINDDB_CFLAGS]) 546AC_SUBST([MAXMINDDB_LIBS]) 547 548AX_PTHREAD 549 550LIBS="$PTHREAD_LIBS $LIBS" 551CFLAGS="$CFLAGS $PTHREAD_CFLAGS" 552CC="$PTHREAD_CC" 553 554AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP]) 555AC_COMPILE_IFELSE( 556 [AC_LANG_PROGRAM([[#include <pthread.h>]], 557 [[(void)pthread_mutexattr_settype(&(pthread_mutexattr_t){ NULL }, PTHREAD_MUTEX_ADAPTIVE_NP);]])], 558 [AC_MSG_RESULT([yes]) 559 AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], [1], [Define to 1 if PTHREAD_MUTEX_ADAPTIVE_NP is available])], 560 [AC_MSG_RESULT([no])]) 561 562AC_CHECK_FUNCS([pthread_attr_getstacksize pthread_attr_setstacksize pthread_barrier_init pthread_spin_init]) 563 564AC_CHECK_HEADERS([sched.h]) 565 566AC_SEARCH_LIBS([sched_yield],[rt]) 567AC_CHECK_FUNCS([sched_yield pthread_yield pthread_yield_np]) 568 569# Look for functions relating to thread naming 570AC_CHECK_FUNCS([pthread_setname_np pthread_set_name_np]) 571AC_CHECK_HEADERS([pthread_np.h], [], [], [#include <pthread.h>]) 572 573# libuv 574PKG_CHECK_MODULES([LIBUV], [libuv >= 1.37.0], [], 575 [PKG_CHECK_MODULES([LIBUV], [libuv >= 1.34.0 libuv < 1.35.0], [], 576 [AC_MSG_ERROR([libuv >= 1.34.0 (except 1.35.0 and 1.36.0) not found])])]) 577 578PKG_CHECK_VERSION([LIBUV_VERSION], [libuv]) 579 580AX_SAVE_FLAGS([libuv]) 581CFLAGS="$CFLAGS $LIBUV_CFLAGS" 582LIBS="$LIBS $LIBUV_LIBS" 583 584# libuv recvmmsg support 585AC_CHECK_DECLS([UV_UDP_MMSG_FREE, UV_UDP_MMSG_CHUNK], [], [], [[#include <uv.h>]]) 586AC_MSG_CHECKING([whether struct msghdr uses padding for alignment]) 587AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <sys/socket.h>], 588 [const struct msghdr h = { .__pad1 = 0, .__pad2 = 0 };])], 589 [AC_MSG_RESULT([yes]) 590 AC_DEFINE([HAVE_DECL_UV_UDP_RECVMMSG], 591 [0], [Disable recvmmsg support on systems with MUSL glibc])], 592 [AC_MSG_RESULT([no]) 593 AC_CHECK_DECLS([UV_UDP_RECVMMSG], [], [], [[#include <uv.h>]])]) 594 595# libuv recverr support 596AC_CHECK_DECLS([UV_UDP_LINUX_RECVERR], [], [], [[#include <uv.h>]]) 597 598AX_RESTORE_FLAGS([libuv]) 599 600# [pairwise: --enable-doh --with-libnghttp2=auto, --enable-doh --with-libnghttp2=yes, --disable-doh] 601AC_ARG_ENABLE([doh], 602 [AS_HELP_STRING([--disable-doh], [disable DNS over HTTPS, removes dependency on libnghttp2 (default is --enable-doh)])], 603 [], [enable_doh=yes]) 604 605# [pairwise: skip] 606AC_ARG_WITH([libnghttp2], 607 [AS_HELP_STRING([--with-libnghttp2], 608 [build with libnghttp2 library [yes|no|auto] (default is auto)])], 609 [], [with_libnghttp2="auto"]) 610 611AS_IF([test "$enable_doh" = "yes"], 612 [AS_CASE([$with_libnghttp2], 613 [no],[AC_MSG_ERROR([Use '--disable-doh' to disable DNS-over-HTTPS support])], 614 [auto|yes],[PKG_CHECK_MODULES([LIBNGHTTP2], [libnghttp2 >= 1.6.0], 615 [AC_DEFINE([HAVE_LIBNGHTTP2], [1], [Build with DNS-over-HTTPS support])], 616 [AC_MSG_ERROR(m4_normalize([DNS-over-HTTPS support requested, but libnghttp2 not found. 617 Either install libnghttp2 or use --disable-doh.]))])], 618 [AC_MSG_ERROR([Specifying libnghttp2 installation path is not supported, adjust PKG_CONFIG_PATH instead])])]) 619 620AM_CONDITIONAL([HAVE_LIBNGHTTP2], [test -n "$LIBNGHTTP2_LIBS"]) 621 622 623# 624# flockfile is usually provided by pthreads 625# 626AC_CHECK_FUNCS([flockfile getc_unlocked]) 627 628# 629# Look for sysconf or other ways to allow detection of the number of processors. 630# 631AC_CHECK_FUNCS([sysconf]) 632AC_CHECK_FUNCS(sysconf sched_getaffinity cpuset_getaffinity) 633AC_CHECK_HEADERS([sys/cpuset.h], [], [], 634 [$ac_includes_default 635 #ifdef HAVE_SYS_PARAM_H 636 # include <sys/param.h> 637 #endif 638 ]) 639 640# 641# Do we want to use pthread rwlock? 642# 643# [pairwise: --enable-pthread-rwlock, --disable-pthread-rwlock] 644AC_ARG_ENABLE([pthread_rwlock], 645 [AS_HELP_STRING([--enable-pthread-rwlock], 646 [use pthread rwlock instead of internal rwlock implementation])], 647 [], [enable_pthread_rwlock=no]) 648 649AS_IF([test "$enable_pthread_rwlock" = "yes"], 650 [AC_CHECK_FUNCS([pthread_rwlock_rdlock], [], 651 [AC_MSG_ERROR([pthread_rwlock_rdlock requested but not found])]) 652 AC_DEFINE([USE_PTHREAD_RWLOCK],[1],[Define if you want to use pthread rwlock implementation]) 653 ]) 654AM_CONDITIONAL([USE_ISC_RWLOCK], [test "$enable_pthread_rwlock" != "yes"]) 655 656CRYPTO=OpenSSL 657 658# 659# OpenSSL/LibreSSL is mandatory 660# 661PKG_CHECK_MODULES([OPENSSL], [libssl libcrypto], [PKG_CHECK_VERSION([OPENSSL_VERSION], [openssl])], 662 [AX_CHECK_OPENSSL([:], [AC_MSG_FAILURE([OpenSSL/LibreSSL not found])])]) 663 664AX_SAVE_FLAGS([openssl]) 665 666CFLAGS="$OPENSSL_CFLAGS $CFLAGS" 667LIBS="$OPENSSL_LIBS $LIBS" 668 669AC_MSG_CHECKING([for OpenSSL >= 1.0.0 or LibreSSL >= 2.7.0]) 670AC_COMPILE_IFELSE( 671 [AC_LANG_PROGRAM([[#include <openssl/opensslv.h>]], 672 [[#if (!defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER < 0x1000000fL)) || \\ 673 (defined(LIBRESSL_VERSION_NUMBER) && (LIBRESSL_VERSION_NUMBER < 0x02070000fL)) 674 #error OpenSSL >= 1.0.0 or LibreSSL >= 2.7.0 required 675 #endif 676 ]])], 677 [AC_MSG_RESULT([yes])], 678 [AC_MSG_FAILURE([not found])]) 679 680# 681# Check for functions added in OpenSSL or LibreSSL 682# 683 684AC_CHECK_FUNCS([BIO_read_ex BIO_write_ex]) 685AC_CHECK_FUNCS([BN_GENCB_new]) 686AC_CHECK_FUNCS([CRYPTO_zalloc]) 687AC_CHECK_FUNCS([ERR_get_error_all]) 688AC_CHECK_FUNCS([EVP_CIPHER_CTX_new EVP_CIPHER_CTX_free]) 689AC_CHECK_FUNCS([EVP_MD_CTX_new EVP_MD_CTX_free EVP_MD_CTX_reset EVP_MD_CTX_get0_md]) 690AC_CHECK_FUNCS([EVP_PKEY_new_raw_private_key EVP_PKEY_eq]) 691AC_CHECK_FUNCS([OPENSSL_init_ssl OPENSSL_init_crypto OPENSSL_cleanup]) 692AC_CHECK_FUNCS([SSL_CTX_set_keylog_callback]) 693AC_CHECK_FUNCS([SSL_CTX_set_min_proto_version]) 694AC_CHECK_FUNCS([SSL_CTX_up_ref]) 695AC_CHECK_FUNCS([SSL_read_ex SSL_peek_ex SSL_write_ex]) 696AC_CHECK_FUNCS([SSL_CTX_set1_cert_store X509_STORE_up_ref]) 697AC_CHECK_FUNCS([SSL_CTX_up_ref]) 698AC_CHECK_FUNCS([SSL_SESSION_is_resumable]) 699AC_CHECK_FUNCS([SSL_CTX_set_ciphersuites]) 700 701# 702# Check for algorithm support in OpenSSL 703# 704 705AC_CHECK_FUNCS([EVP_DigestSignInit EVP_DigestVerifyInit], [:], 706 [AC_MSG_FAILURE([EVP_DigestSignInit/EVP_DigestVerifyInit support in OpenSSL is mandatory.])]) 707 708AC_MSG_CHECKING([for ECDSA P-256 support]) 709AC_COMPILE_IFELSE( 710 [AC_LANG_PROGRAM([[#include <openssl/evp.h>]], 711 [[EVP_PKEY_CTX *kctx = EVP_PKEY_CTX_new_id(NID_X9_62_prime256v1, NULL);]])], 712 [AC_MSG_RESULT([yes])], 713 [AC_MSG_FAILURE([not found. ECDSA P-256 support in OpenSSL is mandatory.])]) 714 715AC_MSG_CHECKING([for ECDSA P-384 support]) 716AC_COMPILE_IFELSE( 717 [AC_LANG_PROGRAM([[#include <openssl/evp.h>]], 718 [[EVP_PKEY_CTX *kctx = EVP_PKEY_CTX_new_id(NID_secp384r1, NULL);]])], 719 [AC_MSG_RESULT([yes])], 720 [AC_MSG_FAILURE([not found. ECDSA P-384 support in OpenSSL is mandatory.])]) 721 722AC_MSG_CHECKING([for Ed25519 support]) 723AC_COMPILE_IFELSE( 724 [AC_LANG_PROGRAM([[#include <openssl/evp.h>]], 725 [[EVP_PKEY_CTX *kctx = EVP_PKEY_CTX_new_id(NID_ED25519, NULL);]])], 726 [AC_DEFINE([HAVE_OPENSSL_ED25519], [1], [define if OpenSSL supports Ed25519]) 727 AC_MSG_RESULT([yes])], 728 [AC_MSG_RESULT([no])]) 729 730AC_MSG_CHECKING([for Ed448 support]) 731AC_COMPILE_IFELSE( 732 [AC_LANG_PROGRAM([[#include <openssl/evp.h>]], 733 [[EVP_PKEY_CTX *kctx = EVP_PKEY_CTX_new_id(NID_ED448, NULL);]])], 734 [AC_DEFINE([HAVE_OPENSSL_ED448], [1], [define if OpenSSL supports Ed448]) 735 AC_MSG_RESULT([yes])], 736 [AC_MSG_RESULT([no])]) 737 738# 739# Check for OpenSSL SHA-1 support 740# 741AC_CHECK_FUNCS([EVP_sha1], [:], 742 [AC_MSG_FAILURE([SHA-1 support in OpenSSL is mandatory.])]) 743 744# 745# Check for OpenSSL SHA-2 support 746# 747AC_CHECK_FUNCS([EVP_sha224 EVP_sha256 EVP_sha384 EVP_sha512], [:], 748 [AC_MSG_FAILURE([SHA-2 support in OpenSSL is mandatory.])]) 749 750# 751# Check for OpenSSL 1.1.x/LibreSSL functions 752# 753AC_CHECK_FUNCS([ECDSA_SIG_get0 EVP_PKEY_get0_EC_KEY]) 754AC_CHECK_FUNCS([RSA_set0_key EVP_PKEY_get0_RSA]) 755 756AC_CHECK_FUNCS([TLS_server_method TLS_client_method]) 757 758# 759# Check whether FIPS mode is available and whether we should enable it 760# 761# FIPS is not included in pairwise testing as the relevant Docker image 762# does not support FIPS mode. 763# 764AC_CHECK_FUNCS(EVP_default_properties_enable_fips FIPS_mode) 765 766# [pairwise: skip] 767AC_ARG_ENABLE([fips-mode], 768 [AS_HELP_STRING([--enable-fips-mode], 769 [enable FIPS mode in OpenSSL library [default=no]])], 770 [], [enable_fips_mode="no"]) 771 772AC_MSG_CHECKING([whether to enable FIPS mode in OpenSSL library]) 773AS_CASE([$enable_fips_mode], 774 [yes], [AC_MSG_RESULT([yes]) 775 AC_DEFINE([ENABLE_FIPS_MODE], [1], [Define to 1 if you want FIPS mode to be enabled]) 776 AS_IF([test "x$ac_cv_func_FIPS_mode" != xyes -a "x$ac_cv_func_EVP_default_properties_enable_fips" != xyes], 777 AC_MSG_FAILURE([OpenSSL FIPS mode requested but not available.]))], 778 [no], [AC_MSG_RESULT([no])]) 779 780AX_RESTORE_FLAGS([openssl]) 781 782AC_SUBST([OPENSSL_CFLAGS]) 783AC_SUBST([OPENSSL_LIBS]) 784 785AC_CHECK_FUNCS([clock_gettime]) 786 787# [pairwise: --with-gssapi=yes, --with-gssapi=auto, --without-gssapi] 788AC_ARG_WITH([gssapi], 789 [AS_HELP_STRING([--with-gssapi=[PATH|[/path/]krb5-config]], 790 [Specify path for system-supplied GSSAPI 791 [default=auto]])], 792 [], [with_gssapi="auto"]) 793 794KRB5_CONFIG= 795AS_CASE([$with_gssapi], 796 [no],[AC_MSG_CHECKING([for GSSAPI support]) 797 AC_MSG_RESULT([no])], 798 [yes],[AC_PATH_PROG([KRB5_CONFIG], [krb5-config]) 799 AS_IF([test -z "$KRB5_CONFIG"], 800 [AC_MSG_ERROR([krb5-config required but not found])])], 801 [auto],[AC_PATH_PROG([KRB5_CONFIG], [krb5-config])], 802 [*krb5-config*],[KRB5_CONFIG="$with_gssapi"], 803 [AC_MSG_ERROR([--with-gssapi requires yes|no|auto|/path/to/krb5-config])]) 804 805GSSAPI_CFLAGS= 806GSSAPI_LIBS= 807KRB5_CFLAGS= 808KRB5_LIBS= 809AS_IF([test -n "$KRB5_CONFIG"], 810 [AC_MSG_CHECKING([for gssapi libraries]) 811 AX_SAVE_FLAGS([gssapi]) 812 GSSAPI_CFLAGS=`"$KRB5_CONFIG" --cflags gssapi` 813 GSSAPI_LIBS=`"$KRB5_CONFIG" --libs gssapi` 814 CFLAGS="$CFLAGS $GSSAPI_CFLAGS" 815 LIBS="$LIBS $GSSAPI_LIBS" 816 AC_MSG_RESULT([$GSSAPI_CFLAGS $GSSAPI_LIBS]) 817 AC_CHECK_HEADERS([gssapi/gssapi.h], [], 818 [AC_CHECK_HEADERS([gssapi.h], [], 819 [AC_MSG_ERROR([neither gssapi/gssapi.h nor gssapi.h found])])]) 820 AC_CHECK_HEADERS([gssapi/gssapi_krb5.h], 821 [AC_CHECK_HEADERS([gssapi_krb5.h], [] 822 [AC_MSG_ERROR([neither gssapi/gssapi_krb5.h nor gssapi_krb5.h found])])]) 823 AC_CHECK_FUNCS([gss_acquire_cred],[], 824 [AC_MSG_ERROR([linking with $GSSAPI_LIBS does not work])]) 825 AX_RESTORE_FLAGS([gssapi]) 826 827 AC_MSG_CHECKING([for krb5 libraries]) 828 AX_SAVE_FLAGS([krb5]) 829 KRB5_CFLAGS=`"$KRB5_CONFIG" --cflags krb5` 830 KRB5_LIBS=`$KRB5_CONFIG --libs krb5` 831 CFLAGS="$CFLAGS $KRB5_CFLAGS" 832 LIBS="$CFLAGS $KRB5_LIBS" 833 AC_MSG_RESULT([$KRB5_CFLAGS $KRB5_LIBS]) 834 AC_CHECK_HEADERS([krb5/krb5.h], [], 835 [AC_CHECK_HEADERS([krb5.h], [], 836 [AC_MSG_ERROR([neither krb5/krb5.h nor krb5 found])])]) 837 AC_CHECK_FUNCS([krb5_init_context], [], 838 [AC_MSG_ERROR([linking with $KRB5_LIBS failed])]) 839 AX_RESTORE_FLAGS([krb5]) 840 841 AC_DEFINE([HAVE_GSSAPI], [1], [Define to 1 if you have the Kerberos Framework available]) 842 # kludge to silence compiler warnings which recommend use of GSS.framework on macOS 843 AS_CASE([$host],[*-darwin*],[CFLAGS="$CFLAGS -Wno-deprecated-declarations"])]) 844AM_CONDITIONAL([HAVE_GSSAPI], [test -n "$GSSAPI_LIBS"]) 845AC_SUBST([GSSAPI_CFLAGS]) 846AC_SUBST([GSSAPI_LIBS]) 847AC_SUBST([KRB5_CFLAGS]) 848AC_SUBST([KRB5_LIBS]) 849 850# 851# was --with-lmdb specified? 852# 853 854# [pairwise: --with-lmdb=auto, --with-lmdb=yes, --without-lmdb] 855AC_ARG_WITH([lmdb], 856 [AS_HELP_STRING([--with-lmdb=@<:@PATH@:>@], 857 [use LMDB library @<:@default=auto@:>@, optionally specify the prefix for lmdb library])], 858 [:], 859 [with_lmdb="auto"]) 860 861ac_lib_lmdb_found=no 862AS_CASE([$with_lmdb], 863 [no],[], 864 [auto|yes], [PKG_CHECK_MODULES([LMDB], [lmdb], 865 [ac_lib_lmdb_found=yes], 866 [for ac_lib_lmdb_path in /usr /usr/local /opt /opt/local; do 867 AX_LIB_LMDB([$ac_lib_lmdb_path], 868 [ac_lib_lmdb_found=yes 869 break]) 870 done 871 ])], 872 [AX_LIB_LMDB([$with_lmdb],[ac_lib_lmdb_found=yes])]) 873 874# don't fail when in automatic mode 875AS_IF([test "$with_lmdb" = "auto" && test "$ac_lib_lmdb_found" = "no"], 876 [with_lmdb=no]) 877 878# hard fail when LMDB requested, but not found 879AS_IF([test "$with_lmdb" != "no" && test "$ac_lib_lmdb_found" != "yes"], 880 [AC_MSG_ERROR([LMDB requested, but not found])]) 881 882AS_IF([test "$ac_lib_lmdb_found" = "yes"], 883 [AC_DEFINE([HAVE_LMDB], [1], [Use lmdb library])]) 884 885AC_SUBST([LMDB_CFLAGS]) 886AC_SUBST([LMDB_LIBS]) 887AM_CONDITIONAL([HAVE_LMDB], [test -n "$LMDB_LIBS"]) 888 889# 890# was --with-libxml2 specified? 891# 892# [pairwise: --with-libxml2=auto, --with-libxml2=yes, --without-libxml2] 893AC_ARG_WITH([libxml2], 894 [AS_HELP_STRING([--with-libxml2], 895 [build with libxml2 library [yes|no|auto] (default is auto)])], 896 [], [with_libxml2="auto"]) 897 898AS_CASE([$with_libxml2], 899 [no],[], 900 [auto],[PKG_CHECK_MODULES([LIBXML2], [libxml-2.0 >= 2.6.0], 901 [AC_DEFINE([HAVE_LIBXML2], [1], [Use libxml2 library])], 902 [:])], 903 [yes],[PKG_CHECK_MODULES([LIBXML2], [libxml-2.0 >= 2.6.0], 904 [AC_DEFINE([HAVE_LIBXML2], [1], [Use libxml2 library])])], 905 [AC_MSG_ERROR([Specifying libxml2 installation path is not supported, adjust PKG_CONFIG_PATH instead])]) 906 907AM_CONDITIONAL([HAVE_LIBXML2], [test -n "$LIBXML2_LIBS"]) 908 909# 910# was --with-json-c specified? 911# 912# [pairwise: --with-json-c=detect, --with-json-c=yes, --without-json-c] 913AC_ARG_WITH([json-c], 914 [AS_HELP_STRING([--with-json-c], 915 [build with json-c library [yes|no|detect] (default is detect)])], 916 [], [with_json_c="detect"]) 917 918AS_CASE([$with_json_c], 919 [no],[], 920 [detect],[PKG_CHECK_MODULES([JSON_C], [json-c >= 0.11], 921 [AC_DEFINE([HAVE_JSON_C], [1], [Use json-c library])], 922 [:])], 923 [yes],[PKG_CHECK_MODULES([JSON_C], [json-c >= 0.11], 924 [AC_DEFINE([HAVE_JSON_C], [1], [Use json-c library])])], 925 [AC_MSG_ERROR([Specifying json-c installation path is not supported, adjust PKG_CONFIG_PATH instead])] 926 ) 927 928AM_CONDITIONAL([HAVE_JSON_C], [test -n "$JSON_C_LIBS"]) 929 930AC_SUBST([JSON_C_CFLAGS]) 931AC_SUBST([JSON_C_LIBS]) 932 933# 934# was --with-zlib specified? 935# 936# [pairwise: --with-zlib=auto, --with-zlib=yes, --without-zlib] 937AC_ARG_WITH([zlib], 938 [AS_HELP_STRING([--with-zlib], 939 [build with zlib for HTTP compression 940 [default=yes]])], 941 [], with_zlib="auto") 942 943AS_CASE([$with_zlib], 944 [no],[], 945 [auto],[PKG_CHECK_MODULES([ZLIB], [zlib], 946 [AC_DEFINE([HAVE_ZLIB], [1], [Use zlib library])], 947 [:])], 948 [yes],[PKG_CHECK_MODULES([ZLIB], [zlib], 949 [AC_DEFINE([HAVE_ZLIB], [1], [Use zlib library])])], 950 [AC_MSG_ERROR([Specifying zlib installation path is not supported, adjust PKG_CONFIG_PATH instead])]) 951AC_SUBST([ZLIB_CFLAGS]) 952AC_SUBST([ZLIB_LIBS]) 953 954# 955# was --with-libsystemd specified? 956# 957# [pairwise: --with-libsystemd=auto, --with-libsystemd=yes, --without-libsystemd] 958AC_ARG_WITH([libsystemd], 959 [AS_HELP_STRING([--with-libsystemd], 960 [build with libsystemd integration [default=auto]])], 961 [], [with_libsystemd=auto]) 962 963AS_CASE([$with_libsystemd], 964 [no],[], 965 [auto],[PKG_CHECK_MODULES([LIBSYSTEMD], [libsystemd], 966 [AC_DEFINE([HAVE_LIBSYSTEMD], [1], [Use libsystemd library])], 967 [:])], 968 [yes],[PKG_CHECK_MODULES([LIBSYSTEMD], [libsystemd], 969 [AC_DEFINE([HAVE_LIBSYSTEMD], [1], [Use libsystemd library])])], 970 [AC_MSG_ERROR([Specifying libsystemd installation path is not supported, adjust PKG_CONFIG_PATH instead])]) 971AC_SUBST([LIBSYSTEMD_CFLAGS]) 972AC_SUBST([LIBSYSTEMD_LIBS]) 973 974# 975# Check if the system supports glibc-compatible backtrace() function. 976# 977AC_CHECK_HEADERS([execinfo.h], 978 [AC_SEARCH_LIBS([backtrace_symbols], [execinfo], 979 [AC_CHECK_FUNCS([backtrace_symbols])])]) 980 981# 982# We do the IPv6 compilation checking after libtool so that we can put 983# the right suffix on the files. 984# 985AC_MSG_CHECKING([for IPv6 structures]) 986AC_COMPILE_IFELSE( 987 [AC_LANG_PROGRAM( 988 [[ 989 #include <sys/types.h> 990 #include <sys/socket.h> 991 #include <netinet/in.h> 992 ]], 993 [[ 994 struct sockaddr_in6 sin6; 995 struct in6_addr in6; 996 struct in6_pktinfo in6_pi; 997 struct sockaddr_storage storage; 998 in6 = in6addr_any; 999 in6 = in6addr_loopback; 1000 sin6.sin6_scope_id = 0; 1001 return (0); 1002 ]])], 1003 [AC_MSG_RESULT([yes])], 1004 [AC_MSG_FAILURE([IPv6 support is mandatory])]) 1005 1006# 1007# Allow forcibly disabling TCP Fast Open support as autodetection might yield 1008# confusing results on some systems (e.g. FreeBSD; see set_tcp_fastopen() 1009# comment in lib/isc/socket.c). 1010# 1011# [pairwise: --enable-tcp-fastopen, --disable-tcp-fastopen] 1012AC_ARG_ENABLE([tcp_fastopen], 1013 [AS_HELP_STRING([--disable-tcp-fastopen], 1014 [disable TCP Fast Open support [default=yes]])], 1015 [], [enable_tcp_fastopen="yes"]) 1016 1017AS_IF([test "$enable_tcp_fastopen" = "yes"], 1018 [AC_DEFINE([ENABLE_TCP_FASTOPEN], [1], [define if you want TCP_FASTOPEN enabled if available])]) 1019 1020# 1021# Check for some other useful functions that are not ever-present. 1022# 1023AC_CHECK_FUNCS([strlcpy strlcat strnstr]) 1024 1025# 1026# Check for readline support 1027# 1028 1029# editline is not included in pairwise testing as the library 1030# is not present in the relevant Docker image. 1031# 1032# GNU Readline is not included in pairwise testing as the library 1033# in the relevant Docker image does not support pkg-config. 1034# 1035# [pairwise: --with-readline=auto, --with-readline=yes, --with-readline=libedit, --without-readline] 1036AC_ARG_WITH([readline], 1037 [AS_HELP_STRING([--with-readline=yes|no|libedit|readline], 1038 [specify readline library [default auto]])], 1039 [], [with_readline="auto"]) 1040 1041AS_CASE([$with_readline], 1042 [no],[], 1043 [auto|yes], 1044 [PKG_CHECK_MODULES([READLINE], [libedit], 1045 [AC_DEFINE([HAVE_READLINE_LIBEDIT], [1], [Build with libedit support])], 1046 [PKG_CHECK_MODULES([READLINE], [libeditline], 1047 [AC_DEFINE([HAVE_READLINE_EDITLINE], [1], [Build with editline support.])], 1048 [PKG_CHECK_MODULES([READLINE], [readline], 1049 [AC_DEFINE([HAVE_READLINE_READLINE], [1], [Build with readline support.])], 1050 [AS_IF([test "$with_readline" = "yes"], 1051 [AC_MSG_ERROR([readline support requested, but none of the libraries have been found.])])])])])], 1052 [libedit], 1053 [PKG_CHECK_MODULES([READLINE], [libedit], 1054 [AC_DEFINE([HAVE_READLINE_LIBEDIT], [1], [Build with libedit support])])], 1055 [editline], 1056 [PKG_CHECK_MODULES([READLINE], [libeditline], 1057 [AC_DEFINE([HAVE_READLINE_EDITLINE], [1], [Build with editline support])])], 1058 [readline], 1059 [PKG_CHECK_MODULES([READLINE], [readline], 1060 [AC_DEFINE([HAVE_READLINE_READLINE], [1], [Build with readline support])])], 1061 [AC_MSG_ERROR([Unknown readline '$with_readline' library requested.])]) 1062AM_CONDITIONAL([HAVE_READLINE], [test -n "$READLINE_LIBS"]) 1063AC_SUBST([READLINE_CFLAGS]) 1064AC_SUBST([READLINE_LIBS]) 1065 1066# 1067# Security Stuff 1068# 1069# Note it is very recommended to *not* disable chroot(), 1070# this is only because chroot() was made obsolete by Posix. 1071# 1072# [pairwise: --enable-chroot, --disable-chroot] 1073AC_ARG_ENABLE(chroot, AS_HELP_STRING([--disable-chroot], [disable chroot])) 1074case "$enable_chroot" in 1075 yes|'') 1076 AC_CHECK_FUNCS(chroot) 1077 ;; 1078 no) 1079 ;; 1080esac 1081 1082AS_CASE([$host], 1083 [*-linux*], 1084 [PKG_CHECK_MODULES([LIBCAP], [libcap], 1085 [AC_DEFINE([HAVE_LIBCAP], [1], [Define to 1 if libcap was found])])]) 1086 1087case "$host" in 1088*-solaris*) 1089 AC_DEFINE(NEED_SECURE_DIRECTORY, 1, 1090 [Define if connect does not honour the permission on the UNIX domain socket.]) 1091 ;; 1092esac 1093 1094# 1095# Time Zone Stuff 1096# 1097AC_CHECK_FUNCS([tzset]) 1098 1099AC_MSG_CHECKING(for optarg declaration) 1100AC_COMPILE_IFELSE( 1101 [AC_LANG_PROGRAM( 1102 [[#include <unistd.h>]], 1103 [[optarg = 0;]] 1104 )], 1105 [AC_MSG_RESULT(yes)], 1106 [AC_MSG_RESULT(no) 1107 GEN_NEED_OPTARG="-DNEED_OPTARG=1" 1108 AC_DEFINE(NEED_OPTARG, 1, [Defined if extern char *optarg is not declared.])] 1109) 1110 1111# 1112# Check for nanoseconds in file stats 1113# 1114AC_MSG_CHECKING([for st_mtim.tv_nsec]) 1115AC_COMPILE_IFELSE( 1116 [AC_LANG_PROGRAM( 1117 [[#include <sys/stat.h>]], 1118 [[struct stat s; 1119 return(s.st_mtim.tv_nsec); 1120 ]])], 1121 [AC_MSG_RESULT([yes]) 1122 AC_DEFINE([HAVE_STAT_NSEC], [1], [define if struct stat has st_mtim.tv_nsec field])], 1123 [AC_MSG_RESULT([no])]) 1124 1125# 1126# Check for if_nametoindex() for IPv6 scoped addresses support 1127# 1128AC_CHECK_FUNCS([if_nametoindex]) 1129 1130AC_CHECK_HEADERS([uchar.h]) 1131 1132# 1133# Check for __builtin_unreachable 1134# 1135AC_MSG_CHECKING([compiler support for __builtin_unreachable()]) 1136AC_LINK_IFELSE( 1137 [AC_LANG_PROGRAM( 1138 [[]], 1139 [[__builtin_unreachable();]] 1140 )], 1141 [AC_MSG_RESULT([yes]) 1142 AC_DEFINE([HAVE_BUILTIN_UNREACHABLE], [1], [define if the compiler supports __builtin_unreachable().]) 1143 ], 1144 [AC_MSG_RESULT([no]) 1145 ]) 1146 1147# 1148# Check for __builtin_clz 1149# 1150AC_MSG_CHECKING([compiler support for __builtin_clz]) 1151AC_LINK_IFELSE( 1152 [AC_LANG_PROGRAM( 1153 [[]], 1154 [[return (__builtin_clz(0xff) == 24 ? 1 : 0);]] 1155 )], 1156 [AC_MSG_RESULT([yes]) 1157 AC_DEFINE(HAVE_BUILTIN_CLZ, 1, [Define to 1 if the compiler supports __builtin_clz.]) 1158 ], 1159 [AC_MSG_RESULT([no])] 1160) 1161 1162# 1163# Check for __builtin_*_overflow 1164# 1165AC_MSG_CHECKING([compiler support for __builtin_add_overflow()]) 1166AC_LINK_IFELSE( 1167 [AC_LANG_PROGRAM( 1168 [[#include <limits.h>]], 1169 [[return (__builtin_add_overflow((unsigned int)UINT_MAX, (unsigned int)UINT_MAX, &(unsigned int){ 0 }));]] 1170 )], 1171 [AC_MSG_RESULT([yes]) 1172 AC_DEFINE([HAVE_BUILTIN_ADD_OVERFLOW], [1], [define if the compiler supports __builtin_add_overflow().]) 1173 ], 1174 [AC_MSG_RESULT([no]) 1175 ]) 1176 1177AC_MSG_CHECKING([compiler support for __builtin_sub_overflow()]) 1178AC_LINK_IFELSE( 1179 [AC_LANG_PROGRAM( 1180 [[#include <limits.h>]], 1181 [[return (__builtin_sub_overflow((unsigned int)0, (unsigned int)UINT_MAX, &(unsigned int){ 0 }));]] 1182 )], 1183 [AC_MSG_RESULT([yes]) 1184 AC_DEFINE([HAVE_BUILTIN_SUB_OVERFLOW], [1], [define if the compiler supports __builtin_sub_overflow().]) 1185 ], 1186 [AC_MSG_RESULT([no]) 1187 ]) 1188 1189AC_MSG_CHECKING([compiler support for __builtin_mul_overflow()]) 1190AC_LINK_IFELSE( 1191 [AC_LANG_PROGRAM( 1192 [[#include <limits.h> 1193 #include <stdint.h> 1194 ]], 1195 [[return (__builtin_mul_overflow(UINT64_MAX, UINT64_MAX, &(uint64_t){ 0 }));]] 1196 )], 1197 [AC_MSG_RESULT([yes]) 1198 AC_DEFINE([HAVE_BUILTIN_MUL_OVERFLOW], [1], [define if the compiler supports __builtin_mul_overflow().]) 1199 ], 1200 [AC_MSG_RESULT([no]) 1201 ]) 1202 1203# 1204# Activate "rrset-order fixed" or not? 1205# 1206# [pairwise: --enable-fixed-rrset, --disable-fixed-rrset] 1207AC_ARG_ENABLE([fixed-rrset], 1208 [AS_HELP_STRING([--enable-fixed-rrset], 1209 [enable fixed rrset ordering [default=no]])], 1210 [], [enable_fixed_rrset="no"]) 1211AS_IF([test "$enable_fixed_rrset" = "yes"], 1212 [AC_MSG_WARN([fixed rrset ordering is deprecated and will be removed in the future release]) 1213 AC_DEFINE([DNS_RDATASET_FIXED], [1], [Define to enable "rrset-order fixed" syntax.])]) 1214 1215# 1216# Activate dnstap? 1217# 1218# [pairwise: --enable-dnstap, --disable-dnstap] 1219AC_ARG_ENABLE([dnstap], 1220 [AS_HELP_STRING([--enable-dnstap], 1221 [enable dnstap support 1222 (requires fstrm, protobuf-c)])], 1223 [], [enable_dnstap=no]) 1224 1225AS_IF([test "$enable_dnstap" != "no"], 1226 [PKG_CHECK_MODULES([DNSTAP], [libfstrm libprotobuf-c], [], 1227 [AC_MSG_FAILURE([Required libraries (fstrm, protobuf-c) were not found, please install them.])]) 1228 AC_PATH_PROG([FSTRM_CAPTURE], [fstrm_capture]) 1229 AC_PATH_PROG([PROTOC_C], [protoc-c]) 1230 AS_IF([test -z "$PROTOC_C"], 1231 [AC_MSG_ERROR([protoc-c compiler not found])]) 1232 AC_DEFINE([HAVE_DNSTAP], 1, [Define to 1 to enable dnstap support]) 1233 ]) 1234 1235AC_SUBST([DNSTAP_CFLAGS]) 1236AC_SUBST([DNSTAP_LIBS]) 1237AM_CONDITIONAL([HAVE_DNSTAP], [test "$enable_dnstap" != "no"]) 1238# 1239# The following sections deal with tools used for formatting 1240# the documentation. They are all optional, unless you are 1241# a developer editing the documentation source. 1242# 1243 1244# 1245# Look for sphinx-build 1246# 1247AC_ARG_VAR([SPHINX_BUILD], [path to sphinx-build binary used to build the documentation]) 1248AC_PATH_PROG([SPHINX_BUILD], [sphinx-build], []) 1249AM_CONDITIONAL([HAVE_SPHINX_BUILD], [test -n "$SPHINX_BUILD"]) 1250 1251# 1252# Build the man pages only if we have prebuilt manpages or we can build them from RST sources 1253# 1254AM_CONDITIONAL([BUILD_MANPAGES], [test -e doc/man/named.conf.5in || test -n "$SPHINX_BUILD"]) 1255 1256# 1257# Pull release date from changelog.rst file last modification date 1258# for reproducible builds 1259# 1260release_date=`date -u -r doc/arm/changelog.rst +%Y-%m-%d` 1261AC_SUBST([RELEASE_DATE], $release_date) 1262 1263# 1264# Look for Doxygen 1265# 1266AC_PATH_PROGS([DOXYGEN], [doxygen]) 1267 1268AC_CONFIG_FILES([doc/doxygen/doxygen-input-filter], 1269 [chmod +x doc/doxygen/doxygen-input-filter]) 1270 1271# 1272# Look for curl 1273# 1274 1275AC_PATH_PROG(CURL, curl, curl) 1276AC_SUBST(CURL) 1277 1278# 1279# Look for nc 1280# 1281 1282AC_PATH_PROGS(NC, nc, nc) 1283AC_SUBST(NC) 1284 1285# 1286# IDN support using libidn2 1287# 1288 1289LIBIDN2_CFLAGS= 1290LIBIDN2_LIBS= 1291 1292# [pairwise: --with-libidn2=yes, --without-libidn2] 1293AC_ARG_WITH([libidn2], 1294 [AS_HELP_STRING([--with-libidn2[=PATH]], [enable IDN support using GNU libidn2 [yes|no(default)|path]])], 1295 [with_libidn2="$withval"], [with_libidn2="no"]) 1296AS_CASE([$with_libidn2], 1297 [yes], [PKG_CHECK_MODULES([LIBIDN2], [libidn2], 1298 [AC_DEFINE([HAVE_LIBIDN2], [1], [Define if libidn2 was found])])], 1299 [no], [], 1300 [*], [AX_SAVE_FLAGS([libidn2]) 1301 LIBIDN2_CFLAGS="-I$with_libidn2/include" 1302 LIBIDN2_LIBS="-L$with_libidn2/lib" 1303 CFLAGS="$CFLAGS $LIBIDN2_CFLAGS" 1304 LIBS="$LIBS $LIBIDN2_LIBS" 1305 AC_CHECK_HEADERS([idn2.h], 1306 [], 1307 [AC_MSG_ERROR([idn2.h not found])]) 1308 AC_SEARCH_LIBS([idn2_to_ascii_lz], [idn2], 1309 [LIBIDN2_LIBS="$LIBIDN2_LIBS $ac_cv_search_idn2_to_ascii_lz" 1310 AC_DEFINE([HAVE_LIBIDN2], [1], [Define if libidn2 was found])], 1311 [AC_MSG_ERROR([libidn2 requested, but not found])]) 1312 AX_RESTORE_FLAGS([libidn2])]) 1313AC_SUBST([LIBIDN2_CFLAGS]) 1314AC_SUBST([LIBIDN2_LIBS]) 1315 1316# 1317# Check whether to build with cmocka unit testing framework 1318# 1319# [pairwise: --with-cmocka=detect, --with-cmocka=yes, --without-cmocka] 1320AC_ARG_WITH([cmocka], 1321 [AS_HELP_STRING([--with-cmocka=detect],[enable CMocka based tests (default is detect)])], 1322 [],[with_cmocka=detect]) 1323 1324AS_CASE([$with_cmocka], 1325 [no],[], 1326 [detect],[PKG_CHECK_MODULES([CMOCKA], [cmocka >= 1.1.3], 1327 [AC_DEFINE([HAVE_CMOCKA], [1], [Use CMocka]) 1328 with_cmocka=yes],[with_cmocka=no])], 1329 [yes],[PKG_CHECK_MODULES([CMOCKA], [cmocka >= 1.1.3], 1330 [AC_DEFINE([HAVE_CMOCKA], [1], [Use CMocka])])], 1331 [AC_MSG_ERROR([Use PKG_CONFIG_PATH to specify path to CMocka library])] 1332 ) 1333AC_SUBST([CMOCKA_CFLAGS]) 1334AC_SUBST([CMOCKA_LIBS]) 1335 1336AM_CONDITIONAL([HAVE_CMOCKA], [test "$with_cmocka" = "yes"]) 1337 1338# 1339# Compile with jemalloc (either provided as package or wired in the system on FreeBSD) 1340# 1341# [pairwise: --with-jemalloc=detect, --with-jemalloc=yes, --without-jemalloc] 1342AC_ARG_WITH([jemalloc], 1343 [AS_HELP_STRING([--with-jemalloc=detect],[enable jemalloc memory allocator (default is detect)])], 1344 [],[with_jemalloc=detect]) 1345 1346AS_CASE([$with_jemalloc], 1347 [no],[], 1348 [yes],[AX_CHECK_JEMALLOC( 1349 [AC_DEFINE([HAVE_JEMALLOC], [1], [Define to 1 if jemalloc is available])], 1350 [AC_MSG_ERROR([jemalloc not found])])], 1351 [AX_CHECK_JEMALLOC( 1352 [AC_DEFINE([HAVE_JEMALLOC], [1], [Define to 1 if jemalloc is available]) 1353 with_jemalloc=yes], 1354 [AC_MSG_WARN([jemalloc not found; performance will be reduced]) 1355 with_jemalloc=no])]) 1356 1357AS_IF([test "$with_jemalloc" = "no"], 1358 [AS_CASE([$host], 1359 [*-freebsd*],[AC_MSG_ERROR([You cannot compile without jemalloc; jemalloc is the system allocator on FreeBSD])])]) 1360 1361AM_CONDITIONAL([HAVE_JEMALLOC], [test "$with_jemalloc" = "yes"]) 1362 1363# 1364# Check memory leaks in external libraries 1365# 1366# [pairwise: --enable-leak-detection, --disable-leak-detection] 1367AC_ARG_ENABLE([leak-detection], 1368 [AS_HELP_STRING([--enable-leak-detection],[enable the memory leak detection in external libraries (libxml2, libuv, OpenSSL) (disabled by default)])], 1369 [],[enable_leak_detection=no]) 1370AS_CASE([$enable_leak_detection], 1371 [yes],[AC_DEFINE([ENABLE_LEAK_DETECTION], [1], [Define to enable memory leak detection in external libraries])]) 1372 1373# 1374# was --enable-querytrace or --enable-singletrace specified? 1375# 1376# [pairwise: --enable-singletrace --enable-querytrace, --disable-singletrace --enable-querytrace, --disable-singletrace --disable-querytrace] 1377AC_ARG_ENABLE([singletrace], 1378 AS_HELP_STRING([--enable-singletrace], 1379 [enable single-query trace logging 1380 [default=no]]), 1381 enable_singletrace="$enableval", enable_singletrace="no") 1382 1383AC_MSG_CHECKING([whether to enable single-query trace logging]) 1384case "$enable_singletrace" in 1385yes) 1386 enable_querytrace=yes 1387 AC_MSG_RESULT(yes) 1388 AC_DEFINE(WANT_SINGLETRACE, 1, [Define to enable single-query tracing.]) 1389 ;; 1390no) 1391 AC_MSG_RESULT(no) 1392 ;; 1393*) 1394 AC_MSG_ERROR("--enable-singletrace requires yes or no") 1395 ;; 1396esac 1397 1398# [pairwise: skip] 1399AC_ARG_ENABLE(querytrace, 1400 AS_HELP_STRING([--enable-querytrace], 1401 [enable very verbose query trace logging 1402 [default=no]]), 1403 enable_querytrace="$enableval", 1404 enable_querytrace="$enable_singletrace") 1405 1406AC_MSG_CHECKING([whether to enable query trace logging]) 1407case "$enable_querytrace" in 1408yes) 1409 AC_MSG_RESULT(yes) 1410 AC_DEFINE(WANT_QUERYTRACE, 1, [Define to enable very verbose query trace logging.]) 1411 ;; 1412no) 1413 AS_IF([test "$enable_singletrace" = "yes"], 1414 [AC_MSG_ERROR([--enable-singletrace requires --enable-querytrace])]) 1415 AC_MSG_RESULT(no) 1416 ;; 1417*) 1418 AC_MSG_ERROR(["--enable-querytrace requires yes or no (not $enable_querytrace)"]) 1419 ;; 1420esac 1421 1422# 1423# Was --disable-auto-validation specified? 1424# 1425 1426validation_default=auto 1427 1428# [pairwise: --enable-auto-validation, --disable-auto-validation] 1429AC_ARG_ENABLE(auto-validation, 1430 AS_HELP_STRING([--enable-auto-validation], 1431 [turn on DNSSEC validation by default, using the IANA root key [default=yes]]), 1432 [:],[enable_auto_validation=yes]) 1433AS_IF([test "$enable_auto_validation" = "no"],[validation_default=yes]) 1434AC_DEFINE_UNQUOTED([VALIDATION_DEFAULT], ["$validation_default"], [the default value of dnssec-validation option]) 1435 1436# 1437# 1438# Response policy rewriting using DNS Response Policy Service (DNSRPS) 1439# interface. 1440# 1441# DNSRPS can be compiled into BIND everywhere with a reasonably 1442# modern C compiler. It is enabled on systems with dlopen() and librpz.so. 1443# 1444dnsrps_avail=yes 1445AC_MSG_CHECKING([for librpz __attribute__s]) 1446AC_COMPILE_IFELSE( 1447 [AC_LANG_PROGRAM( 1448 [[]], 1449 [[ 1450 extern void f(char *p __attribute__((unused)), ...) 1451 __attribute__((format(printf,1,2))) __attribute__((__noreturn__)); 1452 ]])], 1453 [ 1454 librpz_have_attr=yes 1455 AC_DEFINE([LIBRPZ_HAVE_ATTR], [1], [have __attribute__s used in librpz.h]) 1456 AC_MSG_RESULT([yes]) 1457 ],[ 1458 librpz_have_attr=no 1459 AC_MSG_RESULT([no]) 1460 ]) 1461 1462# [pairwise: --enable-dnsrps --enable-dnsrps-dl, --disable-dnsrps] 1463AC_ARG_ENABLE([dnsrps-dl], 1464 [AS_HELP_STRING([--enable-dnsrps-dl], 1465 [DNS Response Policy Service delayed link 1466 [default=yes]])], 1467 [enable_dnsrps_dl="$enableval"], [enable_dnsrps_dl="yes"]) 1468 1469AS_IF([test "$enable_dnsrps_dl" = "yes" -a "$with_dlopen" = "no"], 1470 [AC_MSG_ERROR([DNS Response Policy Service delayed link requires dlopen to be enabled])]) 1471 1472# [pairwise: skip] 1473AC_ARG_WITH([dnsrps-libname], 1474 [AS_HELP_STRING([--with-dnsrps-libname], 1475 [DNSRPS provider library name (librpz.so)])], 1476 [librpz_name="$withval"], [librpz_name="librpz.so"]) 1477 1478# [pairwise: skip] 1479AC_ARG_WITH([dnsrps-dir], 1480 [AS_HELP_STRING([--with-dnsrps-dir], 1481 [path to DNSRPS provider library])], 1482 [librpz_path="$withval/$librpz_name"], [librpz_path="$librpz_name"]) 1483AC_DEFINE_UNQUOTED([DNSRPS_LIBRPZ_PATH], ["$librpz_path"], 1484 [dnsrps $librpz_name]) 1485AS_IF([test "$enable_dnsrps_dl" = "yes"], 1486 [ 1487 dnsrps_lib_open=2 1488 ],[ 1489 dnsrps_lib_open=1 1490 # Add librpz.so to linked libraries if we are not using dlopen() 1491 AC_SEARCH_LIBS([librpz_client_create], [rpz], [], 1492 [dnsrps_lib_open=0 1493 dnsrps_avail=no]) 1494 ]) 1495AC_DEFINE_UNQUOTED([DNSRPS_LIB_OPEN], [$dnsrps_lib_open], 1496 [0=no DNSRPS 1=static link 2=dlopen()]) 1497 1498# [pairwise: skip] 1499AC_ARG_ENABLE([dnsrps], 1500 AS_HELP_STRING([--enable-dnsrps], 1501 [enable DNS Response Policy Service API]), 1502 [enable_dnsrps=$enableval], [enable_dnsrps=no]) 1503 1504AS_IF([test "$enable_dnsrps" != "no"],[ 1505 AS_IF([test "$dnsrps_lib_open" = "0"], 1506 [AC_MSG_ERROR([dlopen and librpz.so needed for DNSRPS])]) 1507 AC_DEFINE([USE_DNSRPS], [1], [Enable DNS Response Policy Service API]) 1508 ]) 1509 1510AM_CONDITIONAL([DNSRPS], [test "$enable_dnsrps" != "no"]) 1511 1512AC_CHECK_HEADERS([glob.h]) 1513 1514# 1515# Support for constructor and destructor attributes 1516# 1517AX_GCC_FUNC_ATTRIBUTE([constructor]) 1518AX_GCC_FUNC_ATTRIBUTE([destructor]) 1519 1520# 1521# Check whether to enable User Statically Defined Tracing. 1522# 1523# This is supported only on Linux now and requires SystemTap libraries. 1524# 1525# [pairwise: --enable-tracing=auto, --enable-tracing=yes, --disable-tracing] 1526AC_ARG_ENABLE([tracing], 1527 [AS_HELP_STRING([--enable-tracing], 1528 [enable User Statically Defined Tracing])], 1529 [], 1530 [enable_tracing=auto]) 1531 1532AC_ARG_VAR([DTRACE], [path to dtrace binary used to build User Statically Defined Tracing probes]) 1533AC_PATH_PROGS([DTRACE], [dtrace]) 1534AC_CHECK_HEADERS([sys/sdt.h]) 1535 1536AC_MSG_CHECKING([whether to enable User Statically Defined Tracing support (default is auto)]) 1537AS_CASE([$enable_tracing], 1538 [auto], [enable_tracing=yes 1539 AS_IF([test "$ac_cv_header_sys_sdt_h" != "yes"], [enable_tracing=no]) 1540 AS_IF([test -z "$DTRACE"],[enable_tracing=no]) 1541 AC_COMPILE_IFELSE( 1542 [AC_LANG_PROGRAM([[]], 1543 [[#if !defined(__has_feature) 1544 #define __has_feature(x) 0 1545 #endif /* if !defined(__has_feature) */ 1546 #if __has_feature(address_sanitizer) 1547 #define __SANITIZE_ADDRESS__ 1 1548 #endif /* if __has_feature(address_sanitizer) */ 1549 #if defined(__SANITIZE_ADDRESS__) 1550 #error Address Sanitizer enabled 1551 #endif 1552 ]])], 1553 [], 1554 [enable_tracing=no] 1555 )]) 1556AS_CASE([$enable_tracing], 1557 [yes], [AS_IF([test "$ac_cv_header_sys_sdt_h" != "yes"], 1558 [AC_MSG_ERROR([sys/sdt.h header not found])]) 1559 AS_IF([test -z "$DTRACE"], 1560 [AC_MSG_ERROR([The dtrace command not found])]) 1561 AC_MSG_RESULT([yes])], 1562 [DTRACE="" 1563 AC_MSG_RESULT([no])]) 1564 1565AS_CASE([$host], 1566 [*-linux*],[have_systemtap=true]) 1567 1568AM_CONDITIONAL([HAVE_SYSTEMTAP], [test -n "$have_systemtap"]) 1569AM_CONDITIONAL([HAVE_DTRACE], [test -n "$DTRACE"]) 1570 1571# Use shim script if dtrace is not available 1572AS_IF([test -z "$DTRACE"], 1573 [DTRACE='$(top_srcdir)/util/dtrace.sh']) 1574 1575AC_SUBST([DTRACE]) 1576 1577# 1578# Which should be the default zone database, RBTDB or QPZONE? 1579# [pairwise: --with-zonedb=qp, --with-zonedb=rbt] 1580# 1581AC_ARG_WITH([zonedb], 1582 [AS_HELP_STRING([--with-zonedb=detect],[specify default zone database type (default is "qpzone")])], 1583 [],[with_zonedb=qp]) 1584zonedb="qpzone" 1585AS_CASE([$with_zonedb], 1586 [RBT*|rbt*],[zonedb="rbt"], 1587 [QP|qp],[], 1588 [AC_MSG_ERROR([Unknown zone database type])] 1589 ) 1590AC_DEFINE_UNQUOTED([ZONEDB_DEFAULT], ["$zonedb"], [Default zone database type]) 1591 1592# 1593# Which should be the default zone database, RBTDB or QPCACHE? 1594# [pairwise: --with-cachedb=qp, --with-cachedb=rbt] 1595# 1596AC_ARG_WITH([cachedb], 1597 [AS_HELP_STRING([--with-cachedb=detect],[specify default cache database type (default is "qpcache")])], 1598 [],[with_cachedb=qp]) 1599cachedb="qpcache" 1600AS_CASE([$with_cachedb], 1601 [RBT*|rbt*],[cachedb="rbt"], 1602 [QP*|qp*],[], 1603 [AC_MSG_ERROR([Unknown cache database type])] 1604 ) 1605AC_DEFINE_UNQUOTED([CACHEDB_DEFAULT], ["$cachedb"], [Default cache database type]) 1606 1607# 1608# Files to configure. These are listed here because we used to 1609# specify them as arguments to AC_OUTPUT. 1610# 1611 1612# Top 1613 1614AC_CONFIG_FILES([Makefile]) 1615 1616# Binaries 1617 1618AC_CONFIG_FILES([bin/Makefile 1619 bin/named/Makefile 1620 bin/rndc/Makefile 1621 bin/dig/Makefile 1622 bin/delv/Makefile 1623 bin/dnssec/Makefile 1624 bin/tools/Makefile 1625 bin/nsupdate/Makefile 1626 bin/check/Makefile 1627 bin/confgen/Makefile 1628 bin/plugins/Makefile]) 1629 1630# Libraries 1631 1632AC_CONFIG_FILES([lib/Makefile 1633 lib/isc/Makefile 1634 lib/dns/Makefile 1635 lib/ns/Makefile 1636 lib/isccfg/Makefile 1637 lib/isccc/Makefile]) 1638 1639# Documentation 1640 1641AC_CONFIG_FILES([doc/Makefile 1642 doc/arm/Makefile 1643 doc/man/Makefile 1644 doc/misc/Makefile]) 1645 1646# Unit tests and benchmarks 1647 1648AC_CONFIG_FILES([tests/Makefile 1649 tests/bench/Makefile 1650 tests/isc/Makefile 1651 tests/dns/Makefile 1652 tests/ns/Makefile 1653 tests/irs/Makefile 1654 tests/isccfg/Makefile 1655 tests/libtest/Makefile]) 1656 1657AC_CONFIG_FILES([tests/unit-test-driver.sh], 1658 [chmod +x tests/unit-test-driver.sh]) 1659 1660# System Tests 1661 1662AC_CONFIG_FILES([bin/tests/Makefile 1663 bin/tests/system/Makefile 1664 bin/tests/system/isctest/vars/.ac_vars/TOP_BUILDDIR 1665 bin/tests/system/isctest/vars/.ac_vars/TOP_SRCDIR 1666 bin/tests/system/isctest/vars/.ac_vars/FSTRM_CAPTURE 1667 bin/tests/system/isctest/vars/.ac_vars/SHELL 1668 bin/tests/system/isctest/vars/.ac_vars/PYTHON 1669 bin/tests/system/isctest/vars/.ac_vars/PERL 1670 bin/tests/system/isctest/vars/.ac_vars/CURL 1671 bin/tests/system/isctest/vars/.ac_vars/NC 1672 bin/tests/system/isctest/vars/.ac_vars/XSLTPROC 1673 bin/tests/system/isctest/vars/.ac_vars/PYTEST 1674 bin/tests/system/dyndb/driver/Makefile 1675 bin/tests/system/dlzexternal/driver/Makefile 1676 bin/tests/system/hooks/driver/Makefile 1677 bin/tests/system/rpz/testlib/Makefile 1678 ]) 1679 1680AC_CONFIG_FILES([bin/tests/system/ifconfig.sh], 1681 [chmod +x bin/tests/system/ifconfig.sh]) 1682AC_CONFIG_FILES([bin/tests/system/start.sh], 1683 [chmod +x bin/tests/system/start.sh]) 1684AC_CONFIG_FILES([bin/tests/system/stop.sh], 1685 [chmod +x bin/tests/system/stop.sh]) 1686 1687# Fuzz Tests 1688 1689AC_CONFIG_FILES([fuzz/Makefile]) 1690 1691# Misc 1692 1693AC_CONFIG_FILES([util/check-make-install]) 1694 1695# 1696# Do it 1697# 1698 1699AC_OUTPUT 1700 1701# [pairwise: --enable-full-report, --disable-full-report] 1702AC_ARG_ENABLE(full-report, 1703 AS_HELP_STRING([--enable-full-report], 1704 [report values of all configure options])) 1705 1706report() { 1707 echo "===============================================================================" 1708 echo "Configuration summary:" 1709 echo "-------------------------------------------------------------------------------" 1710 echo "Optional features enabled:" 1711 if test "yes" = "$with_jemalloc"; then 1712 echo " Memory allocator: jemalloc" 1713 fi 1714 if test "yes" = "$enable_full_report" -o "rbt" = "$zonedb"; then 1715 echo " Default zone database type: $zonedb" 1716 fi 1717 if test "yes" = "$enable_full_report" -o "rbt" = "$zonedb"; then 1718 echo " Default cache database type: $cachedb" 1719 fi 1720 test "no" = "$enable_dnstap" || \ 1721 echo " Allow 'dnstap' packet logging (--enable-dnstap)" 1722 test -z "$MAXMINDDB_LIBS" || echo " GeoIP2 access control (--enable-geoip)" 1723 test -z "$GSSAPI_LIBS" || echo " GSS-API (--with-gssapi)" 1724 1725 # these lines are only printed if run with --enable-full-report 1726 if test "yes" = "$enable_full_report"; then 1727 test -z "$LIBXML2_LIBS" || echo " XML statistics (--with-libxml2)" 1728 test -z "$JSON_C_LIBS" || echo " JSON statistics (--with-json-c): $JSON_C_CFLAGS $JSON_C_LIBS" 1729 test -z "$ZLIB_LIBS" || echo " HTTP zlib compression (--with-zlib)" 1730 test -z "$LMDB_LIBS" || echo " LMDB database to store configuration for 'addzone' zones (--with-lmdb)" 1731 test -z "$LIBIDN2_LIBS" || echo " IDN support (--with-libidn2)" 1732 fi 1733 1734 test "yes" = "$enable_dnsrps" && \ 1735 echo " DNS Response Policy Service interface (--enable-dnsrps)" 1736 test "yes" = "$enable_fixed_rrset" && \ 1737 echo " Allow 'fixed' rrset-order (--enable-fixed-rrset)" 1738 test "yes" = "$enable_fips_mode" && \ 1739 echo " FIPS mode in OpenSSL (--enable-fips-mode)" 1740 1741 test "yes" = "$enable_querytrace" && \ 1742 echo " Very verbose query trace logging (--enable-querytrace)" 1743 test "yes" = "$enable_singletrace" && \ 1744 echo " Single-query trace logging (--enable-singletrace)" 1745 test -z "$HAVE_CMOCKA" || echo " CMocka Unit Testing Framework (--with-cmocka)" 1746 1747 test "auto" = "$validation_default" && echo " DNSSEC validation active by default (--enable-auto-validation)" 1748 1749 echo "-------------------------------------------------------------------------------" 1750 echo " Library versions:" 1751 echo " OpenSSL: $OPENSSL_VERSION" 1752 echo " libuv: $LIBUV_VERSION" 1753 echo " Userspace-RCU: $RCU_VERSION" 1754 if test "no" != "$with_jemalloc"; then 1755 echo " jemalloc: $JEMALLOC_VERSION" 1756 fi 1757 echo "-------------------------------------------------------------------------------" 1758 1759 echo "Features disabled or unavailable on this platform:" 1760 if test "no" = "$with_jemalloc"; then 1761 echo " Memory allocator: system" 1762 echo 1763 echo " +------------------------------------------+" 1764 echo " | ==== WARNING ==== |" 1765 echo " | |" 1766 echo " | This is NOT a recommended configuration. |" 1767 echo " | Using the system memory allocator causes |" 1768 echo " | reduced performance and increased memory |" 1769 echo " | fragmentation. Installing the jemalloc |" 1770 echo " | memory allocator (version >= 4.0.0) is |" 1771 echo " | strongly recommended. |" 1772 echo " +------------------------------------------+" 1773 echo 1774 fi 1775 1776 test "no" = "$enable_dnstap" && \ 1777 echo " Allow 'dnstap' packet logging (--enable-dnstap)" 1778 test -z "$MAXMINDDB_LIBS" && echo " GeoIP2 access control (--enable-geoip)" 1779 test -z "$GSSAPI_LIBS" && echo " GSS-API (--with-gssapi)" 1780 1781 test "no" = "$enable_dnsrps" && \ 1782 echo " DNS Response Policy Service interface (--enable-dnsrps)" 1783 1784 test "yes" = "$enable_fixed_rrset" || \ 1785 echo " Allow 'fixed' rrset-order (--enable-fixed-rrset)" 1786 1787 test "yes" = "$validation_default" && echo " DNSSEC validation requires configuration (--enable-auto-validation)" 1788 1789 test "yes" = "$enable_fips_mode" || \ 1790 echo " FIPS mode in OpenSSL (--enable-fips-mode)" 1791 1792 test "yes" = "$enable_querytrace" || \ 1793 echo " Very verbose query trace logging (--enable-querytrace)" 1794 test "yes" = "$enable_singletrace" || \ 1795 echo " Single-query trace logging (--enable-singletrace)" 1796 1797 test "no" = "$with_cmocka" && echo " CMocka Unit Testing Framework (--with-cmocka)" 1798 1799 test -z "$LIBXML2_LIBS" && echo " XML statistics (--with-libxml2)" 1800 test -z "$JSON_C_LIBS" && echo " JSON statistics (--with-json-c)" 1801 test -z "$ZLIB_LIBS" && echo " HTTP zlib compression (--with-zlib)" 1802 test -z "$LMDB_LIBS" && echo " LMDB database to store configuration for 'addzone' zones (--with-lmdb)" 1803 test -z "$LIBIDN2_LIBS" && echo " IDN support (--with-libidn2)" 1804 1805 echo "-------------------------------------------------------------------------------" 1806 echo "Configured paths:" 1807 echo " prefix: $prefix" 1808 echo " sysconfdir: $sysconfdir" 1809 echo " localstatedir: $localstatedir" 1810 echo "-------------------------------------------------------------------------------" 1811 echo "Compiler: $CC" 1812 AS_IF([test "$GCC" = "yes"], 1813 [$CC --version 2>&1 | sed 's/^/ /'], 1814 [AS_CASE([$host], 1815 [*-solaris*],[$CC -V 2>&1 | sed 's/^/ /'], 1816 [$CC --version 2>&1 | sed 's/^/ /'])]) 1817 echo "CFLAGS: $STD_CFLAGS $CFLAGS" 1818 echo "CPPFLAGS: $STD_CPPFLAGS $CPPFLAGS" 1819 echo "LDFLAGS: $LDFLAGS" 1820 1821 if test "X$ac_unrecognized_opts" != "X"; then 1822 echo "-------------------------------------------------------------------------------" 1823 echo "Unrecognized options:" 1824 echo " $ac_unrecognized_opts" 1825 fi 1826 1827 if test "yes" != "$enable_full_report"; then 1828 echo "-------------------------------------------------------------------------------" 1829 echo "For more detail, use --enable-full-report." 1830 fi 1831 echo "===============================================================================" 1832} 1833 1834if test "yes" != "$silent"; then 1835 report 1836fi 1837 1838# Tell Emacs to edit this file in shell mode. 1839# Local Variables: 1840# mode: sh 1841# End: 1842