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