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