xref: /freebsd/contrib/unbound/configure.ac (revision 62a52c15422470f97fc7b311d89c83f910bcc1b1)
1#                                               -*- Autoconf -*-
2# Process this file with autoconf to produce a configure script.
3AC_PREREQ([2.56])
4sinclude(acx_nlnetlabs.m4)
5sinclude(ax_pthread.m4)
6sinclude(acx_python.m4)
7sinclude(ac_pkg_swig.m4)
8sinclude(dnstap/dnstap.m4)
9sinclude(dnscrypt/dnscrypt.m4)
10
11# must be numbers. ac_defun because of later processing
12m4_define([VERSION_MAJOR],[1])
13m4_define([VERSION_MINOR],[19])
14m4_define([VERSION_MICRO],[1])
15AC_INIT([unbound],m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]),[unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues],[unbound])
16AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR])
17AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR])
18AC_SUBST(UNBOUND_VERSION_MICRO, [VERSION_MICRO])
19
20LIBUNBOUND_CURRENT=9
21LIBUNBOUND_REVISION=24
22LIBUNBOUND_AGE=1
23# 1.0.0 had 0:12:0
24# 1.0.1 had 0:13:0
25# 1.0.2 had 0:14:0
26# 1.1.0 had 0:15:0
27# 1.1.1 had 0:16:0
28# 1.2.0 had 0:17:0
29# 1.2.1 had 0:18:0
30# 1.3.0 had 1:0:0   # ub_cancel and -export-symbols.
31# 1.3.1 had 1:1:0
32# 1.3.2 had 1:2:0
33# 1.3.3 had 1:3:0
34# 1.3.4 had 1:4:0
35# 1.4.0-snapshots had 1:5:0
36# 1.4.0 had 1:5:0 (not 2:0:0)   # ub_result.why_bogus
37# 1.4.1 had 2:1:0
38# 1.4.2 had 2:2:0
39# 1.4.3 had 2:3:0
40# 1.4.4 had 2:4:0
41# 1.4.5 had 2:5:0
42# 1.4.6 had 2:6:0
43# 1.4.7 had 2:7:0
44# 1.4.8 had 2:8:0
45# 1.4.9 had 2:9:0
46# 1.4.10 had 2:10:0
47# 1.4.11 had 2:11:0
48# 1.4.12 had 2:12:0
49# 1.4.13 had 2:13:0
50# and 1.4.13p1 and 1.4.13.p2
51# 1.4.14 had 2:14:0
52# 1.4.15 had 3:0:1 # adds ub_version()
53# 1.4.16 had 3:1:1
54# 1.4.17 had 3:2:1
55# 1.4.18 had 3:3:1
56# 1.4.19 had 3:4:1
57# 1.4.20 had 4:0:2 # adds libunbound.ttl # but shipped 3:5:1
58# 1.4.21 had 4:1:2
59# 1.4.22 had 4:1:2
60# 1.5.0 had 5:3:3 # adds ub_ctx_add_ta_autr
61# 1.5.1 had 5:3:3
62# 1.5.2 had 5:5:3
63# 1.5.3 had 5:6:3
64# 1.5.4 had 5:7:3
65# 1.5.5 had 5:8:3
66# 1.5.6 had 5:9:3
67# 1.5.7 had 5:10:3
68# 1.5.8 had 6:0:4 # adds ub_ctx_set_stub
69# 1.5.9 had 6:1:4
70# 1.5.10 had 6:2:4
71# 1.6.0 had 6:3:4
72# 1.6.1 had 7:0:5 # ub_callback_t typedef renamed to ub_callback_type
73# 1.6.2 had 7:1:5
74# 1.6.3 had 7:2:5
75# 1.6.4 had 7:3:5
76# 1.6.5 had 7:4:5
77# 1.6.6 had 7:5:5
78# 1.6.7 had 7:6:5
79# 1.6.8 had 7:7:5
80# 1.7.0 had 7:8:5
81# 1.7.1 had 7:9:5
82# 1.7.2 had 7:10:5
83# 1.7.3 had 7:11:5
84# 1.8.0 had 8:0:0 # changes the event callback function signature
85# 1.8.1 had 8:1:0
86# 1.8.2 had 8:2:0
87# 1.8.3 had 8:3:0
88# 1.9.0 had 9:0:1 # add ub_ctx_set_tls
89# 1.9.1 had 9:1:1
90# 1.9.2 had 9:2:1
91# 1.9.3 had 9:3:1
92# 1.9.4 had 9:4:1
93# 1.9.5 had 9:5:1
94# 1.9.6 had 9:6:1
95# 1.10.0 had 9:7:1
96# 1.10.1 had 9:8:1
97# 1.11.0 had 9:9:1
98# 1.12.0 had 9:10:1
99# 1.13.0 had 9:11:1
100# 1.13.1 had 9:12:1
101# 1.13.2 had 9:13:1
102# 1.14.0 had 9:14:1
103# 1.15.0 had 9:15:1
104# 1.16.0 had 9:16:1
105# 1.16.1 had 9:17:1
106# 1.16.2 had 9:18:1
107# 1.16.3 had 9:19:1
108# 1.17.0 had 9:20:1
109# 1.17.1 had 9:21:1
110# 1.18.0 had 9:22:1
111# 1.19.0 had 9:23:1
112# 1.19.1 had 9:24:1
113
114#   Current  -- the number of the binary API that we're implementing
115#   Revision -- which iteration of the implementation of the binary
116#               API are we supplying?
117#   Age      -- How many previous binary API versions do we also
118#               support?
119#
120# If we release a new version that does not change the binary API,
121# increment Revision.
122#
123# If we release a new version that changes the binary API, but does
124# not break programs compiled against the old binary API, increment
125# Current and Age.  Set Revision to 0, since this is the first
126# implementation of the new API.
127#
128# Otherwise, we're changing the binary API and breaking backward
129# compatibility with old binaries.  Increment Current.  Set Age to 0,
130# since we're backward compatible with no previous APIs.  Set Revision
131# to 0 too.
132AC_SUBST(LIBUNBOUND_CURRENT)
133AC_SUBST(LIBUNBOUND_REVISION)
134AC_SUBST(LIBUNBOUND_AGE)
135
136
137cmdln="`echo $@ | sed -e 's/\\\\/\\\\\\\\/g' | sed -e 's/"/\\\\"/'g`"
138AC_DEFINE_UNQUOTED(CONFCMDLINE, ["$cmdln"], [Command line arguments used with configure])
139
140CFLAGS="$CFLAGS"
141AC_USE_SYSTEM_EXTENSIONS
142if test "$ac_cv_header_minix_config_h" = "yes"; then
143	AC_DEFINE(_NETBSD_SOURCE,1, [Enable for compile on Minix])
144fi
145
146dnl
147dnl By default set prefix to /usr/local
148dnl
149case "$prefix" in
150        NONE)
151		prefix="/usr/local"
152        ;;
153esac
154case "$exec_prefix" in
155        NONE)
156		exec_prefix="$prefix"
157        ;;
158esac
159
160# are we on MinGW?
161if uname -s 2>&1 | grep MINGW >/dev/null; then on_mingw="yes"
162else
163	if echo $host | grep mingw >/dev/null; then on_mingw="yes"
164	else on_mingw="no"; fi
165fi
166
167#
168# Determine configuration file
169# the eval is to evaluate shell expansion twice
170UNBOUND_SBIN_DIR=`eval echo "${sbindir}"`
171AC_SUBST(UNBOUND_SBIN_DIR)
172UNBOUND_SYSCONF_DIR=`eval echo "${sysconfdir}"`
173AC_SUBST(UNBOUND_SYSCONF_DIR)
174UNBOUND_LOCALSTATE_DIR=`eval echo "${localstatedir}"`
175AC_SUBST(UNBOUND_LOCALSTATE_DIR)
176if test $on_mingw = "no"; then
177  ub_conf_file=`eval echo "${sysconfdir}/unbound/unbound.conf"`
178else
179  ub_conf_file="C:\\Program Files\\Unbound\\service.conf"
180fi
181AC_ARG_WITH([conf_file],
182        AS_HELP_STRING([--with-conf-file=path],[Pathname to the Unbound configuration file]),
183	[ub_conf_file="$withval"])
184AC_SUBST(ub_conf_file)
185ACX_ESCAPE_BACKSLASH($ub_conf_file, hdr_config)
186AC_DEFINE_UNQUOTED(CONFIGFILE, ["$hdr_config"], [Pathname to the Unbound configuration file])
187ub_conf_dir=`AS_DIRNAME(["$ub_conf_file"])`
188AC_SUBST(ub_conf_dir)
189
190# Determine run, chroot directory and pidfile locations
191AC_ARG_WITH(run-dir,
192    AS_HELP_STRING([--with-run-dir=path],[set default directory to chdir to (by default dir part of cfg file)]),
193    UNBOUND_RUN_DIR="$withval",
194if test $on_mingw = no; then
195    UNBOUND_RUN_DIR=`dirname "$ub_conf_file"`
196else
197    UNBOUND_RUN_DIR=""
198fi
199)
200AC_SUBST(UNBOUND_RUN_DIR)
201ACX_ESCAPE_BACKSLASH($UNBOUND_RUN_DIR, hdr_run)
202AC_DEFINE_UNQUOTED(RUN_DIR, ["$hdr_run"], [Directory to chdir to])
203
204AC_ARG_WITH(chroot-dir,
205    AS_HELP_STRING([--with-chroot-dir=path],[set default directory to chroot to (by default same as run-dir)]),
206    UNBOUND_CHROOT_DIR="$withval",
207if test $on_mingw = no; then
208    UNBOUND_CHROOT_DIR="$UNBOUND_RUN_DIR"
209else
210    UNBOUND_CHROOT_DIR=""
211fi
212)
213AC_SUBST(UNBOUND_CHROOT_DIR)
214ACX_ESCAPE_BACKSLASH($UNBOUND_CHROOT_DIR, hdr_chroot)
215AC_DEFINE_UNQUOTED(CHROOT_DIR, ["$hdr_chroot"], [Directory to chroot to])
216
217AC_ARG_WITH(share-dir,
218    AS_HELP_STRING([--with-share-dir=path],[set default directory with shared data (by default same as share/unbound)]),
219    UNBOUND_SHARE_DIR="$withval",
220    UNBOUND_SHARE_DIR="$UNBOUND_RUN_DIR")
221AC_SUBST(UNBOUND_SHARE_DIR)
222AC_DEFINE_UNQUOTED(SHARE_DIR, ["$UNBOUND_SHARE_DIR"], [Shared data])
223
224AC_ARG_WITH(pidfile,
225    AS_HELP_STRING([--with-pidfile=filename],[set default pathname to unbound pidfile (default run-dir/unbound.pid)]),
226    UNBOUND_PIDFILE="$withval",
227if test $on_mingw = no; then
228    UNBOUND_PIDFILE="$UNBOUND_RUN_DIR/unbound.pid"
229else
230    UNBOUND_PIDFILE=""
231fi
232)
233AC_SUBST(UNBOUND_PIDFILE)
234ACX_ESCAPE_BACKSLASH($UNBOUND_PIDFILE, hdr_pid)
235AC_DEFINE_UNQUOTED(PIDFILE, ["$hdr_pid"], [default pidfile location])
236
237AC_ARG_WITH(rootkey-file,
238    AS_HELP_STRING([--with-rootkey-file=filename],[set default pathname to root key file (default run-dir/root.key). This file is read and written.]),
239    UNBOUND_ROOTKEY_FILE="$withval",
240if test $on_mingw = no; then
241    UNBOUND_ROOTKEY_FILE="$UNBOUND_RUN_DIR/root.key"
242else
243    UNBOUND_ROOTKEY_FILE="C:\\Program Files\\Unbound\\root.key"
244fi
245)
246AC_SUBST(UNBOUND_ROOTKEY_FILE)
247ACX_ESCAPE_BACKSLASH($UNBOUND_ROOTKEY_FILE, hdr_rkey)
248AC_DEFINE_UNQUOTED(ROOT_ANCHOR_FILE, ["$hdr_rkey"], [default rootkey location])
249
250AC_ARG_WITH(rootcert-file,
251    AS_HELP_STRING([--with-rootcert-file=filename],[set default pathname to root update certificate file (default run-dir/icannbundle.pem).  This file need not exist if you are content with the builtin.]),
252    UNBOUND_ROOTCERT_FILE="$withval",
253if test $on_mingw = no; then
254    UNBOUND_ROOTCERT_FILE="$UNBOUND_RUN_DIR/icannbundle.pem"
255else
256    UNBOUND_ROOTCERT_FILE="C:\\Program Files\\Unbound\\icannbundle.pem"
257fi
258)
259AC_SUBST(UNBOUND_ROOTCERT_FILE)
260ACX_ESCAPE_BACKSLASH($UNBOUND_ROOTCERT_FILE, hdr_rpem)
261AC_DEFINE_UNQUOTED(ROOT_CERT_FILE, ["$hdr_rpem"], [default rootcert location])
262
263AC_ARG_WITH(username,
264    AS_HELP_STRING([--with-username=user],[set default user that unbound changes to (default user is unbound)]),
265    UNBOUND_USERNAME="$withval",
266    UNBOUND_USERNAME="unbound")
267AC_SUBST(UNBOUND_USERNAME)
268AC_DEFINE_UNQUOTED(UB_USERNAME, ["$UNBOUND_USERNAME"], [default username])
269
270AC_DEFINE(WINVER, 0x0502, [the version of the windows API enabled])
271ACX_RSRC_VERSION(wnvs)
272AC_DEFINE_UNQUOTED(RSRC_PACKAGE_VERSION, [$wnvs], [version number for resource files])
273
274# Checks for typedefs, structures, and compiler characteristics.
275AC_C_CONST
276AC_LANG([C])
277# allow user to override the -g -O2 flags.
278default_cflags=no
279if test "x$CFLAGS" = "x" ; then
280ACX_CHECK_COMPILER_FLAG(g, [CFLAGS="$CFLAGS -g"])
281ACX_CHECK_COMPILER_FLAG(O2, [CFLAGS="$CFLAGS -O2"])
282default_cflags=yes
283fi
284m4_version_prereq([2.70], [AC_PROG_CC], [AC_PROG_CC_STDC])
285ACX_DEPFLAG
286ACX_DETERMINE_EXT_FLAGS_UNBOUND
287
288# debug mode flags warnings
289AC_ARG_ENABLE(checking, AS_HELP_STRING([--enable-checking],[Enable warnings, asserts, makefile-dependencies]))
290AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug],[same as enable-checking]))
291if test "$enable_debug" = "yes"; then debug_enabled="$enable_debug";
292else debug_enabled="$enable_checking"; fi
293AC_SUBST(debug_enabled)
294case "$debug_enabled" in
295        yes)
296		ACX_CHECK_COMPILER_FLAG(W, [CFLAGS="$CFLAGS -W"])
297		ACX_CHECK_COMPILER_FLAG(Wall, [CFLAGS="$CFLAGS -Wall"])
298		ACX_CHECK_COMPILER_FLAG(Wextra, [CFLAGS="$CFLAGS -Wextra"])
299		ACX_CHECK_COMPILER_FLAG(Wdeclaration-after-statement, [CFLAGS="$CFLAGS -Wdeclaration-after-statement"])
300		AC_DEFINE([UNBOUND_DEBUG], [], [define this to enable debug checks.])
301		;;
302	no|*)
303		# nothing to do.
304		;;
305esac
306if test "$default_cflags" = "yes"; then
307	# only when CFLAGS was "" at the start, if the users wants to
308	# override we shouldn't add default cflags, because they wouldn't
309	# be able to turn off these options and set the CFLAGS wanted.
310	ACX_CHECK_FLTO
311	ACX_CHECK_PIE
312	ACX_CHECK_RELRO_NOW
313fi
314
315AC_C_INLINE
316ACX_CHECK_FORMAT_ATTRIBUTE
317ACX_CHECK_UNUSED_ATTRIBUTE
318
319AC_DEFUN([CHECK_WEAK_ATTRIBUTE],
320[AC_REQUIRE([AC_PROG_CC])
321AC_MSG_CHECKING(whether the C compiler (${CC-cc}) accepts the "weak" attribute)
322AC_CACHE_VAL(ac_cv_c_weak_attribute,
323[ac_cv_c_weak_attribute=no
324AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <stdio.h>
325__attribute__((weak)) void f(int x) { printf("%d", x); }
326]], [[
327   f(1);
328]])],[ac_cv_c_weak_attribute="yes"],[ac_cv_c_weak_attribute="no"])
329])
330
331AC_MSG_RESULT($ac_cv_c_weak_attribute)
332if test $ac_cv_c_weak_attribute = yes; then
333  AC_DEFINE(HAVE_ATTR_WEAK, 1, [Whether the C compiler accepts the "weak" attribute])
334  AC_DEFINE(ATTR_WEAK, [__attribute__((weak))], [apply the weak attribute to a symbol])
335fi
336])dnl End of CHECK_WEAK_ATTRIBUTE
337
338CHECK_WEAK_ATTRIBUTE
339
340AC_DEFUN([CHECK_NORETURN_ATTRIBUTE],
341[AC_REQUIRE([AC_PROG_CC])
342AC_MSG_CHECKING(whether the C compiler (${CC-cc}) accepts the "noreturn" attribute)
343AC_CACHE_VAL(ac_cv_c_noreturn_attribute,
344[ac_cv_c_noreturn_attribute=no
345AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <stdio.h>
346__attribute__((noreturn)) void f(int x) { printf("%d", x); }
347]], [[
348   f(1);
349]])],[ac_cv_c_noreturn_attribute="yes"],[ac_cv_c_noreturn_attribute="no"])
350])
351
352AC_MSG_RESULT($ac_cv_c_noreturn_attribute)
353if test $ac_cv_c_noreturn_attribute = yes; then
354  AC_DEFINE(HAVE_ATTR_NORETURN, 1, [Whether the C compiler accepts the "noreturn" attribute])
355  AC_DEFINE(ATTR_NORETURN, [__attribute__((__noreturn__))], [apply the noreturn attribute to a function that exits the program])
356fi
357])dnl End of CHECK_NORETURN_ATTRIBUTE
358
359CHECK_NORETURN_ATTRIBUTE
360
361if test "$srcdir" != "."; then
362	CPPFLAGS="$CPPFLAGS -I$srcdir"
363fi
364
365AC_DEFUN([ACX_YYLEX_DESTROY], [
366	AC_MSG_CHECKING([for yylex_destroy])
367	if echo %% | $LEX -t 2>&1 | grep yylex_destroy >/dev/null 2>&1; then
368		AC_DEFINE(LEX_HAS_YYLEX_DESTROY, 1, [if lex has yylex_destroy])
369		AC_MSG_RESULT(yes)
370	else AC_MSG_RESULT(no);
371		LEX=":"
372	fi
373])
374
375AC_DEFUN([ACX_YYLEX_OPTION], [
376	AC_MSG_CHECKING([for lex %option])
377	if cat <<EOF | $LEX -t 2>&1 | grep yy_delete_buffer >/dev/null 2>&1; then
378%option nounput
379%%
380EOF
381		AC_MSG_RESULT(yes)
382	else AC_MSG_RESULT(no);
383		LEX=":"
384	fi
385])
386
387AC_PROG_LEX([noyywrap])
388if test "$LEX" != "" -a "$LEX" != ":"; then
389ACX_YYLEX_DESTROY
390fi
391if test "$LEX" != "" -a "$LEX" != ":"; then
392ACX_YYLEX_OPTION
393fi
394if test "$LEX" = "" -o "$LEX" = ":"; then
395	if test ! -f util/configlexer.c; then
396		AC_MSG_ERROR([no lex and no util/configlexer.c: need flex and bison to compile from source repository.])
397	fi
398fi
399AC_PROG_YACC
400if test "$YACC" = "" -o "$YACC" = ":"; then
401	if test ! -f util/configparser.c; then
402		AC_MSG_ERROR([no yacc and no util/configparser.c: need flex and bison to compile from source repository.])
403	fi
404fi
405AC_CHECK_PROG(doxygen, doxygen, doxygen)
406AC_CHECK_TOOL(STRIP, strip)
407ACX_LIBTOOL_C_ONLY
408
409# pkg-config is only needed for these options, do not require it otherwise
410if test "$enable_systemd" = "yes" -o "$with_pyunbound" = "yes" -o "$with_pythonmod" = "yes"; then
411PKG_PROG_PKG_CONFIG
412fi
413
414# Checks for header files.
415AC_CHECK_HEADERS([stdarg.h stdbool.h netinet/in.h netinet/tcp.h sys/param.h sys/select.h sys/socket.h sys/un.h sys/uio.h sys/resource.h arpa/inet.h syslog.h netdb.h sys/wait.h pwd.h glob.h grp.h login_cap.h winsock2.h ws2tcpip.h endian.h sys/endian.h libkern/OSByteOrder.h sys/ipc.h sys/shm.h ifaddrs.h poll.h],,, [AC_INCLUDES_DEFAULT])
416# net/if.h portability for Darwin see:
417# https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Header-Portability.html
418AC_CHECK_HEADERS([net/if.h],,, [
419#include <stdio.h>
420#ifdef STDC_HEADERS
421# include <stdlib.h>
422# include <stddef.h>
423#else
424# ifdef HAVE_STDLIB_H
425#  include <stdlib.h>
426# endif
427#endif
428#ifdef HAVE_SYS_SOCKET_H
429# include <sys/socket.h>
430#endif
431])
432
433# Check for Apple header. This uncovers TARGET_OS_IPHONE, TARGET_OS_TV or TARGET_OS_WATCH
434AC_CHECK_HEADERS([TargetConditionals.h],,, [AC_INCLUDES_DEFAULT])
435AC_CHECK_HEADERS([netioapi.h],,, [AC_INCLUDES_DEFAULT
436#if HAVE_SYS_PARAM_H
437#include <sys/param.h>
438#endif
439
440#ifdef HAVE_SYS_SOCKET_H
441#include <sys/socket.h>
442#endif
443
444#ifdef HAVE_SYS_UIO_H
445#include <sys/uio.h>
446#endif
447
448#ifdef HAVE_NETINET_IN_H
449#include <netinet/in.h>
450#endif
451
452#ifdef HAVE_NETINET_TCP_H
453#include <netinet/tcp.h>
454#endif
455
456#ifdef HAVE_ARPA_INET_H
457#include <arpa/inet.h>
458#endif
459
460#ifdef HAVE_WINSOCK2_H
461#include <winsock2.h>
462#endif
463
464#ifdef HAVE_WS2TCPIP_H
465#include <ws2tcpip.h>
466#endif
467])
468
469# Check for Linux timestamping headers
470AC_CHECK_HEADERS([linux/net_tstamp.h],,, [AC_INCLUDES_DEFAULT])
471
472# check for types.
473# Using own tests for int64* because autoconf builtin only give 32bit.
474AC_CHECK_TYPE(int8_t, signed char)
475AC_CHECK_TYPE(int16_t, short)
476AC_CHECK_TYPE(int32_t, int)
477AC_CHECK_TYPE(int64_t, long long)
478AC_CHECK_TYPE(uint8_t, unsigned char)
479AC_CHECK_TYPE(uint16_t, unsigned short)
480AC_CHECK_TYPE(uint32_t, unsigned int)
481AC_CHECK_TYPE(uint64_t, unsigned long long)
482AC_TYPE_SIZE_T
483AC_CHECK_TYPE(ssize_t, int)
484AC_TYPE_UID_T
485AC_TYPE_PID_T
486AC_TYPE_OFF_T
487ACX_TYPE_U_CHAR
488ACX_TYPE_RLIM_T
489ACX_TYPE_SOCKLEN_T
490ACX_TYPE_IN_ADDR_T
491ACX_TYPE_IN_PORT_T
492ACX_CHECK_MEMCMP_SIGNED
493
494AC_CHECK_SIZEOF(time_t,,[
495AC_INCLUDES_DEFAULT
496#ifdef TIME_WITH_SYS_TIME
497# include <sys/time.h>
498# include <time.h>
499#else
500# ifdef HAVE_SYS_TIME_H
501#  include <sys/time.h>
502# else
503#  include <time.h>
504# endif
505#endif
506])
507AC_CHECK_SIZEOF(size_t)
508
509# add option to disable the evil rpath
510ACX_ARG_RPATH
511AC_SUBST(RUNTIME_PATH)
512
513# check to see if libraries are needed for these functions.
514AC_SEARCH_LIBS([inet_pton], [nsl])
515AC_SEARCH_LIBS([socket], [socket])
516
517# check whether strptime also works
518AC_DEFUN([AC_CHECK_STRPTIME_WORKS],
519[AC_REQUIRE([AC_PROG_CC])
520AC_MSG_CHECKING(whether strptime works)
521if test c${cross_compiling} = cno; then
522AC_RUN_IFELSE([AC_LANG_SOURCE([[
523#define _XOPEN_SOURCE 600
524#include <time.h>
525int main(void) { struct tm tm; char *res;
526res = strptime("2010-07-15T00:00:00+00:00", "%t%Y%t-%t%m%t-%t%d%tT%t%H%t:%t%M%t:%t%S%t", &tm);
527if (!res) return 2;
528res = strptime("20070207111842", "%Y%m%d%H%M%S", &tm);
529if (!res) return 1; return 0; }
530]])] , [eval "ac_cv_c_strptime_works=yes"], [eval "ac_cv_c_strptime_works=no"],
531[eval "ac_cv_c_strptime_works=maybe"])
532else
533eval "ac_cv_c_strptime_works=maybe"
534fi
535AC_MSG_RESULT($ac_cv_c_strptime_works)
536if test $ac_cv_c_strptime_works = no; then
537AC_LIBOBJ(strptime)
538else
539AC_DEFINE_UNQUOTED([STRPTIME_WORKS], 1, [use default strptime.])
540fi
541])dnl
542
543# check some functions of the OS before linking libs (while still runnable).
544AC_FUNC_CHOWN
545AC_FUNC_FORK
546AC_DEFINE(RETSIGTYPE,void,[Return type of signal handlers, but autoconf 2.70 says 'your code may safely assume C89 semantics that RETSIGTYPE is void.'])
547AC_FUNC_FSEEKO
548ACX_SYS_LARGEFILE
549ACX_CHECK_NONBLOCKING_BROKEN
550ACX_MKDIR_ONE_ARG
551AC_CHECK_FUNCS([strptime],[AC_CHECK_STRPTIME_WORKS],[AC_LIBOBJ([strptime])])
552
553# check if we can use SO_REUSEPORT
554reuseport_default=0
555if echo "$host" | $GREP -i -e linux >/dev/null; then reuseport_default=1; fi
556if echo "$host" | $GREP -i -e dragonfly >/dev/null; then reuseport_default=1; fi
557if test "$reuseport_default" = 1; then
558	AC_DEFINE(REUSEPORT_DEFAULT, 1, [if REUSEPORT is enabled by default])
559else
560	AC_DEFINE(REUSEPORT_DEFAULT, 0, [if REUSEPORT is enabled by default])
561fi
562
563# Include systemd.m4 - begin
564sinclude(systemd.m4)
565# Include systemd.m4 - end
566
567# set memory allocation checking if requested
568AC_ARG_ENABLE(alloc-checks, AS_HELP_STRING([--enable-alloc-checks],[ enable to memory allocation statistics, for debug purposes ]),
569	, )
570AC_ARG_ENABLE(alloc-lite, AS_HELP_STRING([--enable-alloc-lite],[ enable for lightweight alloc assertions, for debug purposes ]),
571	, )
572AC_ARG_ENABLE(alloc-nonregional, AS_HELP_STRING([--enable-alloc-nonregional],[ enable nonregional allocs, slow but exposes regional allocations to other memory purifiers, for debug purposes ]),
573	, )
574if test x_$enable_alloc_nonregional = x_yes; then
575	AC_DEFINE(UNBOUND_ALLOC_NONREGIONAL, 1, [use malloc not regions, for debug use])
576fi
577if test x_$enable_alloc_checks = x_yes; then
578	AC_DEFINE(UNBOUND_ALLOC_STATS, 1, [use statistics for allocs and frees, for debug use])
579	SLDNS_ALLOCCHECK_EXTRA_OBJ="alloc.lo log.lo"
580	AC_SUBST(SLDNS_ALLOCCHECK_EXTRA_OBJ)
581	ASYNCLOOK_ALLOCCHECK_EXTRA_OBJ="alloc.lo"
582	AC_SUBST(ASYNCLOOK_ALLOCCHECK_EXTRA_OBJ)
583else
584	if test x_$enable_alloc_lite = x_yes; then
585		AC_DEFINE(UNBOUND_ALLOC_LITE, 1, [use to enable lightweight alloc assertions, for debug use])
586	else
587		ACX_FUNC_MALLOC([unbound])
588	fi
589fi
590
591# check windows threads (we use them, not pthreads, on windows).
592if test "$on_mingw" = "yes"; then
593# check windows threads
594	AC_CHECK_HEADERS([windows.h],,, [AC_INCLUDES_DEFAULT])
595	AC_MSG_CHECKING([for CreateThread])
596	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
597#ifdef HAVE_WINDOWS_H
598#include <windows.h>
599#endif
600], [
601	HANDLE t = CreateThread(NULL, 0, NULL, NULL, 0, NULL);
602])],
603	AC_MSG_RESULT(yes)
604	AC_DEFINE(HAVE_WINDOWS_THREADS, 1, [Using Windows threads])
605,
606	AC_MSG_RESULT(no)
607)
608
609else
610# not on mingw, check thread libraries.
611
612# check for thread library.
613# check this first, so that the pthread lib does not get linked in via
614# libssl or libpython, and thus distorts the tests, and we end up using
615# the non-threadsafe C libraries.
616AC_ARG_WITH(pthreads, AS_HELP_STRING([--with-pthreads],[use pthreads library, or --without-pthreads to disable threading support.]),
617 [ ],[ withval="yes" ])
618ub_have_pthreads=no
619if test x_$withval != x_no; then
620	AX_PTHREAD([
621		AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.])
622		if test -n "$PTHREAD_LIBS"; then
623		  LIBS="$PTHREAD_LIBS $LIBS"
624		fi
625		CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
626		CC="$PTHREAD_CC"
627		ub_have_pthreads=yes
628		AC_CHECK_TYPES([pthread_spinlock_t, pthread_rwlock_t],,,[#include <pthread.h>])
629		AC_CHECK_SIZEOF([unsigned long])
630		AC_CHECK_SIZEOF(pthread_t)
631
632		if echo "$CFLAGS" | $GREP -e "-pthread" >/dev/null; then
633		AC_MSG_CHECKING([if -pthread unused during linking])
634		# catch clang warning 'argument unused during compilation'
635		AC_LANG_CONFTEST([AC_LANG_SOURCE(AC_INCLUDES_DEFAULT
636[[
637int main(void) {return 0;}
638]])])
639		pthread_unused="yes"
640		# first compile
641		echo "$CC $CFLAGS -c conftest.c -o conftest.o" >&AS_MESSAGE_LOG_FD
642		$CC $CFLAGS -c conftest.c -o conftest.o 2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD
643		if test $? = 0; then
644			# then link
645			echo "$CC $CFLAGS -Werror $LDFLAGS $LIBS -o conftest contest.o" >&AS_MESSAGE_LOG_FD
646			$CC $CFLAGS -Werror $LDFLAGS $LIBS -o conftest conftest.o 2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD
647			if test $? -ne 0; then
648				AC_MSG_RESULT(yes)
649				CFLAGS=`echo "$CFLAGS" | sed -e 's/-pthread//'`
650				PTHREAD_CFLAGS_ONLY="-pthread"
651				AC_SUBST(PTHREAD_CFLAGS_ONLY)
652			else
653				AC_MSG_RESULT(no)
654			fi
655		else
656			AC_MSG_RESULT(no)
657		fi # endif cc successful
658		rm -f conftest conftest.c conftest.o
659		fi # endif -pthread in CFLAGS
660
661		])
662fi
663
664# check solaris thread library
665AC_ARG_WITH(solaris-threads, AS_HELP_STRING([--with-solaris-threads],[use solaris native thread library.]), [ ],[ withval="no" ])
666ub_have_sol_threads=no
667if test x_$withval != x_no; then
668	if test x_$ub_have_pthreads != x_no; then
669	    AC_MSG_WARN([Have pthreads already, ignoring --with-solaris-threads])
670	else
671	AC_SEARCH_LIBS(thr_create, [thread],
672	[
673    		AC_DEFINE(HAVE_SOLARIS_THREADS, 1, [Using Solaris threads])
674
675		ACX_CHECK_COMPILER_FLAG(mt, [CFLAGS="$CFLAGS -mt"],
676			[CFLAGS="$CFLAGS -D_REENTRANT"])
677		ub_have_sol_threads=yes
678	] , [
679		AC_MSG_ERROR([no solaris threads found.])
680	])
681	fi
682fi
683
684fi # end of non-mingw check of thread libraries
685
686# Check for SYSLOG_FACILITY
687AC_ARG_WITH(syslog-facility, AS_HELP_STRING([--with-syslog-facility=LOCAL0 - LOCAL7],[ set SYSLOG_FACILITY, default DAEMON ]),
688	[ UNBOUND_SYSLOG_FACILITY="$withval" ], [])
689case "${UNBOUND_SYSLOG_FACILITY}" in
690
691  LOCAL[[0-7]]) UNBOUND_SYSLOG_FACILITY="LOG_${UNBOUND_SYSLOG_FACILITY}" ;;
692
693           *) UNBOUND_SYSLOG_FACILITY="LOG_DAEMON" ;;
694
695esac
696AC_DEFINE_UNQUOTED(UB_SYSLOG_FACILITY,${UNBOUND_SYSLOG_FACILITY},[the SYSLOG_FACILITY to use, default LOG_DAEMON])
697
698# Check for dynamic library module
699AC_ARG_WITH(dynlibmodule,
700   AS_HELP_STRING([--with-dynlibmodule],[build dynamic library module, or --without-dynlibmodule to disable it. (default=no)]),
701   [], [ withval="no" ])
702
703if test x_$withval != x_no; then
704  AC_DEFINE(WITH_DYNLIBMODULE, 1, [Define if you want dynlib module.])
705  WITH_DYNLIBMODULE=yes
706  AC_SUBST(WITH_DYNLIBMODULE)
707  DYNLIBMOD_OBJ="dynlibmod.lo"
708  AC_SUBST(DYNLIBMOD_OBJ)
709  DYNLIBMOD_HEADER='$(srcdir)/dynlibmod/dynlibmod.h'
710  AC_SUBST(DYNLIBMOD_HEADER)
711  if test $on_mingw = "no"; then
712    # link with -ldl if not already there, for all executables because
713    # dlopen call is in the dynlib module.  For unbound executable, also
714    # export symbols.
715    AC_SEARCH_LIBS([dlopen], [dl])
716    DYNLIBMOD_EXTRALIBS="-export-dynamic"
717  else
718    DYNLIBMOD_EXTRALIBS="-Wl,--export-all-symbols,--out-implib,libunbound.dll.a"
719  fi
720  AC_SUBST(DYNLIBMOD_EXTRALIBS)
721fi
722
723# Check for PyUnbound
724AC_ARG_WITH(pyunbound,
725   AS_HELP_STRING([--with-pyunbound],[build PyUnbound, or --without-pyunbound to skip it. (default=no)]),
726   [], [ withval="no" ])
727
728ub_test_python=no
729ub_with_pyunbound=no
730if test x_$withval != x_no; then
731   ub_with_pyunbound=yes
732   ub_test_python=yes
733fi
734
735# Check for Python module
736AC_ARG_WITH(pythonmodule,
737   AS_HELP_STRING([--with-pythonmodule],[build Python module, or --without-pythonmodule to disable script engine. (default=no)]),
738   [], [ withval="no" ])
739
740ub_with_pythonmod=no
741if test x_$withval != x_no; then
742   ub_with_pythonmod=yes
743   ub_test_python=yes
744fi
745
746# Check for Python & SWIG only on PyUnbound or PyModule
747if test x_$ub_test_python != x_no; then
748
749   # Check for Python
750   ub_have_python=no
751   ac_save_LIBS="$LIBS" dnl otherwise AC_PYTHON_DEVEL thrashes $LIBS
752   AC_PYTHON_DEVEL
753   if test ! -z "$PYTHON_VERSION"; then
754	badversion="no"
755	if test "$PYTHON_VERSION_MAJOR" -lt 2; then
756		badversion="yes"
757	fi
758	if test "$PYTHON_VERSION_MAJOR" -eq 2 -a "$PYTHON_VERSION_MINOR" -lt 4; then
759		badversion="yes"
760	fi
761	if test "$badversion" = "yes"; then
762		AC_MSG_ERROR([Python version >= 2.4.0 is required])
763	fi
764
765      [PY_MAJOR_VERSION="`$PYTHON -c \"import sys; print(sys.version_info[0])\"`"]
766      AC_SUBST(PY_MAJOR_VERSION)
767      # Have Python
768      AC_DEFINE(HAVE_PYTHON,1,[Define if you have Python libraries and header files.])
769      if test x_$ub_with_pythonmod != x_no; then
770        if test -n "$LIBS"; then
771          LIBS="$PYTHON_LDFLAGS $LIBS"
772        else
773          LIBS="$PYTHON_LDFLAGS"
774        fi
775      fi
776      PYTHON_LIBS="$PYTHON_LDFLAGS"
777      AC_SUBST(PYTHON_LIBS)
778      if test -n "$CPPFLAGS"; then
779        CPPFLAGS="$CPPFLAGS $PYTHON_CPPFLAGS"
780      else
781        CPPFLAGS="$PYTHON_CPPFLAGS"
782      fi
783      if test "$PYTHON_LIBDIR" != "/usr/lib" -a "$PYTHON_LIBDIR" != "" -a "$PYTHON_LIBDIR" != "/usr/lib64"; then
784        ACX_RUNTIME_PATH_ADD([$PYTHON_LIBDIR])
785      fi
786      ub_have_python=yes
787      PKG_CHECK_EXISTS(["python${PY_MAJOR_VERSION}"],
788                       [PC_PY_DEPENDENCY="python${PY_MAJOR_VERSION}"],
789                       [PC_PY_DEPENDENCY="python"])
790      AC_SUBST(PC_PY_DEPENDENCY)
791
792      # Check for SWIG
793      ub_have_swig=no
794      AC_ARG_ENABLE(swig-version-check, AS_HELP_STRING([--disable-swig-version-check],[Disable swig version check to build python modules with older swig even though that is unreliable]))
795      if test "$enable_swig_version_check" = "yes"; then
796      	AC_PROG_SWIG(2.0.1)
797      else
798      	AC_PROG_SWIG
799      fi
800      AC_MSG_CHECKING(SWIG)
801      if test ! -x "$SWIG"; then
802         AC_MSG_ERROR([failed to find swig tool, install it, or do not build Python module and PyUnbound])
803      else
804         AC_DEFINE(HAVE_SWIG, 1, [Define if you have Swig libraries and header files.])
805         AC_SUBST(swig, "$SWIG")
806         AC_MSG_RESULT(present)
807
808         # If have Python & SWIG
809         # Declare PythonMod
810         if test x_$ub_with_pythonmod != x_no; then
811            AC_DEFINE(WITH_PYTHONMODULE, 1, [Define if you want Python module.])
812            WITH_PYTHONMODULE=yes
813            AC_SUBST(WITH_PYTHONMODULE)
814	    PYTHONMOD_OBJ="pythonmod.lo pythonmod_utils.lo"
815	    AC_SUBST(PYTHONMOD_OBJ)
816	    PYTHONMOD_HEADER='$(srcdir)/pythonmod/pythonmod.h'
817	    AC_SUBST(PYTHONMOD_HEADER)
818	    PYTHONMOD_INSTALL=pythonmod-install
819	    AC_SUBST(PYTHONMOD_INSTALL)
820	    PYTHONMOD_UNINSTALL=pythonmod-uninstall
821	    AC_SUBST(PYTHONMOD_UNINSTALL)
822         fi
823
824         # Declare PyUnbound
825         if test x_$ub_with_pyunbound != x_no; then
826            AC_DEFINE(WITH_PYUNBOUND, 1, [Define if you want PyUnbound.])
827            WITH_PYUNBOUND=yes
828            AC_SUBST(WITH_PYUNBOUND)
829	    PYUNBOUND_OBJ="libunbound_wrap.lo"
830	    AC_SUBST(PYUNBOUND_OBJ)
831	    PYUNBOUND_TARGET="_unbound.la"
832	    AC_SUBST(PYUNBOUND_TARGET)
833	    PYUNBOUND_INSTALL=pyunbound-install
834	    AC_SUBST(PYUNBOUND_INSTALL)
835	    PYUNBOUND_UNINSTALL=pyunbound-uninstall
836	    AC_SUBST(PYUNBOUND_UNINSTALL)
837         fi
838      fi
839   else
840      AC_MSG_RESULT([*** Python libraries not found, won't build PythonMod or PyUnbound ***])
841      ub_with_pyunbound=no
842      ub_with_pythonmod=no
843   fi
844fi
845
846if test "`uname`" = "NetBSD"; then
847	NETBSD_LINTFLAGS='"-D__RENAME(x)=" -D_NETINET_IN_H_'
848	AC_SUBST(NETBSD_LINTFLAGS)
849fi
850
851if test "`uname`" = "Linux"; then
852	# splint cannot parse modern c99 header files
853	GCC_DOCKER_LINTFLAGS='-syntax'
854	AC_SUBST(GCC_DOCKER_LINTFLAGS)
855fi
856CONFIG_DATE=`date +%Y%m%d`
857AC_SUBST(CONFIG_DATE)
858
859# Checks for libraries.
860
861# libnss
862USE_NSS="no"
863AC_ARG_WITH([nss], AS_HELP_STRING([--with-nss=path],[use libnss instead of openssl, installed at path.]),
864	[
865	USE_NSS="yes"
866	AC_DEFINE(HAVE_NSS, 1, [Use libnss for crypto])
867	if test "$withval" != "" -a "$withval" != "yes"; then
868		CPPFLAGS="$CPPFLAGS -I$withval/include/nss3"
869		LDFLAGS="$LDFLAGS -L$withval/lib"
870		ACX_RUNTIME_PATH_ADD([$withval/lib])
871		CPPFLAGS="-I$withval/include/nspr4 $CPPFLAGS"
872	else
873		CPPFLAGS="$CPPFLAGS -I/usr/include/nss3"
874		CPPFLAGS="-I/usr/include/nspr4 $CPPFLAGS"
875	fi
876        LIBS="$LIBS -lnss3 -lnspr4"
877	SSLLIB=""
878	PC_CRYPTO_DEPENDENCY="nss nspr"
879	AC_SUBST(PC_CRYPTO_DEPENDENCY)
880	]
881)
882
883# libnettle
884USE_NETTLE="no"
885AC_ARG_WITH([nettle], AS_HELP_STRING([--with-nettle=path],[use libnettle as crypto library, installed at path.]),
886	[
887	USE_NETTLE="yes"
888	AC_DEFINE(HAVE_NETTLE, 1, [Use libnettle for crypto])
889	AC_CHECK_HEADERS([nettle/dsa-compat.h],,, [AC_INCLUDES_DEFAULT])
890	if test "$withval" != "" -a "$withval" != "yes"; then
891		CPPFLAGS="$CPPFLAGS -I$withval/include/nettle"
892		LDFLAGS="$LDFLAGS -L$withval/lib"
893		ACX_RUNTIME_PATH_ADD([$withval/lib])
894	else
895		CPPFLAGS="$CPPFLAGS -I/usr/include/nettle"
896	fi
897        LIBS="$LIBS -lhogweed -lnettle -lgmp"
898	SSLLIB=""
899	PC_CRYPTO_DEPENDENCY="hogweed nettle"
900	AC_SUBST(PC_CRYPTO_DEPENDENCY)
901	]
902)
903
904# openssl
905if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
906ACX_WITH_SSL
907ACX_LIB_SSL
908SSLLIB="-lssl"
909
910PC_CRYPTO_DEPENDENCY=""
911AC_SUBST(PC_CRYPTO_DEPENDENCY)
912
913# check if -lcrypt32 is needed because CAPIENG needs that. (on windows)
914BAKLIBS="$LIBS"
915LIBS="-lssl $LIBS"
916AC_MSG_CHECKING([if libssl needs -lcrypt32])
917AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
918	int EVP_sha256(void);
919	(void)EVP_sha256();
920]])], [
921	AC_MSG_RESULT([no])
922	LIBS="$BAKLIBS"
923], [
924	AC_MSG_RESULT([yes])
925	LIBS="$BAKLIBS"
926	LIBS="$LIBS -lcrypt32"
927])
928
929AC_MSG_CHECKING([for LibreSSL])
930if grep VERSION_TEXT $ssldir_include/openssl/opensslv.h | grep "LibreSSL" >/dev/null; then
931	AC_MSG_RESULT([yes])
932	AC_DEFINE([HAVE_LIBRESSL], [1], [Define if we have LibreSSL])
933	# libressl provides these compat functions, but they may also be
934	# declared by the OS in libc.  See if they have been declared.
935	AC_CHECK_DECLS([strlcpy,strlcat,arc4random,arc4random_uniform])
936else
937	AC_MSG_RESULT([no])
938fi
939AC_CHECK_HEADERS([openssl/conf.h openssl/engine.h openssl/bn.h openssl/dh.h openssl/dsa.h openssl/rsa.h openssl/core_names.h openssl/param_build.h],,, [AC_INCLUDES_DEFAULT])
940AC_CHECK_FUNCS([OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_default_properties_is_fips_enabled EVP_MD_CTX_new OpenSSL_add_all_digests OPENSSL_init_crypto EVP_cleanup ENGINE_cleanup ERR_load_crypto_strings CRYPTO_cleanup_all_ex_data ERR_free_strings RAND_cleanup DSA_SIG_set0 EVP_dss1 EVP_DigestVerify EVP_aes_256_cbc EVP_EncryptInit_ex HMAC_Init_ex CRYPTO_THREADID_set_callback EVP_MAC_CTX_set_params OSSL_PARAM_BLD_new BIO_set_callback_ex])
941
942# these check_funcs need -lssl
943BAKLIBS="$LIBS"
944LIBS="-lssl $LIBS"
945AC_CHECK_FUNCS([OPENSSL_init_ssl SSL_CTX_set_security_level SSL_set1_host SSL_get0_peername X509_VERIFY_PARAM_set1_host SSL_CTX_set_ciphersuites SSL_CTX_set_tlsext_ticket_key_evp_cb SSL_CTX_set_alpn_select_cb SSL_get0_alpn_selected SSL_CTX_set_alpn_protos SSL_get1_peer_certificate])
946LIBS="$BAKLIBS"
947
948AC_CHECK_DECLS([SSL_COMP_get_compression_methods,sk_SSL_COMP_pop_free,SSL_CTX_set_ecdh_auto], [], [], [
949AC_INCLUDES_DEFAULT
950#ifdef HAVE_OPENSSL_ERR_H
951#include <openssl/err.h>
952#endif
953
954#ifdef HAVE_OPENSSL_RAND_H
955#include <openssl/rand.h>
956#endif
957
958#ifdef HAVE_OPENSSL_CONF_H
959#include <openssl/conf.h>
960#endif
961
962#ifdef HAVE_OPENSSL_ENGINE_H
963#include <openssl/engine.h>
964#endif
965#include <openssl/ssl.h>
966#include <openssl/evp.h>
967])
968
969if test "$ac_cv_func_HMAC_Init_ex" = "yes"; then
970# check function return type.
971AC_MSG_CHECKING(the return type of HMAC_Init_ex)
972AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
973#ifdef HAVE_OPENSSL_ERR_H
974#include <openssl/err.h>
975#endif
976
977#ifdef HAVE_OPENSSL_RAND_H
978#include <openssl/rand.h>
979#endif
980
981#ifdef HAVE_OPENSSL_CONF_H
982#include <openssl/conf.h>
983#endif
984
985#ifdef HAVE_OPENSSL_ENGINE_H
986#include <openssl/engine.h>
987#endif
988#include <openssl/ssl.h>
989#include <openssl/evp.h>
990], [
991	HMAC_CTX* hmac_ctx = NULL;
992	void* hmac_key = NULL;
993	const EVP_MD* digest = NULL;
994	int x = HMAC_Init_ex(hmac_ctx, hmac_key, 32, digest, NULL);
995	(void)x;
996])], [
997	AC_MSG_RESULT(int)
998], [
999	AC_MSG_RESULT(void)
1000	AC_DEFINE([HMAC_INIT_EX_RETURNS_VOID], 1, [If HMAC_Init_ex() returns void])
1001])
1002fi
1003
1004fi
1005AC_SUBST(SSLLIB)
1006
1007# libbsd
1008AC_ARG_WITH([libbsd], AS_HELP_STRING([--with-libbsd],[Use portable libbsd functions]), [
1009	AC_CHECK_HEADERS([bsd/string.h bsd/stdlib.h],,, [AC_INCLUDES_DEFAULT])
1010	if test "x$ac_cv_header_bsd_string_h" = xyes -a "x$ac_cv_header_bsd_stdlib_h" = xyes; then
1011		for func in strlcpy strlcat arc4random arc4random_uniform reallocarray; do
1012			AC_SEARCH_LIBS([$func], [bsd], [
1013				AC_DEFINE(HAVE_LIBBSD, 1, [Use portable libbsd functions])
1014				PC_LIBBSD_DEPENDENCY=libbsd
1015				AC_SUBST(PC_LIBBSD_DEPENDENCY)
1016			])
1017		done
1018	fi
1019])
1020
1021AC_ARG_ENABLE(sha1, AS_HELP_STRING([--disable-sha1],[Disable SHA1 RRSIG support, does not disable nsec3 support]))
1022case "$enable_sha1" in
1023	no)
1024	;;
1025	yes|*)
1026	AC_DEFINE([USE_SHA1], [1], [Define this to enable SHA1 support.])
1027	;;
1028esac
1029
1030
1031AC_ARG_ENABLE(sha2, AS_HELP_STRING([--disable-sha2],[Disable SHA256 and SHA512 RRSIG support]))
1032case "$enable_sha2" in
1033	no)
1034	;;
1035	yes|*)
1036	AC_DEFINE([USE_SHA2], [1], [Define this to enable SHA256 and SHA512 support.])
1037	;;
1038esac
1039
1040AC_ARG_ENABLE(subnet, AS_HELP_STRING([--enable-subnet],[Enable client subnet]))
1041case "$enable_subnet" in
1042	yes)
1043	AC_DEFINE([CLIENT_SUBNET], [1], [Define this to enable client subnet option.])
1044	SUBNET_OBJ="edns-subnet.lo subnetmod.lo addrtree.lo subnet-whitelist.lo"
1045	AC_SUBST(SUBNET_OBJ)
1046	SUBNET_HEADER='$(srcdir)/edns-subnet/subnetmod.h $(srcdir)/edns-subnet/edns-subnet.h $(srcdir)/edns-subnet/subnet-whitelist.h $(srcdir)/edns-subnet/addrtree.h'
1047	AC_SUBST(SUBNET_HEADER)
1048	;;
1049	no|*)
1050	;;
1051esac
1052
1053# check whether gost also works
1054AC_DEFUN([AC_CHECK_GOST_WORKS],
1055[AC_REQUIRE([AC_PROG_CC])
1056AC_MSG_CHECKING([if GOST works])
1057if test c${cross_compiling} = cno; then
1058BAKCFLAGS="$CFLAGS"
1059if test -n "$ssldir"; then
1060	CFLAGS="$CFLAGS -Wl,-rpath,$ssldir_lib"
1061fi
1062AC_RUN_IFELSE([AC_LANG_SOURCE([[
1063#include <string.h>
1064#include <openssl/ssl.h>
1065#include <openssl/evp.h>
1066#include <openssl/engine.h>
1067#include <openssl/conf.h>
1068/* routine to load gost (from sldns) */
1069int load_gost_id(void)
1070{
1071	static int gost_id = 0;
1072	const EVP_PKEY_ASN1_METHOD* meth;
1073	ENGINE* e;
1074
1075	if(gost_id) return gost_id;
1076
1077	/* see if configuration loaded gost implementation from other engine*/
1078	meth = EVP_PKEY_asn1_find_str(NULL, "gost2001", -1);
1079	if(meth) {
1080		EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth);
1081		return gost_id;
1082	}
1083
1084	/* see if engine can be loaded already */
1085	e = ENGINE_by_id("gost");
1086	if(!e) {
1087		/* load it ourself, in case statically linked */
1088		ENGINE_load_builtin_engines();
1089		ENGINE_load_dynamic();
1090		e = ENGINE_by_id("gost");
1091	}
1092	if(!e) {
1093		/* no gost engine in openssl */
1094		return 0;
1095	}
1096	if(!ENGINE_set_default(e, ENGINE_METHOD_ALL)) {
1097		ENGINE_finish(e);
1098		ENGINE_free(e);
1099		return 0;
1100	}
1101
1102	meth = EVP_PKEY_asn1_find_str(&e, "gost2001", -1);
1103	if(!meth) {
1104		/* algo not found */
1105		ENGINE_finish(e);
1106		ENGINE_free(e);
1107		return 0;
1108	}
1109	EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth);
1110	return gost_id;
1111}
1112int main(void) {
1113	EVP_MD_CTX* ctx;
1114	const EVP_MD* md;
1115	unsigned char digest[64]; /* its a 256-bit digest, so uses 32 bytes */
1116	const char* str = "Hello world";
1117	const unsigned char check[] = {
1118		0x40 , 0xed , 0xf8 , 0x56 , 0x5a , 0xc5 , 0x36 , 0xe1 ,
1119		0x33 , 0x7c , 0x7e , 0x87 , 0x62 , 0x1c , 0x42 , 0xe0 ,
1120		0x17 , 0x1b , 0x5e , 0xce , 0xa8 , 0x46 , 0x65 , 0x4d ,
1121		0x8d , 0x3e , 0x22 , 0x9b , 0xe1 , 0x30 , 0x19 , 0x9d
1122	};
1123	OPENSSL_config(NULL);
1124	(void)load_gost_id();
1125	md = EVP_get_digestbyname("md_gost94");
1126	if(!md) return 1;
1127	memset(digest, 0, sizeof(digest));
1128	ctx = EVP_MD_CTX_create();
1129	if(!ctx) return 2;
1130	if(!EVP_DigestInit_ex(ctx, md, NULL)) return 3;
1131	if(!EVP_DigestUpdate(ctx, str, 10)) return 4;
1132	if(!EVP_DigestFinal_ex(ctx, digest, NULL)) return 5;
1133	/* uncomment to see the hash calculated.
1134		{int i;
1135		for(i=0; i<32; i++)
1136			printf(" %2.2x", (int)digest[i]);
1137		printf("\n");}
1138	*/
1139	if(memcmp(digest, check, sizeof(check)) != 0)
1140		return 6;
1141	return 0;
1142}
1143]])] , [eval "ac_cv_c_gost_works=yes"], [eval "ac_cv_c_gost_works=no"],
1144[eval "ac_cv_c_gost_works=maybe"])
1145CFLAGS="$BAKCFLAGS"
1146else
1147eval "ac_cv_c_gost_works=maybe"
1148fi
1149AC_MSG_RESULT($ac_cv_c_gost_works)
1150])dnl
1151
1152AC_ARG_ENABLE(gost, AS_HELP_STRING([--disable-gost],[Disable GOST support]))
1153use_gost="no"
1154if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
1155case "$enable_gost" in
1156	no)
1157	;;
1158	*)
1159	AC_CHECK_FUNC(EVP_PKEY_set_type_str, [:],[AC_MSG_ERROR([OpenSSL 1.0.0 is needed for GOST support])])
1160	AC_CHECK_FUNC(EC_KEY_new, [], [AC_MSG_ERROR([OpenSSL does not support ECC, needed for GOST support])])
1161	AC_CHECK_GOST_WORKS
1162	if test "$ac_cv_c_gost_works" != no; then
1163		use_gost="yes"
1164		AC_DEFINE([USE_GOST], [1], [Define this to enable GOST support.])
1165	fi
1166	;;
1167esac
1168fi dnl !USE_NSS && !USE_NETTLE
1169
1170AC_ARG_ENABLE(ecdsa, AS_HELP_STRING([--disable-ecdsa],[Disable ECDSA support]))
1171use_ecdsa="no"
1172case "$enable_ecdsa" in
1173    no)
1174      ;;
1175    *)
1176      if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
1177	      AC_CHECK_FUNC(ECDSA_sign, [], [AC_MSG_ERROR([OpenSSL does not support ECDSA: please upgrade or rerun with --disable-ecdsa])])
1178	      AC_CHECK_FUNC(SHA384_Init, [], [AC_MSG_ERROR([OpenSSL does not support SHA384: please upgrade or rerun with --disable-ecdsa])])
1179	      AC_CHECK_DECLS([NID_X9_62_prime256v1, NID_secp384r1], [], [AC_MSG_ERROR([OpenSSL does not support the ECDSA curves: please upgrade or rerun with --disable-ecdsa])], [AC_INCLUDES_DEFAULT
1180#include <openssl/evp.h>
1181	      ])
1182	      # see if OPENSSL 1.0.0 or later (has EVP MD and Verify independency)
1183	      AC_MSG_CHECKING([if openssl supports SHA2 and ECDSA with EVP])
1184	      if grep OPENSSL_VERSION_TEXT $ssldir_include/openssl/opensslv.h | grep "OpenSSL" >/dev/null; then
1185		if grep OPENSSL_VERSION_NUMBER $ssldir_include/openssl/opensslv.h | grep 0x0 >/dev/null; then
1186		  AC_MSG_RESULT([no])
1187		  AC_DEFINE_UNQUOTED([USE_ECDSA_EVP_WORKAROUND], [1], [Define this to enable an EVP workaround for older openssl])
1188		else
1189		  AC_MSG_RESULT([yes])
1190		fi
1191	      else
1192		# not OpenSSL, thus likely LibreSSL, which supports it
1193		AC_MSG_RESULT([yes])
1194	      fi
1195      fi
1196      # we now know we have ECDSA and the required curves.
1197      AC_DEFINE_UNQUOTED([USE_ECDSA], [1], [Define this to enable ECDSA support.])
1198      use_ecdsa="yes"
1199      ;;
1200esac
1201
1202AC_ARG_ENABLE(dsa, AS_HELP_STRING([--disable-dsa],[Disable DSA support]))
1203use_dsa="no"
1204case "$enable_dsa" in
1205    yes)
1206      # detect if DSA is supported, and turn it off if not.
1207      if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
1208      AC_CHECK_FUNC(DSA_SIG_new, [
1209      AC_CHECK_TYPE(DSA_SIG*, [
1210      AC_DEFINE_UNQUOTED([USE_DSA], [1], [Define this to enable DSA support.])
1211      ], [if test "x$enable_dsa" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support DSA and you used --enable-dsa.])
1212               fi ], [
1213AC_INCLUDES_DEFAULT
1214#ifdef HAVE_OPENSSL_ERR_H
1215#include <openssl/err.h>
1216#endif
1217
1218#ifdef HAVE_OPENSSL_RAND_H
1219#include <openssl/rand.h>
1220#endif
1221
1222#ifdef HAVE_OPENSSL_CONF_H
1223#include <openssl/conf.h>
1224#endif
1225
1226#ifdef HAVE_OPENSSL_ENGINE_H
1227#include <openssl/engine.h>
1228#endif
1229      ])
1230      ], [if test "x$enable_dsa" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support DSA and you used --enable-dsa.])
1231               fi ])
1232      else
1233      AC_DEFINE_UNQUOTED([USE_DSA], [1], [Define this to enable DSA support.])
1234      fi
1235      ;;
1236    *)
1237      # disable dsa by default, RFC 8624 section 3.1, validators MUST NOT
1238      # support DSA for DNSSEC Validation.
1239      ;;
1240esac
1241
1242AC_ARG_WITH(deprecate-rsa-1024, AS_HELP_STRING([--with-deprecate-rsa-1024],[Deprecate RSA 1024 bit length, makes that an unsupported key, for use when OpenSSL FIPS refuses 1024 bit verification]))
1243if test "$with_deprecate_rsa_1024" = "yes"; then
1244	AC_DEFINE([DEPRECATE_RSA_1024], [1], [Deprecate RSA 1024 bit length, makes that an unsupported key])
1245fi
1246
1247AC_ARG_ENABLE(ed25519, AS_HELP_STRING([--disable-ed25519],[Disable ED25519 support]))
1248use_ed25519="no"
1249case "$enable_ed25519" in
1250    no)
1251      ;;
1252    *)
1253      if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
1254	      AC_CHECK_DECLS([NID_ED25519], [
1255      		use_ed25519="yes"
1256	      ], [ if test "x$enable_ed25519" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support ED25519 and you used --enable-ed25519.])
1257	      	fi ], [AC_INCLUDES_DEFAULT
1258#include <openssl/evp.h>
1259	      ])
1260      fi
1261      if test $USE_NETTLE = "yes"; then
1262		AC_CHECK_HEADERS([nettle/eddsa.h], use_ed25519="yes",, [AC_INCLUDES_DEFAULT])
1263      fi
1264      if test $use_ed25519 = "yes"; then
1265      		AC_DEFINE_UNQUOTED([USE_ED25519], [1], [Define this to enable ED25519 support.])
1266      fi
1267      ;;
1268esac
1269
1270AC_ARG_ENABLE(ed448, AS_HELP_STRING([--disable-ed448],[Disable ED448 support]))
1271use_ed448="no"
1272case "$enable_ed448" in
1273    no)
1274      ;;
1275    *)
1276      if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
1277	      AC_CHECK_DECLS([NID_ED448], [
1278      		use_ed448="yes"
1279	      ], [ if test "x$enable_ed448" = "xyes"; then AC_MSG_ERROR([OpenSSL does not support ED448 and you used --enable-ed448.])
1280	      	fi ], [AC_INCLUDES_DEFAULT
1281#include <openssl/evp.h>
1282	      ])
1283      fi
1284      if test $use_ed448 = "yes"; then
1285      		AC_DEFINE_UNQUOTED([USE_ED448], [1], [Define this to enable ED448 support.])
1286      fi
1287      ;;
1288esac
1289
1290AC_ARG_ENABLE(event-api, AS_HELP_STRING([--enable-event-api],[Enable (experimental) pluggable event base libunbound API installed to unbound-event.h]))
1291case "$enable_event_api" in
1292    yes)
1293      AC_SUBST(UNBOUND_EVENT_INSTALL, [unbound-event-install])
1294      AC_SUBST(UNBOUND_EVENT_UNINSTALL, [unbound-event-uninstall])
1295      ;;
1296    *)
1297      ;;
1298esac
1299
1300AC_ARG_ENABLE(tfo-client, AS_HELP_STRING([--enable-tfo-client],[Enable TCP Fast Open for client mode]))
1301case "$enable_tfo_client" in
1302	yes)
1303		case "$host_os" in
1304			linux*) AC_CHECK_DECL([MSG_FASTOPEN], [AC_MSG_WARN([Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO])],
1305				[AC_MSG_ERROR([TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client])],
1306				[AC_INCLUDES_DEFAULT
1307#include <netinet/tcp.h>
1308])
1309				AC_DEFINE_UNQUOTED([USE_MSG_FASTOPEN], [1], [Define this to enable client TCP Fast Open.])
1310				;;
1311			darwin*) AC_CHECK_DECL([CONNECT_RESUME_ON_READ_WRITE], [AC_MSG_WARN([Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO])],
1312				[AC_MSG_ERROR([TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client])],
1313				[AC_INCLUDES_DEFAULT
1314#include <sys/socket.h>
1315])
1316				AC_DEFINE_UNQUOTED([USE_OSX_MSG_FASTOPEN], [1], [Define this to enable client TCP Fast Open.])
1317				;;
1318		esac
1319		;;
1320	no|*)
1321		;;
1322esac
1323
1324AC_ARG_ENABLE(tfo-server, AS_HELP_STRING([--enable-tfo-server],[Enable TCP Fast Open for server mode]))
1325case "$enable_tfo_server" in
1326	yes)
1327	      AC_CHECK_DECL([TCP_FASTOPEN], [AC_MSG_WARN([Check the platform specific TFO kernel parameters are correctly configured to support server mode TFO])], [AC_MSG_ERROR([TCP Fast Open is not available for server mode: please rerun without --enable-tfo-server])], [AC_INCLUDES_DEFAULT
1328#include <netinet/tcp.h>
1329	      ])
1330		AC_DEFINE_UNQUOTED([USE_TCP_FASTOPEN], [1], [Define this to enable server TCP Fast Open.])
1331		;;
1332	no|*)
1333		;;
1334esac
1335
1336# check for libevent
1337AC_ARG_WITH(libevent, AS_HELP_STRING([--with-libevent=pathname],[use libevent (will check /usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr  or you can specify an explicit path). Slower, but allows use of large outgoing port ranges.]),
1338    [ ],[ with_libevent="no" ])
1339if test "x_$with_libevent" != x_no; then
1340        AC_DEFINE([USE_LIBEVENT], [1], [Define if you enable libevent])
1341        AC_MSG_CHECKING(for libevent)
1342        if test "x_$with_libevent" = x_ -o "x_$with_libevent" = x_yes; then
1343            with_libevent="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
1344        fi
1345        for dir in $with_libevent; do
1346            thedir="$dir"
1347            if test -f "$dir/include/event.h" -o -f "$dir/include/event2/event.h"; then
1348                found_libevent="yes"
1349				dnl assume /usr is in default path.
1350				if test "$thedir" != "/usr"; then
1351				    CPPFLAGS="$CPPFLAGS -I$thedir/include"
1352				fi
1353				break;
1354		    fi
1355        done
1356        if test x_$found_libevent != x_yes; then
1357		if test -f "$dir/event.h" -a \( -f "$dir/libevent.la" -o -f "$dir/libev.la" \) ; then
1358			# libevent source directory
1359			AC_MSG_RESULT(found in $thedir)
1360			CPPFLAGS="$CPPFLAGS -I$thedir -I$thedir/include"
1361			BAK_LDFLAGS_SET="1"
1362			BAK_LDFLAGS="$LDFLAGS"
1363			# remove evdns from linking
1364			mkdir build >/dev/null 2>&1
1365			mkdir build/libevent >/dev/null 2>&1
1366			mkdir build/libevent/.libs >/dev/null 2>&1
1367			ev_files_o=`ls $thedir/*.o | grep -v evdns\.o | grep -v bufferevent_openssl\.o`
1368			ev_files_lo=`ls $thedir/*.lo | grep -v evdns\.lo | grep -v bufferevent_openssl\.lo`
1369			ev_files_libso=`ls $thedir/.libs/*.o | grep -v evdns\.o | grep -v bufferevent_openssl\.o`
1370			cp $ev_files_o build/libevent
1371			cp $ev_files_lo build/libevent
1372			cp $ev_files_libso build/libevent/.libs
1373			LATE_LDFLAGS="build/libevent/*.lo -lm"
1374			LDFLAGS="build/libevent/*.o $LDFLAGS -lm"
1375		else
1376            AC_MSG_ERROR([Cannot find the libevent library in $with_libevent
1377You can restart ./configure --with-libevent=no to use a builtin alternative.
1378Please note that this alternative is not as capable as libevent when using
1379large outgoing port ranges.  ])
1380		fi
1381        else
1382            AC_MSG_RESULT(found in $thedir)
1383	    dnl if event2 exists and no event lib in dir itself, use subdir
1384	    if test ! -f $thedir/lib/libevent.a -a ! -f $thedir/lib/libevent.so -a -d "$thedir/lib/event2"; then
1385		    LDFLAGS="$LDFLAGS -L$thedir/lib/event2"
1386		    ACX_RUNTIME_PATH_ADD([$thedir/lib/event2])
1387	    else
1388		    dnl assume /usr is in default path, do not add "".
1389		    if test "$thedir" != "/usr" -a "$thedir" != ""; then
1390			LDFLAGS="$LDFLAGS -L$thedir/lib"
1391			ACX_RUNTIME_PATH_ADD([$thedir/lib])
1392		    fi
1393	    fi
1394        fi
1395	# check for library used by libevent after 1.3c
1396	AC_SEARCH_LIBS([clock_gettime], [rt])
1397
1398	# is the event.h header libev or libevent?
1399	AC_CHECK_HEADERS([event.h],,, [AC_INCLUDES_DEFAULT])
1400	AC_CHECK_DECL(EV_VERSION_MAJOR, [
1401		AC_SEARCH_LIBS(event_set, [ev])
1402	],[
1403		AC_SEARCH_LIBS(event_set, [event])
1404	],[AC_INCLUDES_DEFAULT
1405#include <event.h>
1406	])
1407	AC_CHECK_FUNCS([event_base_free]) # only in libevent 1.2 and later
1408	AC_CHECK_FUNCS([event_base_once]) # only in libevent 1.4.1 and later
1409	AC_CHECK_FUNCS([event_base_new]) # only in libevent 1.4.1 and later
1410	AC_CHECK_FUNCS([event_base_get_method]) # only in libevent 1.4.3 and later
1411	AC_CHECK_FUNCS([ev_loop]) # only in libev. (tested on 3.51)
1412	AC_CHECK_FUNCS([ev_default_loop]) # only in libev. (tested on 4.00)
1413	AC_CHECK_FUNCS([event_assign]) # in libevent, for thread-safety
1414	AC_CHECK_DECLS([evsignal_assign], [], [], [AC_INCLUDES_DEFAULT
1415#ifdef HAVE_EVENT_H
1416#  include <event.h>
1417#else
1418#  include "event2/event.h"
1419#endif
1420	])
1421        PC_LIBEVENT_DEPENDENCY="libevent"
1422        AC_SUBST(PC_LIBEVENT_DEPENDENCY)
1423	if test -n "$BAK_LDFLAGS_SET"; then
1424		LDFLAGS="$BAK_LDFLAGS"
1425	fi
1426else
1427	AC_DEFINE(USE_MINI_EVENT, 1, [Define if you want to use internal select based events])
1428fi
1429
1430# check for libexpat
1431AC_ARG_WITH(libexpat, AS_HELP_STRING([--with-libexpat=path],[specify explicit path for libexpat.]),
1432    [ ],[ withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr" ])
1433AC_MSG_CHECKING(for libexpat)
1434found_libexpat="no"
1435for dir in $withval ; do
1436            if test -f "$dir/include/expat.h"; then
1437		found_libexpat="yes"
1438		dnl assume /usr is in default path.
1439		if test "$dir" != "/usr"; then
1440                    CPPFLAGS="$CPPFLAGS -I$dir/include"
1441		    LDFLAGS="$LDFLAGS -L$dir/lib"
1442		fi
1443            	AC_MSG_RESULT(found in $dir)
1444                break;
1445            fi
1446done
1447if test x_$found_libexpat != x_yes; then
1448	AC_MSG_ERROR([Could not find libexpat, expat.h])
1449fi
1450AC_CHECK_HEADERS([expat.h],,, [AC_INCLUDES_DEFAULT])
1451AC_CHECK_DECLS([XML_StopParser], [], [], [AC_INCLUDES_DEFAULT
1452#include <expat.h>
1453])
1454
1455# hiredis (redis C client for cachedb)
1456AC_ARG_WITH(libhiredis, AS_HELP_STRING([--with-libhiredis=path],[specify explicit path for libhiredis.]),
1457    [ ],[ withval="no" ])
1458found_libhiredis="no"
1459if test x_$withval = x_yes -o x_$withval != x_no; then
1460   AC_MSG_CHECKING(for libhiredis)
1461   if test x_$withval = x_ -o x_$withval = x_yes; then
1462            withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
1463   fi
1464   for dir in $withval ; do
1465            if test -f "$dir/include/hiredis/hiredis.h"; then
1466		found_libhiredis="yes"
1467		dnl assume /usr is in default path.
1468		if test "$dir" != "/usr"; then
1469                    CPPFLAGS="$CPPFLAGS -I$dir/include"
1470		    LDFLAGS="$LDFLAGS -L$dir/lib"
1471		fi
1472		AC_MSG_RESULT(found in $dir)
1473		AC_DEFINE([USE_REDIS], [1], [Define this to use hiredis client.])
1474		LIBS="$LIBS -lhiredis"
1475                break;
1476            fi
1477    done
1478    if test x_$found_libhiredis != x_yes; then
1479	AC_MSG_ERROR([Could not find libhiredis, hiredis.h])
1480    fi
1481    AC_CHECK_HEADERS([hiredis/hiredis.h],,, [AC_INCLUDES_DEFAULT])
1482    AC_CHECK_DECLS([redisConnect], [], [], [AC_INCLUDES_DEFAULT
1483    #include <hiredis/hiredis.h>
1484    ])
1485fi
1486
1487# nghttp2
1488AC_ARG_WITH(libnghttp2, AS_HELP_STRING([--with-libnghttp2=path],[specify explicit path for libnghttp2.]),
1489    [ ],[ withval="no" ])
1490found_libnghttp2="no"
1491if test x_$withval = x_yes -o x_$withval != x_no; then
1492   AC_MSG_CHECKING(for libnghttp2)
1493   if test x_$withval = x_ -o x_$withval = x_yes; then
1494            withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
1495   fi
1496   for dir in $withval ; do
1497            if test -f "$dir/include/nghttp2/nghttp2.h"; then
1498		found_libnghttp2="yes"
1499		dnl assume /usr is in default path.
1500		if test "$dir" != "/usr"; then
1501                    CPPFLAGS="$CPPFLAGS -I$dir/include"
1502		    LDFLAGS="$LDFLAGS -L$dir/lib"
1503		fi
1504		AC_MSG_RESULT(found in $dir)
1505		AC_DEFINE([HAVE_NGHTTP2], [1], [Define this to use nghttp2 client.])
1506		LIBS="$LIBS -lnghttp2"
1507                break;
1508            fi
1509    done
1510    if test x_$found_libnghttp2 != x_yes; then
1511	AC_MSG_ERROR([Could not find libnghttp2, nghttp2.h])
1512    fi
1513    AC_CHECK_HEADERS([nghttp2/nghttp2.h],,, [AC_INCLUDES_DEFAULT])
1514    AC_CHECK_DECLS([nghttp2_session_server_new], [], [], [AC_INCLUDES_DEFAULT
1515    #include <nghttp2/nghttp2.h>
1516    ])
1517fi
1518
1519# set static linking for uninstalled libraries if requested
1520AC_SUBST(staticexe)
1521staticexe=""
1522AC_ARG_ENABLE(static-exe, AS_HELP_STRING([--enable-static-exe],[ enable to compile executables statically against (event) uninstalled libs, for debug purposes ]),
1523	, )
1524if test x_$enable_static_exe = x_yes; then
1525	staticexe="-static"
1526	if test "$on_mingw" = yes; then
1527		staticexe="-all-static"
1528		# for static compile, include gdi32 and zlib here.
1529		if echo $LIBS | grep 'lgdi32' >/dev/null; then
1530			:
1531		else
1532			LIBS="$LIBS -lgdi32"
1533		fi
1534		AC_CHECK_LIB([z], [compress], [ LIBS="$LIBS -lz" ])
1535		LIBS="$LIBS -l:libssp.a"
1536	fi
1537fi
1538
1539# set full static linking if requested
1540AC_ARG_ENABLE(fully-static, AS_HELP_STRING([--enable-fully-static],[ enable to compile fully static ]),
1541	, )
1542if test x_$enable_fully_static = x_yes; then
1543	staticexe="-all-static"
1544	if test "$on_mingw" = yes; then
1545		# for static compile, include gdi32 and zlib here.
1546		if echo $LIBS | grep 'lgdi32' >/dev/null; then
1547			:
1548		else
1549			LIBS="$LIBS -lgdi32"
1550		fi
1551		AC_CHECK_LIB([z], [compress], [ LIBS="$LIBS -lz" ])
1552		LIBS="$LIBS -l:libssp.a"
1553	fi
1554fi
1555
1556# set lock checking if requested
1557AC_ARG_ENABLE(lock_checks, AS_HELP_STRING([--enable-lock-checks],[ enable to check lock and unlock calls, for debug purposes ]),
1558	, )
1559if test x_$enable_lock_checks = x_yes; then
1560	AC_DEFINE(ENABLE_LOCK_CHECKS, 1, [Define if you want to use debug lock checking (slow).])
1561	CHECKLOCK_OBJ="checklocks.lo"
1562	AC_SUBST(CHECKLOCK_OBJ)
1563fi
1564
1565ACX_CHECK_GETADDRINFO_WITH_INCLUDES
1566if test "$USE_WINSOCK" = 1; then
1567	AC_DEFINE(UB_ON_WINDOWS, 1, [Use win32 resources and API])
1568	AC_CHECK_HEADERS([iphlpapi.h],,, [AC_INCLUDES_DEFAULT
1569#include <windows.h>
1570	])
1571	AC_CHECK_TOOL(WINDRES, windres)
1572	LIBS="$LIBS -liphlpapi -lcrypt32"
1573	WINAPPS="unbound-service-install.exe unbound-service-remove.exe anchor-update.exe"
1574	AC_SUBST(WINAPPS)
1575	WIN_DAEMON_SRC="winrc/win_svc.c winrc/w_inst.c"
1576	AC_SUBST(WIN_DAEMON_SRC)
1577	WIN_DAEMON_OBJ="win_svc.lo w_inst.lo"
1578	AC_SUBST(WIN_DAEMON_OBJ)
1579	WIN_DAEMON_OBJ_LINK="rsrc_unbound.o"
1580	AC_SUBST(WIN_DAEMON_OBJ_LINK)
1581	WIN_HOST_OBJ_LINK="rsrc_unbound_host.o"
1582	AC_SUBST(WIN_HOST_OBJ_LINK)
1583	WIN_UBANCHOR_OBJ_LINK="rsrc_unbound_anchor.o log.lo locks.lo"
1584	AC_SUBST(WIN_UBANCHOR_OBJ_LINK)
1585	WIN_CONTROL_OBJ_LINK="rsrc_unbound_control.o"
1586	AC_SUBST(WIN_CONTROL_OBJ_LINK)
1587	WIN_CHECKCONF_OBJ_LINK="rsrc_unbound_checkconf.o"
1588	AC_SUBST(WIN_CHECKCONF_OBJ_LINK)
1589	AC_DEFINE(__USE_MINGW_ANSI_STDIO, 1, [defined to use gcc ansi snprintf and sscanf that understands %lld when compiled for windows.])
1590fi
1591if test $ac_cv_func_getaddrinfo = no; then
1592	AC_LIBOBJ([fake-rfc2553])
1593fi
1594# check after getaddrinfo for its libraries
1595ACX_FUNC_IOCTLSOCKET
1596
1597# see if daemon(3) exists, and if it is deprecated.
1598AC_CHECK_FUNCS([daemon])
1599if test $ac_cv_func_daemon = yes; then
1600	ACX_FUNC_DEPRECATED([daemon], [(void)daemon(0, 0);], [
1601#include <stdlib.h>
1602#include <unistd.h>
1603])
1604fi
1605
1606AC_CHECK_MEMBERS([struct sockaddr_un.sun_len],,,[
1607AC_INCLUDES_DEFAULT
1608#ifdef HAVE_SYS_UN_H
1609#include <sys/un.h>
1610#endif
1611])
1612AC_CHECK_MEMBERS([struct in_pktinfo.ipi_spec_dst],,,[
1613AC_INCLUDES_DEFAULT
1614#if HAVE_SYS_PARAM_H
1615#include <sys/param.h>
1616#endif
1617
1618#ifdef HAVE_SYS_SOCKET_H
1619#include <sys/socket.h>
1620#endif
1621
1622#ifdef HAVE_SYS_UIO_H
1623#include <sys/uio.h>
1624#endif
1625
1626#ifdef HAVE_NETINET_IN_H
1627#include <netinet/in.h>
1628#endif
1629
1630#ifdef HAVE_NETINET_TCP_H
1631#include <netinet/tcp.h>
1632#endif
1633
1634#ifdef HAVE_ARPA_INET_H
1635#include <arpa/inet.h>
1636#endif
1637
1638#ifdef HAVE_WINSOCK2_H
1639#include <winsock2.h>
1640#endif
1641
1642#ifdef HAVE_WS2TCPIP_H
1643#include <ws2tcpip.h>
1644#endif
1645])
1646
1647AC_MSG_CHECKING([for htobe64])
1648AC_LINK_IFELSE([AC_LANG_PROGRAM([
1649#include <stdio.h>
1650#ifdef HAVE_ENDIAN_H
1651#  include <endian.h>
1652#endif
1653#ifdef HAVE_SYS_ENDIAN_H
1654#  include <sys/endian.h>
1655#endif
1656], [unsigned long long x = htobe64(0); printf("%u", (unsigned)x);])],
1657  AC_MSG_RESULT(yes)
1658  AC_DEFINE(HAVE_HTOBE64, 1, [If we have htobe64]),
1659  AC_MSG_RESULT(no))
1660
1661AC_MSG_CHECKING([for be64toh])
1662AC_LINK_IFELSE([AC_LANG_PROGRAM([
1663#include <stdio.h>
1664#ifdef HAVE_ENDIAN_H
1665#  include <endian.h>
1666#endif
1667#ifdef HAVE_SYS_ENDIAN_H
1668#  include <sys/endian.h>
1669#endif
1670], [unsigned long long x = be64toh(0); printf("%u", (unsigned)x);])],
1671  AC_MSG_RESULT(yes)
1672  AC_DEFINE(HAVE_BE64TOH, 1, [If we have be64toh]),
1673  AC_MSG_RESULT(no))
1674
1675AC_SEARCH_LIBS([setusercontext], [util])
1676AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync shmget accept4 getifaddrs if_nametoindex poll gettid])
1677AC_CHECK_FUNCS([setresuid],,[AC_CHECK_FUNCS([setreuid])])
1678AC_CHECK_FUNCS([setresgid],,[AC_CHECK_FUNCS([setregid])])
1679
1680# check if setreuid en setregid fail, on MacOSX10.4(darwin8).
1681if echo $host_os | grep darwin8 > /dev/null; then
1682	AC_DEFINE(DARWIN_BROKEN_SETREUID, 1, [Define this if on macOSX10.4-darwin8 and setreuid and setregid do not work])
1683fi
1684AC_CHECK_DECLS([inet_pton,inet_ntop], [], [], [
1685AC_INCLUDES_DEFAULT
1686#ifdef HAVE_NETINET_IN_H
1687#include <netinet/in.h>
1688#endif
1689
1690#ifdef HAVE_NETINET_TCP_H
1691#include <netinet/tcp.h>
1692#endif
1693
1694#ifdef HAVE_ARPA_INET_H
1695#include <arpa/inet.h>
1696#endif
1697
1698#ifdef HAVE_WINSOCK2_H
1699#include <winsock2.h>
1700#endif
1701
1702#ifdef HAVE_WS2TCPIP_H
1703#include <ws2tcpip.h>
1704#endif
1705])
1706AC_REPLACE_FUNCS(inet_aton)
1707AC_REPLACE_FUNCS(inet_pton)
1708AC_REPLACE_FUNCS(inet_ntop)
1709AC_REPLACE_FUNCS(snprintf)
1710# test if snprintf return the proper length
1711if test "x$ac_cv_func_snprintf" = xyes; then
1712    if test c${cross_compiling} = cno; then
1713	AC_MSG_CHECKING([for correct snprintf return value])
1714	AC_RUN_IFELSE([AC_LANG_SOURCE(AC_INCLUDES_DEFAULT
1715[[
1716int main(void) { return !(snprintf(NULL, 0, "test") == 4); }
1717]])], [AC_MSG_RESULT(yes)], [
1718		AC_MSG_RESULT(no)
1719		AC_DEFINE([SNPRINTF_RET_BROKEN], [], [define if (v)snprintf does not return length needed, (but length used)])
1720		AC_LIBOBJ(snprintf)
1721	  ], [AC_MSG_RESULT(maybe)])
1722    fi
1723fi
1724AC_REPLACE_FUNCS(strlcat)
1725AC_REPLACE_FUNCS(strlcpy)
1726AC_REPLACE_FUNCS(memmove)
1727AC_REPLACE_FUNCS(gmtime_r)
1728AC_REPLACE_FUNCS(isblank)
1729AC_REPLACE_FUNCS(explicit_bzero)
1730dnl without CTIME, ARC4-functions and without reallocarray.
1731LIBOBJ_WITHOUT_CTIMEARC4="$LIBOBJS"
1732AC_SUBST(LIBOBJ_WITHOUT_CTIMEARC4)
1733AC_MSG_CHECKING([for reallocarray])
1734AC_LINK_IFELSE([AC_LANG_SOURCE(AC_INCLUDES_DEFAULT
1735[[
1736#ifndef _OPENBSD_SOURCE
1737#define _OPENBSD_SOURCE 1
1738#endif
1739#include <stdlib.h>
1740int main(void) {
1741	void* p = reallocarray(NULL, 10, 100);
1742	free(p);
1743	return 0;
1744}
1745]])], [AC_MSG_RESULT(yes)
1746	AC_DEFINE(HAVE_REALLOCARRAY, 1, [If we have reallocarray(3)])
1747], [
1748	AC_MSG_RESULT(no)
1749	AC_LIBOBJ(reallocarray)
1750])
1751AC_CHECK_DECLS([reallocarray])
1752if test "$USE_NSS" = "no"; then
1753	AC_REPLACE_FUNCS(arc4random)
1754	AC_REPLACE_FUNCS(arc4random_uniform)
1755	if test "$ac_cv_func_arc4random" = "no"; then
1756		AC_LIBOBJ(arc4_lock)
1757		AC_CHECK_FUNCS([getentropy],,[
1758		    if test "$USE_WINSOCK" = 1; then
1759			AC_LIBOBJ(getentropy_win)
1760		    else
1761			case "$host" in
1762			Darwin|*darwin*)
1763				AC_LIBOBJ(getentropy_osx)
1764			;;
1765			*solaris*|*sunos*|SunOS)
1766				AC_LIBOBJ(getentropy_solaris)
1767				AC_CHECK_HEADERS([sys/sha2.h],, [
1768					AC_CHECK_FUNCS([SHA512_Update],,[
1769						AC_LIBOBJ(sha512)
1770					])
1771				], [AC_INCLUDES_DEFAULT])
1772				if test "$ac_cv_header_sys_sha2_h" = "yes"; then
1773					# this lib needed for sha2 on solaris
1774					LIBS="$LIBS -lmd"
1775				fi
1776				AC_SEARCH_LIBS([clock_gettime], [rt])
1777			;;
1778			*freebsd*|*FreeBSD)
1779				AC_LIBOBJ(getentropy_freebsd)
1780			;;
1781			*linux*|Linux|*)
1782				AC_LIBOBJ(getentropy_linux)
1783				AC_CHECK_FUNCS([SHA512_Update],,[
1784					AC_DEFINE([COMPAT_SHA512], [1], [Do sha512 definitions in config.h])
1785					AC_LIBOBJ(sha512)
1786				])
1787				AC_CHECK_HEADERS([sys/sysctl.h],,, [AC_INCLUDES_DEFAULT])
1788				AC_CHECK_FUNCS([getauxval])
1789				AC_SEARCH_LIBS([clock_gettime], [rt])
1790			;;
1791			esac
1792		    fi
1793		])
1794	fi
1795fi
1796LIBOBJ_WITHOUT_CTIME="$LIBOBJS"
1797AC_SUBST(LIBOBJ_WITHOUT_CTIME)
1798AC_REPLACE_FUNCS(ctime_r)
1799AC_REPLACE_FUNCS(strsep)
1800
1801AC_ARG_ENABLE(allsymbols, AS_HELP_STRING([--enable-allsymbols],[export all symbols from libunbound and link binaries to it, smaller install size but libunbound export table is polluted by internal symbols]))
1802case "$enable_allsymbols" in
1803	yes)
1804	COMMON_OBJ_ALL_SYMBOLS=""
1805	UBSYMS=""
1806	EXTRALINK="libunbound.la"
1807	AC_DEFINE(EXPORT_ALL_SYMBOLS, 1, [Define this if you enabled-allsymbols from libunbound to link binaries to it for smaller install size, but the libunbound export table is polluted by internal symbols])
1808	;;
1809	no|*)
1810	COMMON_OBJ_ALL_SYMBOLS='$(COMMON_OBJ)'
1811	UBSYMS='-export-symbols $(srcdir)/libunbound/ubsyms.def'
1812	EXTRALINK=""
1813	;;
1814esac
1815AC_SUBST(COMMON_OBJ_ALL_SYMBOLS)
1816AC_SUBST(EXTRALINK)
1817AC_SUBST(UBSYMS)
1818if test x_$enable_lock_checks = x_yes; then
1819	UBSYMS="-export-symbols clubsyms.def"
1820	cp ${srcdir}/libunbound/ubsyms.def clubsyms.def
1821	echo lock_protect >> clubsyms.def
1822	echo lock_unprotect >> clubsyms.def
1823	echo lock_get_mem >> clubsyms.def
1824	echo checklock_start >> clubsyms.def
1825	echo checklock_stop >> clubsyms.def
1826	echo checklock_lock >> clubsyms.def
1827	echo checklock_unlock >> clubsyms.def
1828	echo checklock_init >> clubsyms.def
1829	echo checklock_thrcreate >> clubsyms.def
1830	echo checklock_thrjoin >> clubsyms.def
1831fi
1832
1833# check for dnstap if requested
1834dt_DNSTAP([$UNBOUND_RUN_DIR/dnstap.sock],
1835    [
1836        AC_DEFINE([USE_DNSTAP], [1], [Define to 1 to enable dnstap support])
1837        AC_SUBST([ENABLE_DNSTAP], [1])
1838
1839        AC_SUBST([opt_dnstap_socket_path])
1840        ACX_ESCAPE_BACKSLASH($opt_dnstap_socket_path, hdr_dnstap_socket_path)
1841        AC_DEFINE_UNQUOTED(DNSTAP_SOCKET_PATH,
1842            ["$hdr_dnstap_socket_path"], [default dnstap socket path])
1843	AC_SUBST(DNSTAP_SOCKET_PATH,["$hdr_dnstap_socket_path"])
1844	AC_SUBST(DNSTAP_SOCKET_TESTBIN,['unbound-dnstap-socket$(EXEEXT)'])
1845        AC_SUBST([DNSTAP_SRC], ["dnstap/dnstap.c dnstap/dnstap.pb-c.c dnstap/dnstap_fstrm.c dnstap/dtstream.c"])
1846        AC_SUBST([DNSTAP_OBJ], ["dnstap.lo dnstap.pb-c.lo dnstap_fstrm.lo dtstream.lo"])
1847    ],
1848    [
1849        AC_SUBST([ENABLE_DNSTAP], [0])
1850    ]
1851)
1852
1853# check for dnscrypt if requested
1854dnsc_DNSCRYPT([
1855        AC_DEFINE([USE_DNSCRYPT], [1], [Define to 1 to enable dnscrypt support])
1856        AC_SUBST([ENABLE_DNSCRYPT], [1])
1857
1858        AC_SUBST([DNSCRYPT_SRC], ["dnscrypt/dnscrypt.c"])
1859        AC_SUBST([DNSCRYPT_OBJ], ["dnscrypt.lo"])
1860    ],
1861    [
1862        AC_SUBST([ENABLE_DNSCRYPT], [0])
1863    ]
1864)
1865
1866# check for cachedb if requested
1867AC_ARG_ENABLE(cachedb, AS_HELP_STRING([--enable-cachedb],[enable cachedb module that can use external cache storage]))
1868# turn on cachedb when hiredis support is enabled.
1869if test "$found_libhiredis" = "yes"; then enable_cachedb="yes"; fi
1870case "$enable_cachedb" in
1871    yes)
1872    	AC_DEFINE([USE_CACHEDB], [1], [Define to 1 to use cachedb support])
1873	AC_SUBST([CACHEDB_SRC], ["cachedb/cachedb.c cachedb/redis.c"])
1874	AC_SUBST([CACHEDB_OBJ], ["cachedb.lo redis.lo"])
1875    	;;
1876    no|*)
1877    	# nothing
1878    	;;
1879esac
1880
1881# check for ipsecmod if requested
1882AC_ARG_ENABLE(ipsecmod, AS_HELP_STRING([--enable-ipsecmod],[Enable ipsecmod module that facilitates opportunistic IPsec]))
1883case "$enable_ipsecmod" in
1884	yes)
1885		AC_DEFINE([USE_IPSECMOD], [1], [Define to 1 to use ipsecmod support.])
1886		IPSECMOD_OBJ="ipsecmod.lo ipsecmod-whitelist.lo"
1887		AC_SUBST(IPSECMOD_OBJ)
1888		IPSECMOD_HEADER='$(srcdir)/ipsecmod/ipsecmod.h $(srcdir)/ipsecmod/ipsecmod-whitelist.h'
1889		AC_SUBST(IPSECMOD_HEADER)
1890		;;
1891	no|*)
1892		# nothing
1893		;;
1894esac
1895
1896# check for ipset if requested
1897AC_ARG_ENABLE(ipset, AS_HELP_STRING([--enable-ipset],[enable ipset module]))
1898case "$enable_ipset" in
1899    yes)
1900		AC_DEFINE([USE_IPSET], [1], [Define to 1 to use ipset support])
1901		IPSET_SRC="ipset/ipset.c"
1902		AC_SUBST(IPSET_SRC)
1903		IPSET_OBJ="ipset.lo"
1904		AC_SUBST(IPSET_OBJ)
1905
1906		# mnl
1907		AC_ARG_WITH(libmnl, AS_HELP_STRING([--with-libmnl=path],[specify explicit path for libmnl.]),
1908			[ ],[ withval="yes" ])
1909		found_libmnl="no"
1910		AC_MSG_CHECKING(for libmnl)
1911		if test x_$withval = x_ -o x_$withval = x_yes; then
1912			withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
1913		fi
1914		for dir in $withval ; do
1915			if test -f "$dir/include/libmnl/libmnl.h" -o -f "$dir/include/libmnl/libmnl/libmnl.h"; then
1916				found_libmnl="yes"
1917				dnl assume /usr is in default path.
1918				extralibmnl=""
1919				if test -f "$dir/include/libmnl/libmnl/libmnl.h"; then
1920					extralibmnl="/libmnl"
1921				fi
1922				if test "$dir" != "/usr" -o -n "$extralibmnl"; then
1923					CPPFLAGS="$CPPFLAGS -I$dir/include$extralibmnl"
1924				fi
1925				if test "$dir" != "/usr"; then
1926					LDFLAGS="$LDFLAGS -L$dir/lib"
1927				fi
1928				AC_MSG_RESULT(found in $dir)
1929				LIBS="$LIBS -lmnl"
1930				break;
1931			fi
1932		done
1933		if test x_$found_libmnl != x_yes; then
1934			AC_MSG_ERROR([Could not find libmnl, libmnl.h])
1935		fi
1936		;;
1937    no|*)
1938    	# nothing
1939		;;
1940esac
1941AC_ARG_ENABLE(explicit-port-randomisation, AS_HELP_STRING([--disable-explicit-port-randomisation],[disable explicit source port randomisation and rely on the kernel to provide random source ports]))
1942case "$enable_explicit_port_randomisation" in
1943	no)
1944		AC_DEFINE([DISABLE_EXPLICIT_PORT_RANDOMISATION], [1], [Define this to enable kernel based UDP source port randomization.])
1945		;;
1946	yes|*)
1947		;;
1948esac
1949
1950if echo "$host" | $GREP -i -e linux >/dev/null; then
1951	AC_ARG_ENABLE(linux-ip-local-port-range, AS_HELP_STRING([--enable-linux-ip-local-port-range], [Define this to enable use of /proc/sys/net/ipv4/ip_local_port_range as a default outgoing port range. This is only for the libunbound on Linux and does not affect unbound resolving daemon itself. This may severely limit the number of available outgoing ports and thus decrease randomness. Define this only when the target system restricts (e.g. some of SELinux enabled distributions) the use of non-ephemeral ports.]))
1952	case "$enable_linux_ip_local_port_range" in
1953		yes)
1954			AC_DEFINE([USE_LINUX_IP_LOCAL_PORT_RANGE], [1], [Define this to enable use of /proc/sys/net/ipv4/ip_local_port_range as a default outgoing port range. This is only for the libunbound on Linux and does not affect unbound resolving daemon itself. This may severely limit the number of available outgoing ports and thus decrease randomness. Define this only when the target system restricts (e.g. some of SELinux enabled distributions) the use of non-ephemeral ports.])
1955			;;
1956		no|*)
1957			;;
1958	esac
1959fi
1960
1961
1962AC_MSG_CHECKING([if ${MAKE:-make} supports $< with implicit rule in scope])
1963# on openBSD, the implicit rule make $< work.
1964# on Solaris, it does not work ($? is changed sources, $^ lists dependencies).
1965# gmake works.
1966cat >conftest.make <<EOF
1967all:	conftest.lo
1968
1969conftest.lo foo.lo bla.lo:
1970	if test -f "\$<"; then touch \$@; fi
1971
1972.SUFFIXES: .lo
1973.c.lo:
1974	if test -f "\$<"; then touch \$@; fi
1975
1976conftest.lo:        conftest.dir/conftest.c
1977EOF
1978mkdir conftest.dir
1979touch conftest.dir/conftest.c
1980rm -f conftest.lo conftest.c
1981${MAKE:-make} -f conftest.make >/dev/null
1982rm -f conftest.make conftest.c conftest.dir/conftest.c
1983rm -rf conftest.dir
1984if test ! -f conftest.lo; then
1985	AC_MSG_RESULT(no)
1986	SOURCEDETERMINE='echo "$^" | awk "-F " "{print \$$1;}" > .source'
1987	SOURCEFILE='`cat .source`'
1988else
1989	AC_MSG_RESULT(yes)
1990	SOURCEDETERMINE=':'
1991	SOURCEFILE='$<'
1992fi
1993rm -f conftest.lo
1994AC_SUBST(SOURCEDETERMINE)
1995AC_SUBST(SOURCEFILE)
1996
1997# see if we want to build the library or everything
1998ALLTARGET="alltargets"
1999INSTALLTARGET="install-all"
2000AC_ARG_WITH(libunbound-only, AS_HELP_STRING([--with-libunbound-only],[do not build daemon and tool programs]),
2001	[
2002	if test "$withval" = "yes"; then
2003		ALLTARGET="lib"
2004		INSTALLTARGET="install-lib"
2005	fi
2006])
2007if test $ALLTARGET = "alltargets"; then
2008	if test $USE_NSS = "yes"; then
2009		AC_MSG_ERROR([--with-nss can only be used in combination with --with-libunbound-only.])
2010	fi
2011	if test $USE_NETTLE = "yes"; then
2012		AC_MSG_ERROR([--with-nettle can only be used in combination with --with-libunbound-only.])
2013	fi
2014fi
2015
2016AC_SUBST(ALLTARGET)
2017AC_SUBST(INSTALLTARGET)
2018
2019ACX_STRIP_EXT_FLAGS
2020if test -n "$LATE_LDFLAGS"; then
2021  LDFLAGS="$LATE_LDFLAGS $LDFLAGS"
2022fi
2023# remove start spaces
2024LDFLAGS=`echo "$LDFLAGS"|sed -e 's/^ *//'`
2025LIBS=`echo "$LIBS"|sed -e 's/^ *//'`
2026
2027AC_DEFINE_UNQUOTED([MAXSYSLOGMSGLEN], [10240], [Define to the maximum message length to pass to syslog.])
2028
2029AH_BOTTOM(
2030dnl this must be first AH_CONFIG, to define the flags before any includes.
2031AHX_CONFIG_EXT_FLAGS
2032
2033dnl includes
2034[
2035#ifndef _OPENBSD_SOURCE
2036#define _OPENBSD_SOURCE 1
2037#endif
2038
2039#ifndef UNBOUND_DEBUG
2040# ifndef NDEBUG
2041#  define NDEBUG
2042# endif
2043#endif
2044
2045/** Use small-ldns codebase */
2046#define USE_SLDNS 1
2047#ifdef HAVE_SSL
2048#  define LDNS_BUILD_CONFIG_HAVE_SSL 1
2049#endif
2050
2051#include <stdio.h>
2052#include <string.h>
2053#include <unistd.h>
2054#include <assert.h>
2055
2056#if STDC_HEADERS
2057#include <stdlib.h>
2058#include <stddef.h>
2059#endif
2060
2061#ifdef HAVE_STDARG_H
2062#include <stdarg.h>
2063#endif
2064
2065#ifdef HAVE_STDINT_H
2066#include <stdint.h>
2067#endif
2068
2069#include <errno.h>
2070
2071#if HAVE_SYS_PARAM_H
2072#include <sys/param.h>
2073#endif
2074
2075#ifdef HAVE_SYS_SOCKET_H
2076#include <sys/socket.h>
2077#endif
2078
2079#ifdef HAVE_SYS_UIO_H
2080#include <sys/uio.h>
2081#endif
2082
2083#ifdef HAVE_NETINET_IN_H
2084#include <netinet/in.h>
2085#endif
2086
2087#ifdef HAVE_NETINET_TCP_H
2088#include <netinet/tcp.h>
2089#endif
2090
2091#ifdef HAVE_ARPA_INET_H
2092#include <arpa/inet.h>
2093#endif
2094
2095#ifdef HAVE_WINSOCK2_H
2096#include <winsock2.h>
2097#endif
2098
2099#ifdef HAVE_WS2TCPIP_H
2100#include <ws2tcpip.h>
2101#endif
2102
2103#if !defined(USE_WINSOCK) || !defined(HAVE_SNPRINTF) || defined(SNPRINTF_RET_BROKEN) || defined(__USE_MINGW_ANSI_STDIO)
2104#define ARG_LL "%ll"
2105#else
2106#define ARG_LL "%I64"
2107#endif
2108
2109#ifndef AF_LOCAL
2110#define AF_LOCAL AF_UNIX
2111#endif
2112]
2113
2114AHX_CONFIG_FORMAT_ATTRIBUTE
2115AHX_CONFIG_UNUSED_ATTRIBUTE
2116AHX_CONFIG_FSEEKO
2117AHX_CONFIG_MAXHOSTNAMELEN
2118#if !defined(HAVE_SNPRINTF) || defined(SNPRINTF_RET_BROKEN)
2119#define snprintf snprintf_unbound
2120#define vsnprintf vsnprintf_unbound
2121#include <stdarg.h>
2122int snprintf (char *str, size_t count, const char *fmt, ...);
2123int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);
2124#endif /* HAVE_SNPRINTF or SNPRINTF_RET_BROKEN */
2125AHX_CONFIG_INET_PTON(unbound)
2126AHX_CONFIG_INET_NTOP(unbound)
2127AHX_CONFIG_INET_ATON(unbound)
2128AHX_CONFIG_MEMMOVE(unbound)
2129AHX_CONFIG_STRLCAT(unbound)
2130AHX_CONFIG_STRLCPY(unbound)
2131AHX_CONFIG_GMTIME_R(unbound)
2132AHX_CONFIG_REALLOCARRAY(unbound)
2133AHX_CONFIG_W32_SLEEP
2134AHX_CONFIG_W32_USLEEP
2135AHX_CONFIG_W32_RANDOM
2136AHX_CONFIG_W32_SRANDOM
2137AHX_CONFIG_W32_FD_SET_T
2138AHX_CONFIG_IPV6_MIN_MTU
2139AHX_MEMCMP_BROKEN(unbound)
2140
2141[
2142#ifndef HAVE_CTIME_R
2143#define ctime_r unbound_ctime_r
2144char *ctime_r(const time_t *timep, char *buf);
2145#endif
2146
2147#ifndef HAVE_STRSEP
2148#define strsep unbound_strsep
2149char *strsep(char **stringp, const char *delim);
2150#endif
2151
2152#ifndef HAVE_ISBLANK
2153#define isblank unbound_isblank
2154int isblank(int c);
2155#endif
2156
2157#ifndef HAVE_EXPLICIT_BZERO
2158#define explicit_bzero unbound_explicit_bzero
2159void explicit_bzero(void* buf, size_t len);
2160#endif
2161
2162#if defined(HAVE_INET_NTOP) && !HAVE_DECL_INET_NTOP
2163const char *inet_ntop(int af, const void *src, char *dst, size_t size);
2164#endif
2165
2166#if defined(HAVE_INET_PTON) && !HAVE_DECL_INET_PTON
2167int inet_pton(int af, const char* src, void* dst);
2168#endif
2169
2170#if !defined(HAVE_STRPTIME) || !defined(STRPTIME_WORKS)
2171#define strptime unbound_strptime
2172struct tm;
2173char *strptime(const char *s, const char *format, struct tm *tm);
2174#endif
2175
2176#if !HAVE_DECL_REALLOCARRAY
2177void *reallocarray(void *ptr, size_t nmemb, size_t size);
2178#endif
2179
2180#ifdef HAVE_LIBBSD
2181#include <bsd/string.h>
2182#include <bsd/stdlib.h>
2183#endif
2184
2185#ifdef HAVE_LIBRESSL
2186#  if !HAVE_DECL_STRLCPY
2187size_t strlcpy(char *dst, const char *src, size_t siz);
2188#  endif
2189#  if !HAVE_DECL_STRLCAT
2190size_t strlcat(char *dst, const char *src, size_t siz);
2191#  endif
2192#  if !HAVE_DECL_ARC4RANDOM && defined(HAVE_ARC4RANDOM)
2193uint32_t arc4random(void);
2194#  endif
2195#  if !HAVE_DECL_ARC4RANDOM_UNIFORM && defined(HAVE_ARC4RANDOM_UNIFORM)
2196uint32_t arc4random_uniform(uint32_t upper_bound);
2197#  endif
2198#endif /* HAVE_LIBRESSL */
2199#ifndef HAVE_ARC4RANDOM
2200int getentropy(void* buf, size_t len);
2201uint32_t arc4random(void);
2202void arc4random_buf(void* buf, size_t n);
2203void _ARC4_LOCK(void);
2204void _ARC4_UNLOCK(void);
2205void _ARC4_LOCK_DESTROY(void);
2206#endif
2207#ifndef HAVE_ARC4RANDOM_UNIFORM
2208uint32_t arc4random_uniform(uint32_t upper_bound);
2209#endif
2210#ifdef COMPAT_SHA512
2211#ifndef SHA512_DIGEST_LENGTH
2212#define SHA512_BLOCK_LENGTH		128
2213#define SHA512_DIGEST_LENGTH		64
2214#define SHA512_DIGEST_STRING_LENGTH	(SHA512_DIGEST_LENGTH * 2 + 1)
2215typedef struct _SHA512_CTX {
2216	uint64_t	state[8];
2217	uint64_t	bitcount[2];
2218	uint8_t	buffer[SHA512_BLOCK_LENGTH];
2219} SHA512_CTX;
2220#endif /* SHA512_DIGEST_LENGTH */
2221void SHA512_Init(SHA512_CTX*);
2222void SHA512_Update(SHA512_CTX*, void*, size_t);
2223void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
2224unsigned char *SHA512(void* data, unsigned int data_len, unsigned char *digest);
2225#endif /* COMPAT_SHA512 */
2226
2227
2228
2229#if defined(HAVE_EVENT_H) && !defined(HAVE_EVENT_BASE_ONCE) && !(defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)) && (defined(HAVE_PTHREAD) || defined(HAVE_SOLARIS_THREADS))
2230   /* using version of libevent that is not threadsafe. */
2231#  define LIBEVENT_SIGNAL_PROBLEM 1
2232#endif
2233
2234#ifndef CHECKED_INET6
2235#  define CHECKED_INET6
2236#  ifdef AF_INET6
2237#    define INET6
2238#  else
2239#    define AF_INET6        28
2240#  endif
2241#endif /* CHECKED_INET6 */
2242
2243#ifndef HAVE_GETADDRINFO
2244struct sockaddr_storage;
2245#include "compat/fake-rfc2553.h"
2246#endif
2247
2248#ifdef UNBOUND_ALLOC_STATS
2249#  define malloc(s) unbound_stat_malloc_log(s, __FILE__, __LINE__, __func__)
2250#  define calloc(n,s) unbound_stat_calloc_log(n, s, __FILE__, __LINE__, __func__)
2251#  define free(p) unbound_stat_free_log(p, __FILE__, __LINE__, __func__)
2252#  define realloc(p,s) unbound_stat_realloc_log(p, s, __FILE__, __LINE__, __func__)
2253void *unbound_stat_malloc(size_t size);
2254void *unbound_stat_calloc(size_t nmemb, size_t size);
2255void unbound_stat_free(void *ptr);
2256void *unbound_stat_realloc(void *ptr, size_t size);
2257void *unbound_stat_malloc_log(size_t size, const char* file, int line,
2258	const char* func);
2259void *unbound_stat_calloc_log(size_t nmemb, size_t size, const char* file,
2260	int line, const char* func);
2261void unbound_stat_free_log(void *ptr, const char* file, int line,
2262	const char* func);
2263void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file,
2264	int line, const char* func);
2265#elif defined(UNBOUND_ALLOC_LITE)
2266#  include "util/alloc.h"
2267#endif /* UNBOUND_ALLOC_LITE and UNBOUND_ALLOC_STATS */
2268
2269/** default port for DNS traffic. */
2270#define UNBOUND_DNS_PORT 53
2271/** default port for DNS over TLS traffic. */
2272#define UNBOUND_DNS_OVER_TLS_PORT 853
2273/** default port for DNS over HTTPS traffic. */
2274#define UNBOUND_DNS_OVER_HTTPS_PORT 443
2275/** default port for unbound control traffic, registered port with IANA,
2276    ub-dns-control  8953/tcp    unbound dns nameserver control */
2277#define UNBOUND_CONTROL_PORT 8953
2278/** the version of unbound-control that this software implements */
2279#define UNBOUND_CONTROL_VERSION 1
2280
2281])
2282
2283dnl if we build from source tree, the man pages need @date@ and @version@
2284dnl if this is a distro tarball, that was already done by makedist.sh
2285AC_SUBST(version, [VERSION_MAJOR.VERSION_MINOR.VERSION_MICRO])
2286AC_SUBST(date, [`date +'%b %e, %Y'`])
2287
2288AC_CONFIG_FILES([Makefile doc/example.conf doc/libunbound.3 doc/unbound.8 doc/unbound-anchor.8 doc/unbound-checkconf.8 doc/unbound.conf.5 doc/unbound-control.8 doc/unbound-host.1 smallapp/unbound-control-setup.sh dnstap/dnstap_config.h dnscrypt/dnscrypt_config.h contrib/libunbound.pc contrib/unbound.socket contrib/unbound.service contrib/unbound_portable.service])
2289AC_CONFIG_HEADERS([config.h])
2290AC_OUTPUT
2291