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