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