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