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