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