1#                                               -*- Autoconf -*-
2# Process this file with autoconf to produce a configure script.
3
4AC_PREREQ([2.59])
5AC_INIT([hitch], [1.7.0], [opensource@varnish-software.com])
6AC_CONFIG_SRCDIR([src/configuration.c])
7AC_CONFIG_HEADERS([config.h])
8AC_CONFIG_AUX_DIR([build-aux])
9AC_CONFIG_MACRO_DIR([.])
10
11AC_USE_SYSTEM_EXTENSIONS
12
13AM_INIT_AUTOMAKE([
14	-Wall
15	-Werror
16	foreign
17	color-tests
18	parallel-tests
19	subdir-objects
20])
21AM_PROG_AR
22
23# Checks for programs.
24AM_PROG_CC_C_O
25AC_PROG_RANLIB
26AC_PROG_INSTALL
27AC_PROG_MAKE_SET
28
29AC_ARG_WITH([lex],
30	AS_HELP_STRING([--with-lex], [Build with lex]),
31	[], [with_lex=no])
32AC_ARG_WITH([yacc],
33	AS_HELP_STRING([--with-yacc], [Build with yacc]),
34	[], [with_yacc=no])
35AC_ARG_ENABLE([documentation],
36	AS_HELP_STRING([--enable-documentation], [Build the documentation]),
37	[], [enable_documentation=no])
38AC_ARG_ENABLE([warnings],
39	AS_HELP_STRING([--enable-warnings], [Enable warnings]),
40	[], [enable_warnings=no])
41
42if test "$with_lex" = yes
43then
44	AC_PROG_LEX
45	if test "$LEX" = :
46	then
47		AC_MSG_ERROR([flex or lex not found])
48
49	fi
50fi
51
52if test "$with_yacc" = yes
53then
54	AC_PROG_YACC
55	if test -z "$YACC" || ! $YACC -V >/dev/null 2>&1
56	then
57		AC_MSG_ERROR([bison, byacc or yacc not found])
58	fi
59fi
60
61AM_CONDITIONAL([ENABLE_DOCUMENTATION], [test "$enable_documentation" = yes])
62AM_CONDITIONAL([ENABLE_WARNINGS], [test "$enable_warnings" = yes])
63
64AM_COND_IF([ENABLE_DOCUMENTATION], [
65	AC_CHECK_PROGS(RST2MAN, [rst2man rst2man.py], [no])
66	if test "$RST2MAN" = no
67	then
68		AC_MSG_ERROR([rst2man is needed to build the documentation])
69	fi
70])
71
72AC_CHECK_PROGS(SOCKSTAT, [lsof sockstat fstat], [no])
73if test "x$SOCKSTAT" = xno; then
74	AC_MSG_WARN([No tool found for socket inspection, tests will fail.])
75fi
76
77AM_MAINTAINER_MODE([disable])
78
79# Checks for libraries.
80PKG_CHECK_EXISTS([libev], [
81	PKG_CHECK_MODULES([EV], [libev])], [
82	HITCH_SEARCH_LIBS([EV], [ev], [ev_default_loop],
83		[AC_MSG_ERROR([Cannot find libev.])])
84])
85
86PKG_CHECK_MODULES([SSL], [libssl])
87PKG_CHECK_MODULES([CRYPTO], [libcrypto])
88HITCH_SEARCH_LIBS([SOCKET], [socket], [socket])
89HITCH_SEARCH_LIBS([NSL], [nsl], [inet_ntop])
90HITCH_SEARCH_LIBS([RT], [rt], [clock_gettime])
91
92AC_CHECK_MEMBERS([struct stat.st_mtim, struct stat.st_mtimespec])
93
94AC_ARG_ENABLE(sessioncache,
95    AC_HELP_STRING([--enable-sessioncache],
96		   [Enable TLS session cache. (default is off)]),
97    [use_shctx="$enableval"],
98    [use_shctx=no])
99if test x"$use_shctx" != xno; then
100  if test ! -e 'src/ebtree/ebtree.h'; then
101    AC_MSG_ERROR([Must clone https://github.com/haproxy/ebtree to src/ebtree/])
102  fi
103  AC_DEFINE([USE_SHARED_CACHE], [1], [sessioncache is enabled])
104fi
105AM_CONDITIONAL(USE_SHCTX, test xno != x"$use_shctx")
106
107# Checks for header files.
108AC_CHECK_HEADERS([stdlib.h unistd.h])
109
110# Checks for typedefs, structures, and compiler characteristics.
111AC_TYPE_UID_T
112AC_C_INLINE
113AC_TYPE_INT32_T
114AC_TYPE_PID_T
115AC_TYPE_SIZE_T
116AC_TYPE_SSIZE_T
117AC_TYPE_UINT32_T
118
119# Checks for library functions.
120AC_FUNC_FORK
121AC_FUNC_MMAP
122AC_CHECK_FUNCS([accept4])
123
124AC_CACHE_CHECK([whether SO_REUSEPORT works],
125  [ac_cv_so_reuseport_works],
126  [AC_RUN_IFELSE(
127    [AC_LANG_PROGRAM([[
128#include <sys/types.h>
129#include <sys/socket.h>
130    ]], [[
131	int s = socket(AF_INET, SOCK_STREAM, 0);
132	int i = 5;
133	if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &i, sizeof i) < 0)
134	  return (1);
135	return (0);
136]])],
137  [ac_cv_so_reuseport_works=yes],
138  [ac_cv_so_reuseport_works=no])
139  ]
140)
141if test "$ac_cv_so_reuseport_works" = yes; then
142  AC_DEFINE([SO_REUSEPORT_WORKS], [1], [Define if SO_REUSEPORT works])
143fi
144
145AC_ARG_ENABLE(tcp-fastopen,
146	AC_HELP_STRING([--enable-tcp-fastopen],
147		[Enable TCP Fast Open. (default is auto)]),
148	[use_tfo="$enableval"],
149	[use_tfo=auto])
150
151if test x"$use_tfo" != xno; then
152	AC_CACHE_CHECK([whether TCP_FASTOPEN works],
153		[ac_cv_so_tfo],
154		[AC_RUN_IFELSE(
155			[AC_LANG_PROGRAM([[
156				#include <sys/types.h>
157				#include <sys/socket.h>
158				#include <netinet/tcp.h>
159			]], [[
160				int s = socket(AF_INET, SOCK_STREAM, 0);
161				int i = 5;
162				if (setsockopt(s, SOL_TCP, TCP_FASTOPEN, &i, sizeof i) < 0)
163				return (1);
164				return (0);
165			]])],
166		[ac_cv_so_tfo=yes],
167		[ac_cv_so_tfo=no])
168		]
169	)
170	if test "$ac_cv_so_tfo" != yes && test use_tfo = yes; then
171		AC_MSG_ERROR([Socket option TCP_FASTOPEN is not supported by the kernel])
172	fi
173	if test "$ac_cv_so_tfo" = yes; then
174		AC_DEFINE([TCP_FASTOPEN_WORKS], [1], [TCP Fast Open is enabled])
175	fi
176fi
177
178AC_CHECK_HEADERS([linux/futex.h])
179AM_CONDITIONAL([HAVE_LINUX_FUTEX], [test $ac_cv_header_linux_futex_h = yes])
180
181HITCH_CHECK_FUNC([SSL_get0_alpn_selected], [$SSL_LIBS], [
182	AC_DEFINE([OPENSSL_WITH_ALPN], [1], [OpenSSL supports ALPN])
183])
184
185HITCH_CHECK_FUNC([SSL_get0_next_proto_negotiated], [$SSL_LIBS], [
186	AC_DEFINE([OPENSSL_WITH_NPN], [1], [OpenSSL supports NPN])
187])
188
189HITCH_CHECK_FUNC([SSL_CTX_get_default_passwd_cb], [$SSL_LIBS], [
190	AC_DEFINE([HAVE_SSL_CTX_GET_DEFAULT_PASSWD_CB], [1],
191		[OpenSSL has SSL_CTX_get_default_passwd_cb()])
192])
193
194HITCH_CHECK_FUNC([SSL_CTX_get_default_passwd_cb_userdata], [$SSL_LIBS], [
195	AC_DEFINE([HAVE_SSL_CTX_GET_DEFAULT_PASSWD_CB_USERDATA], [1],
196		[OpenSSL has SSL_CTX_get_default_passwd_cb_userdata()])
197])
198
199HITCH_CHECK_FUNC([CRYPTO_get_locking_callback], [$CRYPTO_LIBS], [
200	AC_DEFINE([OPENSSL_WITH_LOCKS], [1], [OpenSSL needs explicit locking])
201])
202
203HITCH_CHECK_FUNC([X509_NAME_ENTRY_get_data], [$CRYPTO_LIBS], [
204	AC_DEFINE([HAVE_X509_NAME_ENTRY_GET_DATA], [1],
205		[OpenSSL has X509_NAME_ENTRY_get_data()])
206])
207
208HITCH_CHECK_FUNC([X509_STORE_get0_objects], [$CRYPTO_LIBS], [
209	AC_DEFINE([HAVE_X509_STORE_GET0_OBJECTS], [1],
210		[OpenSSL has X509_STORE_get0_objects()])
211])
212
213HITCH_CHECK_FUNC([X509_OBJECT_get0_X509], [$CRYPTO_LIBS], [
214	AC_DEFINE([HAVE_X509_OBJECT_GET0_X509], [1],
215		[OpenSSL has X509_OBJECT_get0_X509()])
216])
217
218AC_CHECK_MEMBERS([struct ssl_st.s3], [], [], [[#include <openssl/ssl.h>]])
219
220AS_VERSION_COMPARE([$($PKG_CONFIG --modversion openssl)], [1.1.1],
221	[openssl111=no],
222	[openssl111=yes], [openssl111=yes])
223
224AS_IF([test "x$openssl111" = xyes],
225	[AC_DEFINE([HAVE_TLS_1_3], [1], [Define to 1 if TLSv1.3 is available])], [])
226
227SH_TESTS="$(cd $srcdir/src && echo tests/test*.sh)"
228AC_SUBST(SH_TESTS)
229
230dnl Desired CFLAGS
231HITCH_CHECK_FLAGS([HITCH_CFLAGS], [
232	-g
233	-O2
234])
235
236AM_COND_IF([ENABLE_WARNINGS], [
237	dnl XXX: expand developer warnings?
238	HITCH_CHECK_FLAGS([HITCH_CFLAGS], [
239		-Wall
240		-W
241		-Werror
242	])
243])
244
245AC_SUBST([HITCH_CFLAGS])
246
247dnl Help libev macros
248HITCH_CHECK_FLAGS([EV_CFLAGS], [-fno-strict-aliasing])
249
250AC_CONFIG_FILES([
251	Makefile
252	src/Makefile
253	src/util/Makefile
254])
255
256AC_OUTPUT
257