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