xref: /lighttpd1.4/SConstruct (revision add03ac2)
1d102a711SStefan Bühlerfrom __future__ import print_function
2e95ea21bSJan Kneschkeimport os
3e95ea21bSJan Kneschkeimport re
4809199f9SmOoimport string
52eb7287aSStefan Bühlerimport sys
62eb7287aSStefan Bühlerfrom copy import copy
7809199f9SmOofrom stat import *
8e95ea21bSJan Kneschke
9d102a711SStefan Bühlertry:
10d102a711SStefan Bühler	string_types = basestring
11d102a711SStefan Bühlerexcept NameError:
12d102a711SStefan Bühler	string_types = str
13d102a711SStefan Bühler
14e95ea21bSJan Kneschkepackage = 'lighttpd'
15*add03ac2SGlenn Straussversion = '1.4.70'
16e95ea21bSJan Kneschke
1742704e31SStefan Bühlerunderscorify_reg = re.compile('[^A-Z0-9]')
1842704e31SStefan Bühlerdef underscorify(id):
1942704e31SStefan Bühler	return underscorify_reg.sub('_', id.upper())
2042704e31SStefan Bühler
2166e0cd16SStefan Bühlerdef fail(*args, **kwargs):
2266e0cd16SStefan Bühler	print(*args, file=sys.stderr, **kwargs)
23d102a711SStefan Bühler	sys.exit(-1)
2466e0cd16SStefan Bühler
2542704e31SStefan Bühlerclass Autoconf:
2642704e31SStefan Bühler	class RestoreEnvLibs:
2742704e31SStefan Bühler		def __init__(self, env):
2842704e31SStefan Bühler			self.env = env
2942704e31SStefan Bühler			self.active = False
3042704e31SStefan Bühler
3142704e31SStefan Bühler		def __enter__(self):
3242704e31SStefan Bühler			if self.active:
3342704e31SStefan Bühler				raise Exception('entered twice')
3442704e31SStefan Bühler			self.active = True
3542704e31SStefan Bühler			if 'LIBS' in self.env:
3642704e31SStefan Bühler				#print("Backup LIBS: " + repr(self.env['LIBS']))
3742704e31SStefan Bühler				self.empty = False
3842704e31SStefan Bühler				self.backup_libs = copy(self.env['LIBS'])
3942704e31SStefan Bühler			else:
4042704e31SStefan Bühler				#print("No LIBS to backup")
4142704e31SStefan Bühler				self.empty = True
4242704e31SStefan Bühler
4342704e31SStefan Bühler		def __exit__(self, type, value, traceback):
4442704e31SStefan Bühler			if not self.active:
4542704e31SStefan Bühler				raise Exception('exited twice')
4642704e31SStefan Bühler			self.active = False
4742704e31SStefan Bühler			if self.empty:
4842704e31SStefan Bühler				if 'LIBS' in self.env:
4942704e31SStefan Bühler					del self.env['LIBS']
5042704e31SStefan Bühler			else:
5142704e31SStefan Bühler				#print("Restoring LIBS, now: " + repr(self.env['LIBS']))
5242704e31SStefan Bühler				self.env['LIBS'] = self.backup_libs
5342704e31SStefan Bühler				#print("Restoring LIBS, to: " + repr(self.env['LIBS']))
5442704e31SStefan Bühler
5542704e31SStefan Bühler	def __init__(self, env):
5642704e31SStefan Bühler		self.conf = Configure(env, custom_tests = {
5742704e31SStefan Bühler			'CheckGmtOffInStructTm': Autoconf.__checkGmtOffInStructTm,
5842704e31SStefan Bühler			'CheckIPv6': Autoconf.__checkIPv6,
5942704e31SStefan Bühler			'CheckWeakSymbols': Autoconf.__checkWeakSymbols,
6042704e31SStefan Bühler		})
6142704e31SStefan Bühler
6242704e31SStefan Bühler	def append(self, *args, **kw):
6342704e31SStefan Bühler		return self.conf.env.Append(*args, **kw)
6442704e31SStefan Bühler
6542704e31SStefan Bühler	def Finish(self):
6642704e31SStefan Bühler		return self.conf.Finish()
6742704e31SStefan Bühler
6842704e31SStefan Bühler	@property
6942704e31SStefan Bühler	def env(self):
7042704e31SStefan Bühler		return self.conf.env
7142704e31SStefan Bühler
7242704e31SStefan Bühler	def restoreEnvLibs(self):
7342704e31SStefan Bühler		return Autoconf.RestoreEnvLibs(self.conf.env)
7442704e31SStefan Bühler
7542704e31SStefan Bühler	def CheckType(self, *args, **kw):
7642704e31SStefan Bühler		return self.conf.CheckType(*args, **kw)
7742704e31SStefan Bühler
7842704e31SStefan Bühler	def CheckLib(self, *args, **kw):
7942704e31SStefan Bühler		return self.conf.CheckLib(*args, autoadd = 0, **kw)
8042704e31SStefan Bühler
8142704e31SStefan Bühler	def CheckLibWithHeader(self, *args, **kw):
8242704e31SStefan Bühler		return self.conf.CheckLibWithHeader(*args, autoadd = 0, **kw)
8342704e31SStefan Bühler
8442704e31SStefan Bühler	def CheckGmtOffInStructTm(self):
8542704e31SStefan Bühler		return self.conf.CheckGmtOffInStructTm()
8642704e31SStefan Bühler
8742704e31SStefan Bühler	def CheckIPv6(self):
8842704e31SStefan Bühler		return self.conf.CheckIPv6()
8942704e31SStefan Bühler
9042704e31SStefan Bühler	def CheckWeakSymbols(self):
9142704e31SStefan Bühler		return self.conf.CheckWeakSymbols()
9242704e31SStefan Bühler
9342704e31SStefan Bühler	def CheckCHeader(self, hdr):
9442704e31SStefan Bühler		return self.conf.CheckCHeader(hdr)
9542704e31SStefan Bühler
9642704e31SStefan Bühler	def haveCHeader(self, hdr):
9742704e31SStefan Bühler		if self.CheckCHeader(hdr):
9842704e31SStefan Bühler			# if we have a list of headers define HAVE_ only for last one
9942704e31SStefan Bühler			target = hdr
100d102a711SStefan Bühler			if not isinstance(target, string_types):
10142704e31SStefan Bühler				target = target[-1]
10242704e31SStefan Bühler			self.conf.env.Append(CPPFLAGS = [ '-DHAVE_' + underscorify(target) ])
10342704e31SStefan Bühler			return True
10442704e31SStefan Bühler		return False
10542704e31SStefan Bühler
10642704e31SStefan Bühler	def haveCHeaders(self, hdrs):
107e95ea21bSJan Kneschke		for hdr in hdrs:
10842704e31SStefan Bühler			self.haveCHeader(hdr)
109e95ea21bSJan Kneschke
11042704e31SStefan Bühler	def CheckFunc(self, func, header = None, libs = []):
11142704e31SStefan Bühler		with self.restoreEnvLibs():
11242704e31SStefan Bühler			self.env.Append(LIBS = libs)
11342704e31SStefan Bühler			return self.conf.CheckFunc(func, header = header)
1143d0dcdf6SGlenn Strauss
11542704e31SStefan Bühler	def CheckFuncInLib(self, func, lib):
11642704e31SStefan Bühler		return self.CheckFunc(func, libs = [lib])
11742704e31SStefan Bühler
11842704e31SStefan Bühler	def haveFuncInLib(self, func, lib):
11942704e31SStefan Bühler		if self.CheckFuncInLib(func, lib):
12042704e31SStefan Bühler			self.conf.env.Append(CPPFLAGS = [ '-DHAVE_' + underscorify(func) ])
12142704e31SStefan Bühler			return True
12242704e31SStefan Bühler		return False
12342704e31SStefan Bühler
12442704e31SStefan Bühler	def haveFunc(self, func, header = None, libs = []):
12542704e31SStefan Bühler		if self.CheckFunc(func, header = header, libs = libs):
12642704e31SStefan Bühler			self.conf.env.Append(CPPFLAGS = [ '-DHAVE_' + underscorify(func) ])
12742704e31SStefan Bühler			return True
12842704e31SStefan Bühler		return False
12942704e31SStefan Bühler
13042704e31SStefan Bühler	def haveFuncs(self, funcs):
131e95ea21bSJan Kneschke		for func in funcs:
13242704e31SStefan Bühler			self.haveFunc(func)
133e95ea21bSJan Kneschke
13442704e31SStefan Bühler	def haveTypes(self, types):
135e95ea21bSJan Kneschke		for type in types:
13642704e31SStefan Bühler			if self.conf.CheckType(type, '#include <sys/types.h>'):
13742704e31SStefan Bühler				self.conf.env.Append(CPPFLAGS = [ '-DHAVE_' + underscorify(type) ])
138e95ea21bSJan Kneschke
1393ba68b25SStefan Bühler	def CheckParseConfig(self, *args, **kw):
1403ba68b25SStefan Bühler		try:
1413ba68b25SStefan Bühler			self.conf.env.ParseConfig(*args, **kw)
1423ba68b25SStefan Bühler			return True
14316560049SGlenn Strauss		except OSError:
14416560049SGlenn Strauss			return False
1453ba68b25SStefan Bühler		except Exception as e:
1463ba68b25SStefan Bühler			print(e.message, file=sys.stderr)
1473ba68b25SStefan Bühler			return False
1483ba68b25SStefan Bühler
1493ba68b25SStefan Bühler	def CheckParseConfigForLib(self, lib, *args, **kw):
1503ba68b25SStefan Bühler		with self.restoreEnvLibs():
1513ba68b25SStefan Bühler			self.env['LIBS'] = []
1523ba68b25SStefan Bühler			if not self.CheckParseConfig(*args, **kw):
1533ba68b25SStefan Bühler				return False
1543ba68b25SStefan Bühler			self.env.Append(**{lib: self.env['LIBS']})
1553ba68b25SStefan Bühler			return True
1563ba68b25SStefan Bühler
15742704e31SStefan Bühler	@staticmethod
15842704e31SStefan Bühler	def __checkGmtOffInStructTm(context):
159d7be04beSLoganaden Velvindron		source = """
160d7be04beSLoganaden Velvindron#include <time.h>
161d7be04beSLoganaden Velvindronint main() {
162d7be04beSLoganaden Velvindron	struct tm a;
163d7be04beSLoganaden Velvindron	a.tm_gmtoff = 0;
164d7be04beSLoganaden Velvindron	return 0;
165d7be04beSLoganaden Velvindron}
166d7be04beSLoganaden Velvindron"""
167d7be04beSLoganaden Velvindron		context.Message('Checking for tm_gmtoff in struct tm...')
168d7be04beSLoganaden Velvindron		result = context.TryLink(source, '.c')
169d7be04beSLoganaden Velvindron		context.Result(result)
170d7be04beSLoganaden Velvindron
171d7be04beSLoganaden Velvindron		return result
172d7be04beSLoganaden Velvindron
17342704e31SStefan Bühler	@staticmethod
17442704e31SStefan Bühler	def __checkIPv6(context):
175d7be04beSLoganaden Velvindron		source = """
176d7be04beSLoganaden Velvindron#include <sys/types.h>
177d7be04beSLoganaden Velvindron#include <sys/socket.h>
178d7be04beSLoganaden Velvindron#include <netinet/in.h>
179d7be04beSLoganaden Velvindron
180d7be04beSLoganaden Velvindronint main() {
181d7be04beSLoganaden Velvindron	struct sockaddr_in6 s; struct in6_addr t=in6addr_any; int i=AF_INET6; s; t.s6_addr[0] = 0;
182d7be04beSLoganaden Velvindron	return 0;
183d7be04beSLoganaden Velvindron}
184d7be04beSLoganaden Velvindron"""
185d7be04beSLoganaden Velvindron		context.Message('Checking for IPv6 support...')
186d7be04beSLoganaden Velvindron		result = context.TryLink(source, '.c')
187d7be04beSLoganaden Velvindron		context.Result(result)
188d7be04beSLoganaden Velvindron
189d7be04beSLoganaden Velvindron		return result
190d7be04beSLoganaden Velvindron
19142704e31SStefan Bühler	@staticmethod
19242704e31SStefan Bühler	def __checkWeakSymbols(context):
193d7be04beSLoganaden Velvindron		source = """
194d7be04beSLoganaden Velvindron__attribute__((weak)) void __dummy(void *x) { }
195d7be04beSLoganaden Velvindronint main() {
196d7be04beSLoganaden Velvindron	void *x;
197d7be04beSLoganaden Velvindron	__dummy(x);
198d7be04beSLoganaden Velvindron}
199d7be04beSLoganaden Velvindron"""
200d7be04beSLoganaden Velvindron		context.Message('Checking for weak symbol support...')
201d7be04beSLoganaden Velvindron		result = context.TryLink(source, '.c')
202d7be04beSLoganaden Velvindron		context.Result(result)
203d7be04beSLoganaden Velvindron
204d7be04beSLoganaden Velvindron		return result
205d7be04beSLoganaden Velvindron
20642704e31SStefan Bühler	def checkProgram(self, withname, progname):
207809199f9SmOo		withname = 'with_' + withname
208809199f9SmOo		binpath = None
209809199f9SmOo
21042704e31SStefan Bühler		if self.env[withname] != 1:
21142704e31SStefan Bühler			binpath = self.env[withname]
212809199f9SmOo		else:
21342704e31SStefan Bühler			prog = self.env.Detect(progname)
214809199f9SmOo			if prog:
21542704e31SStefan Bühler				binpath = self.env.WhereIs(prog)
216809199f9SmOo
217809199f9SmOo		if binpath:
218809199f9SmOo			mode = os.stat(binpath)[ST_MODE]
219809199f9SmOo			if S_ISDIR(mode):
22066e0cd16SStefan Bühler				fail("* error: path `%s' is a directory" % (binpath))
221809199f9SmOo			if not S_ISREG(mode):
22266e0cd16SStefan Bühler				fail("* error: path `%s' is not a file or not exists" % (binpath))
223809199f9SmOo
224809199f9SmOo		if not binpath:
22566e0cd16SStefan Bühler			fail("* error: can't find program `%s'" % (progname))
226809199f9SmOo
227809199f9SmOo		return binpath
228e95ea21bSJan Kneschke
22968284bd7SStefan BühlerVariantDir('sconsbuild/build', 'src', duplicate = 0)
23068284bd7SStefan BühlerVariantDir('sconsbuild/tests', 'tests', duplicate = 0)
231e95ea21bSJan Kneschke
23273ef60a5SStefan Bühlervars = Variables()
23368284bd7SStefan Bühlervars.AddVariables(
234e95ea21bSJan Kneschke	('prefix', 'prefix', '/usr/local'),
235e95ea21bSJan Kneschke	('bindir', 'binary directory', '${prefix}/bin'),
2365da35301SmOo	('sbindir', 'binary directory', '${prefix}/sbin'),
237e95ea21bSJan Kneschke	('libdir', 'library directory', '${prefix}/lib'),
23868284bd7SStefan Bühler	PathVariable('CC', 'path to the c-compiler', None),
23968284bd7SStefan Bühler	BoolVariable('build_dynamic', 'enable dynamic build', 'yes'),
24068284bd7SStefan Bühler	BoolVariable('build_static', 'enable static build', 'no'),
24168284bd7SStefan Bühler	BoolVariable('build_fullstatic', 'enable fullstatic build', 'no'),
242ccba074cSStefan Bühler
24368284bd7SStefan Bühler	BoolVariable('with_bzip2', 'enable bzip2 compression', 'no'),
2448d5e237cSGlenn Strauss	BoolVariable('with_brotli', 'enable brotli compression', 'no'),
245ccba074cSStefan Bühler	PackageVariable('with_dbi', 'enable dbi support', 'no'),
246ccba074cSStefan Bühler	BoolVariable('with_fam', 'enable FAM/gamin support', 'no'),
247d68fc639SGlenn Strauss	BoolVariable('with_libdeflate', 'enable libdeflate compression', 'no'),
2484ac239c4SGlenn Strauss	BoolVariable('with_maxminddb', 'enable MaxMind GeoIP2 support', 'no'),
249177f5509SGlenn Strauss	BoolVariable('with_krb5', 'enable krb5 auth support', 'no'),
250ccba074cSStefan Bühler	BoolVariable('with_ldap', 'enable ldap auth support', 'no'),
251ccba074cSStefan Bühler	# with_libev not supported
252ccba074cSStefan Bühler	# with_libunwind not supported
25386c2d309SGlenn Strauss	BoolVariable('with_lua', 'enable lua support', 'no'),
254ccba074cSStefan Bühler	PackageVariable('with_mysql', 'enable mysql support', 'no'),
255ccba074cSStefan Bühler	BoolVariable('with_openssl', 'enable openssl support', 'no'),
256bf4054f8SGlenn Strauss	PackageVariable('with_gnutls', 'enable GnuTLS support', 'no'),
257cb753ec5SGlenn Strauss	PackageVariable('with_mbedtls', 'enable mbedTLS support', 'no'),
258e00deb55SGlenn Strauss	PackageVariable('with_nss', 'enable NSS crypto support', 'no'),
259a950ae15SGlenn Strauss	PackageVariable('with_wolfssl', 'enable wolfSSL support', 'no'),
260b28a3714SGlenn Strauss	BoolVariable('with_nettle', 'enable Nettle support', 'no'),
2616edd040bSGlenn Strauss	BoolVariable('with_pam', 'enable PAM auth support', 'no'),
262750414d3SGlenn Strauss	PackageVariable('with_pcre2', 'enable pcre2 support', 'yes'),
263750414d3SGlenn Strauss	PackageVariable('with_pcre', 'enable pcre support', 'no'),
264ccba074cSStefan Bühler	PackageVariable('with_pgsql', 'enable pgsql support', 'no'),
265d61714ddSGlenn Strauss	PackageVariable('with_sasl', 'enable SASL support', 'no'),
26608c8749bSStefan Bühler	BoolVariable('with_sqlite3', 'enable sqlite3 support (required for webdav props)', 'no'),
26708c8749bSStefan Bühler	BoolVariable('with_uuid', 'enable uuid support (required for webdav locks)', 'no'),
268ccba074cSStefan Bühler	# with_valgrind not supported
269ccba074cSStefan Bühler	# with_xattr not supported
27008c8749bSStefan Bühler	PackageVariable('with_xml', 'enable xml support (required for webdav props)', 'no'),
27107622251SGlenn Strauss	BoolVariable('with_xxhash', 'build with system-provided xxhash', 'no'),
272fff8e705SStefan Bühler	BoolVariable('with_zlib', 'enable deflate/gzip compression', 'no'),
2739211fb3dSGlenn Strauss	BoolVariable('with_zstd', 'enable zstd compression', 'no'),
2742506e21bSStefan Bühler
2752506e21bSStefan Bühler	BoolVariable('with_all', 'enable all with_* features', 'no'),
276177f5509SGlenn Strauss)
277e95ea21bSJan Kneschke
278e95ea21bSJan Kneschkeenv = Environment(
2795515bb2aSStefan Bühler	ENV = dict(os.environ),  # make sure we have a dict here so .Clone() works properly
28068284bd7SStefan Bühler	variables = vars,
28168284bd7SStefan Bühler	CPPPATH = Split('#sconsbuild/build')
282e95ea21bSJan Kneschke)
283e95ea21bSJan Kneschke
28468284bd7SStefan Bühlerenv.Help(vars.GenerateHelpText(env))
285649cc0b7SJan Kneschke
286f358f04bSGlenn Straussif env.subst('${CC}') != '':
287649cc0b7SJan Kneschke	env['CC'] = env.subst('${CC}')
288649cc0b7SJan Kneschke
289e95ea21bSJan Kneschkeenv['package'] = package
290e95ea21bSJan Kneschkeenv['version'] = version
291230e6700SJan Kneschkeif env['CC'] == 'gcc':
2925872f766SJan Kneschke	## we need x-open 6 and bsd 4.3 features
293457d78c6SGlenn Strauss	env.Append(CCFLAGS = Split('-pipe -Wall -O2 -g -W -pedantic -Wunused -Wshadow -std=gnu99'))
294e95ea21bSJan Kneschke
295706910acSStefan Bühlerenv.Append(CPPFLAGS = [
29692576a2fSGlenn Strauss	'-D_TIME_BITS=64',
297706910acSStefan Bühler	'-D_FILE_OFFSET_BITS=64',
298706910acSStefan Bühler	'-D_LARGEFILE_SOURCE',
299706910acSStefan Bühler	'-D_LARGE_FILES',
3001bb0cbc7SGlenn Strauss	'-D_DEFAULT_SOURCE',
301706910acSStefan Bühler	'-D_GNU_SOURCE',
302706910acSStefan Bühler])
303706910acSStefan Bühler
3042506e21bSStefan Bühlerif env['with_all']:
3052506e21bSStefan Bühler	for feature in vars.keys():
3062506e21bSStefan Bühler		# only enable 'with_*' flags
3072506e21bSStefan Bühler		if not feature.startswith('with_'): continue
3082506e21bSStefan Bühler		# don't overwrite manual arguments
3092506e21bSStefan Bühler		if feature in vars.args: continue
3102506e21bSStefan Bühler		# now activate
3112506e21bSStefan Bühler		env[feature] = True
3122506e21bSStefan Bühler
313e95ea21bSJan Kneschke# cache configure checks
314e95ea21bSJan Kneschkeif 1:
31542704e31SStefan Bühler	autoconf = Autoconf(env)
31668284bd7SStefan Bühler
31768284bd7SStefan Bühler	if 'CFLAGS' in os.environ:
31868284bd7SStefan Bühler		autoconf.env.Append(CCFLAGS = os.environ['CFLAGS'])
31968284bd7SStefan Bühler		print(">> Appending custom build flags : " + os.environ['CFLAGS'])
32068284bd7SStefan Bühler
32168284bd7SStefan Bühler	if 'LDFLAGS' in os.environ:
32268284bd7SStefan Bühler		autoconf.env.Append(LINKFLAGS = os.environ['LDFLAGS'])
32368284bd7SStefan Bühler		print(">> Appending custom link flags : " + os.environ['LDFLAGS'])
32468284bd7SStefan Bühler
32568284bd7SStefan Bühler	if 'LIBS' in os.environ:
32668284bd7SStefan Bühler		autoconf.env.Append(APPEND_LIBS = os.environ['LIBS'])
32768284bd7SStefan Bühler		print(">> Appending custom libraries : " + os.environ['LIBS'])
32852d72fe8SStefan Bühler	else:
32952d72fe8SStefan Bühler		autoconf.env.Append(APPEND_LIBS = '')
33068284bd7SStefan Bühler
331d57029c0SStefan Bühler	autoconf.env.Append(
3328d5e237cSGlenn Strauss		LIBBROTLI = '',
333d57029c0SStefan Bühler		LIBBZ2 = '',
334d57029c0SStefan Bühler		LIBCRYPT = '',
335d57029c0SStefan Bühler		LIBCRYPTO = '',
336d57029c0SStefan Bühler		LIBDBI = '',
337d68fc639SGlenn Strauss		LIBDEFLATE = '',
338d57029c0SStefan Bühler		LIBDL = '',
339bf4054f8SGlenn Strauss		LIBGNUTLS = '',
340d57029c0SStefan Bühler		LIBGSSAPI_KRB5 = '',
341d57029c0SStefan Bühler		LIBKRB5 = '',
342d57029c0SStefan Bühler		LIBLBER = '',
343d57029c0SStefan Bühler		LIBLDAP = '',
344d57029c0SStefan Bühler		LIBLUA = '',
345ce1d45edSGlenn Strauss		LIBMBEDTLS = '',
346ce1d45edSGlenn Strauss		LIBMBEDX509 = '',
347ce1d45edSGlenn Strauss		LIBMBEDCRYPTO = '',
348d57029c0SStefan Bühler		LIBMYSQL = '',
349e00deb55SGlenn Strauss		LIBNSS = '',
350df4812ecSGlenn Strauss		LIBPAM = '',
351d57029c0SStefan Bühler		LIBPCRE = '',
352d57029c0SStefan Bühler		LIBPGSQL = '',
353d61714ddSGlenn Strauss		LIBSASL = '',
354d57029c0SStefan Bühler		LIBSQLITE3 = '',
355d57029c0SStefan Bühler		LIBSSL = '',
356ce1d45edSGlenn Strauss		LIBSSLCRYPTO = '',
357d57029c0SStefan Bühler		LIBUUID = '',
358ce1d45edSGlenn Strauss		LIBWOLFSSL = '',
359cb753ec5SGlenn Strauss		LIBX509 = '',
360d57029c0SStefan Bühler		LIBXML2 = '',
36107622251SGlenn Strauss		LIBXXHASH = '',
362d57029c0SStefan Bühler		LIBZ = '',
3639211fb3dSGlenn Strauss		LIBZSTD = '',
364d57029c0SStefan Bühler	)
365d57029c0SStefan Bühler
36642704e31SStefan Bühler	autoconf.haveCHeaders([
36742704e31SStefan Bühler		'arpa/inet.h',
36842704e31SStefan Bühler		'crypt.h',
369cd738d4dSGlenn Strauss		'dlfcn.h',
37042704e31SStefan Bühler		'fcntl.h',
37142704e31SStefan Bühler		'getopt.h',
37242704e31SStefan Bühler		'inttypes.h',
37342704e31SStefan Bühler		'linux/random.h',
37417835501SGlenn Strauss		'malloc.h',
37542704e31SStefan Bühler		'poll.h',
37642704e31SStefan Bühler		'pwd.h',
37742704e31SStefan Bühler		'stdint.h',
37842704e31SStefan Bühler		'stdlib.h',
37942704e31SStefan Bühler		'string.h',
38042704e31SStefan Bühler		'strings.h',
38142704e31SStefan Bühler		'sys/epoll.h',
3827ce8b22cSGlenn Strauss		'sys/inotify.h',
3838c9b5480SNiclas Rosenvik		'sys/loadavg.h',
38442704e31SStefan Bühler		'sys/poll.h',
38542704e31SStefan Bühler		'sys/prctl.h',
386f36908deSGlenn Strauss		'sys/procctl.h',
38742704e31SStefan Bühler		'sys/sendfile.h',
38842704e31SStefan Bühler		'sys/time.h',
38942704e31SStefan Bühler		'sys/wait.h',
39042704e31SStefan Bühler		'syslog.h',
39142704e31SStefan Bühler		'unistd.h',
39242704e31SStefan Bühler		'winsock2.h',
393e95ea21bSJan Kneschke
39442704e31SStefan Bühler		# "have" the last header if we include others before?
395ec945945SGlenn Strauss		['sys/types.h', 'sys/time.h', 'sys/resource.h'],
39642704e31SStefan Bühler		['sys/types.h', 'netinet/in.h'],
39742704e31SStefan Bühler		['sys/types.h', 'sys/event.h'],
39842704e31SStefan Bühler		['sys/types.h', 'sys/mman.h'],
39942704e31SStefan Bühler		['sys/types.h', 'sys/select.h'],
40042704e31SStefan Bühler		['sys/types.h', 'sys/socket.h'],
40142704e31SStefan Bühler		['sys/types.h', 'sys/uio.h'],
40242704e31SStefan Bühler		['sys/types.h', 'sys/un.h'],
40342704e31SStefan Bühler	])
40442704e31SStefan Bühler
4057733376bSStefan Bühler	autoconf.haveFuncs([
4067733376bSStefan Bühler		'arc4random_buf',
4077733376bSStefan Bühler		'chroot',
4087733376bSStefan Bühler		'clock_gettime',
4090d62b865SGlenn Strauss		'copy_file_range',
4107733376bSStefan Bühler		'epoll_ctl',
4117733376bSStefan Bühler		'explicit_bzero',
412d7c0fc29SStefan Bühler		'explicit_memset',
4137733376bSStefan Bühler		'fork',
4147733376bSStefan Bühler		'getloadavg',
4157733376bSStefan Bühler		'getrlimit',
4167733376bSStefan Bühler		'getuid',
4171b11cd7aSGlenn Strauss		'gmtime_r',
4183579c322SGlenn Strauss		'inet_aton',
4197733376bSStefan Bühler		'inet_pton',
4207733376bSStefan Bühler		'issetugid',
4217733376bSStefan Bühler		'jrand48',
4227733376bSStefan Bühler		'kqueue',
4237733376bSStefan Bühler		'localtime_r',
4247733376bSStefan Bühler		'lstat',
4257733376bSStefan Bühler		'madvise',
4261a8d8e0cSGlenn Strauss		'malloc_trim',
42717835501SGlenn Strauss		'mallopt',
42882fbfcbaSGlenn Strauss		'mempcpy',
4297733376bSStefan Bühler		'memset_s',
4309f62f1b1SGlenn Strauss		'mkostemp',
4317733376bSStefan Bühler		'mmap',
4327733376bSStefan Bühler		'pipe2',
4337733376bSStefan Bühler		'poll',
4345cab11b7SGlenn Strauss		'pread',
4355c18891aSGlenn Strauss		'preadv',
4365cab11b7SGlenn Strauss		'pwrite',
4375c18891aSGlenn Strauss		'pwritev',
4387733376bSStefan Bühler		'select',
4397733376bSStefan Bühler		'sendfile',
4407733376bSStefan Bühler		'sendfile64',
4417733376bSStefan Bühler		'sigaction',
4427733376bSStefan Bühler		'signal',
4435cab11b7SGlenn Strauss		'splice',
4447733376bSStefan Bühler		'srandom',
44586c39754SGlenn Strauss		'strerror_r',
446f8cc9fb9SGlenn Strauss		'timegm',
4477733376bSStefan Bühler		'writev',
4487733376bSStefan Bühler	])
44942704e31SStefan Bühler	autoconf.haveFunc('getentropy', 'sys/random.h')
45042704e31SStefan Bühler	autoconf.haveFunc('getrandom', 'linux/random.h')
451b6bd11c1SDavid Carlier	if re.compile("sunos|solaris").search(env['PLATFORM']):
452448621e0SGlenn Strauss		autoconf.haveCHeaders([
453448621e0SGlenn Strauss			'port.h',
454448621e0SGlenn Strauss			'priv.h',
455448621e0SGlenn Strauss			'sys/devpoll.h',
456448621e0SGlenn Strauss			'sys/filio.h',
457448621e0SGlenn Strauss		])
458448621e0SGlenn Strauss		autoconf.haveFunc('port_create', 'port.h')
459c0ced4e8SGlenn Strauss		autoconf.haveFunc('sendfilev')
460b6bd11c1SDavid Carlier		autoconf.haveFunc('setpflags', 'priv.h')
461e95ea21bSJan Kneschke
46242704e31SStefan Bühler	autoconf.haveTypes(Split('pid_t size_t off_t'))
463e95ea21bSJan Kneschke
464505cc785SStefan Bühler	# have crypt_r/crypt, and is -lcrypt needed?
46542704e31SStefan Bühler	if autoconf.CheckLib('crypt'):
4662e797996SStefan Bühler		autoconf.env.Append(
4672e797996SStefan Bühler			LIBCRYPT = 'crypt',
4682e797996SStefan Bühler		)
46942704e31SStefan Bühler		with autoconf.restoreEnvLibs():
47042704e31SStefan Bühler			autoconf.env['LIBS'] = ['crypt']
47142704e31SStefan Bühler			autoconf.haveFuncs(['crypt', 'crypt_r'])
47252d72fe8SStefan Bühler	else:
47342704e31SStefan Bühler		autoconf.haveFuncs(['crypt', 'crypt_r'])
474e95ea21bSJan Kneschke
475505cc785SStefan Bühler	if autoconf.CheckType('socklen_t', '#include <unistd.h>\n#include <sys/socket.h>\n#include <sys/types.h>'):
476505cc785SStefan Bühler		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SOCKLEN_T' ])
477505cc785SStefan Bühler
478505cc785SStefan Bühler	if autoconf.CheckType('struct sockaddr_storage', '#include <sys/socket.h>\n'):
479505cc785SStefan Bühler		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_SOCKADDR_STORAGE' ])
480505cc785SStefan Bühler
48152c48983SGlenn Strauss	if autoconf.CheckLibWithHeader('elftc', 'libelftc.h', 'c', 'elftc_copyfile(0, 1);'):
48252c48983SGlenn Strauss		autoconf.env.Append(
48352c48983SGlenn Strauss			CPPFLAGS = [ '-DHAVE_ELFTC_COPYFILE' ],
48452c48983SGlenn Strauss			LIBS = [ 'elftc' ],
48552c48983SGlenn Strauss		)
48652c48983SGlenn Strauss
48742704e31SStefan Bühler	if autoconf.CheckLibWithHeader('rt', 'time.h', 'c', 'clock_gettime(CLOCK_MONOTONIC, (struct timespec*)0);'):
4882e797996SStefan Bühler		autoconf.env.Append(
4892e797996SStefan Bühler			CPPFLAGS = [ '-DHAVE_CLOCK_GETTIME' ],
4902e797996SStefan Bühler			LIBS = [ 'rt' ],
4912e797996SStefan Bühler		)
4921ebc83f1SGlenn Strauss
493505cc785SStefan Bühler	if autoconf.CheckIPv6():
494505cc785SStefan Bühler		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_IPV6' ])
4950014a87dSJan Kneschke
496505cc785SStefan Bühler	if autoconf.CheckWeakSymbols():
497505cc785SStefan Bühler		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_WEAK_SYMBOLS' ])
498e95ea21bSJan Kneschke
499505cc785SStefan Bühler	if autoconf.CheckGmtOffInStructTm():
500505cc785SStefan Bühler		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_TM_GMTOFF' ])
501505cc785SStefan Bühler
50242704e31SStefan Bühler	if autoconf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'):
503505cc785SStefan Bühler		autoconf.env.Append(LIBDL = 'dl')
504505cc785SStefan Bühler
505505cc785SStefan Bühler	if env['with_bzip2']:
50642704e31SStefan Bühler		if not autoconf.CheckLibWithHeader('bz2', 'bzlib.h', 'C'):
50766e0cd16SStefan Bühler			fail("Couldn't find bz2")
5082e797996SStefan Bühler		autoconf.env.Append(
5092e797996SStefan Bühler			CPPFLAGS = [ '-DHAVE_BZLIB_H', '-DHAVE_LIBBZ2' ],
5102e797996SStefan Bühler			LIBBZ2 = 'bz2',
5112e797996SStefan Bühler		)
512505cc785SStefan Bühler
5138d5e237cSGlenn Strauss	if env['with_brotli']:
514cea7e921SGlenn Strauss		if not autoconf.CheckParseConfigForLib('LIBBROTLI', 'pkg-config --static --cflags --libs libbrotlienc'):
5158d5e237cSGlenn Strauss			fail("Couldn't find libbrotlienc")
51617b378c0SGlenn Strauss		autoconf.env.Append(
51717b378c0SGlenn Strauss			CPPFLAGS = [ '-DHAVE_BROTLI_ENCODE_H', '-DHAVE_BROTLI' ],
51817b378c0SGlenn Strauss		)
5198d5e237cSGlenn Strauss
520505cc785SStefan Bühler	if env['with_dbi']:
52142704e31SStefan Bühler		if not autoconf.CheckLibWithHeader('dbi', 'dbi/dbi.h', 'C'):
52266e0cd16SStefan Bühler			fail("Couldn't find dbi")
5232e797996SStefan Bühler		autoconf.env.Append(
524c7c34201SGlenn Strauss			CPPFLAGS = [ '-DHAVE_DBI' ],
5252e797996SStefan Bühler			LIBDBI = 'dbi',
5262e797996SStefan Bühler		)
527505cc785SStefan Bühler
528f885498bSGlenn Strauss	if env['with_fam'] and not autoconf.CheckCHeader('sys/inotify.h'):
52942704e31SStefan Bühler		if not autoconf.CheckLibWithHeader('fam', 'fam.h', 'C'):
53066e0cd16SStefan Bühler			fail("Couldn't find fam")
5312e797996SStefan Bühler		autoconf.env.Append(
5322e797996SStefan Bühler			CPPFLAGS = [ '-DHAVE_FAM_H', '-DHAVE_LIBFAM' ],
5332e797996SStefan Bühler			LIBS = [ 'fam' ],
5342e797996SStefan Bühler		)
53542704e31SStefan Bühler		autoconf.haveFunc('FAMNoExists')
536505cc785SStefan Bühler
537d68fc639SGlenn Strauss	if env['with_libdeflate']:
538d68fc639SGlenn Strauss		if not autoconf.CheckLibWithHeader('deflate', 'libdeflate.h', 'C'):
539d68fc639SGlenn Strauss			fail("Couldn't find libdeflate")
540d68fc639SGlenn Strauss		autoconf.env.Append(
541d68fc639SGlenn Strauss			CPPFLAGS = [ '-DHAVE_LIBDEFLATE' ],
542d68fc639SGlenn Strauss			LIBDEFLATE = 'libdeflate',
543d68fc639SGlenn Strauss		)
544d68fc639SGlenn Strauss
5454ac239c4SGlenn Strauss	if env['with_maxminddb']:
5464ac239c4SGlenn Strauss		if not autoconf.CheckLibWithHeader('maxminddb', 'maxminddb.h', 'C'):
5474ac239c4SGlenn Strauss			fail("Couldn't find maxminddb")
5484ac239c4SGlenn Strauss		autoconf.env.Append(
5494ac239c4SGlenn Strauss			CPPFLAGS = [ '-DHAVE_MAXMINDDB' ],
5504ac239c4SGlenn Strauss			LIBMAXMINDDB = 'maxminddb',
5514ac239c4SGlenn Strauss		)
5524ac239c4SGlenn Strauss
5531c1a6378SGlenn Strauss	if env['with_krb5']:
55442704e31SStefan Bühler		if not autoconf.CheckLibWithHeader('krb5', 'krb5.h', 'C'):
55566e0cd16SStefan Bühler			fail("Couldn't find krb5")
55642704e31SStefan Bühler		if not autoconf.CheckLibWithHeader('gssapi_krb5', 'gssapi/gssapi_krb5.h', 'C'):
55766e0cd16SStefan Bühler			fail("Couldn't find gssapi_krb5")
5582e797996SStefan Bühler		autoconf.env.Append(
5592e797996SStefan Bühler			CPPFLAGS = [ '-DHAVE_KRB5' ],
5602e797996SStefan Bühler			LIBKRB5 = 'krb5',
5612e797996SStefan Bühler			LIBGSSAPI_KRB5 = 'gssapi_krb5',
5622e797996SStefan Bühler		)
5631c1a6378SGlenn Strauss
56428729997SJan Kneschke	if env['with_ldap']:
56542704e31SStefan Bühler		if not autoconf.CheckLibWithHeader('ldap', 'ldap.h', 'C'):
56666e0cd16SStefan Bühler			fail("Couldn't find ldap")
56742704e31SStefan Bühler		if not autoconf.CheckLibWithHeader('lber', 'lber.h', 'C'):
56866e0cd16SStefan Bühler			fail("Couldn't find lber")
5692e797996SStefan Bühler		autoconf.env.Append(
5702e797996SStefan Bühler			CPPFLAGS = [
5712e797996SStefan Bühler				'-DHAVE_LDAP_H', '-DHAVE_LIBLDAP',
5722e797996SStefan Bühler				'-DHAVE_LBER_H', '-DHAVE_LIBLBER',
5732e797996SStefan Bühler			],
5742e797996SStefan Bühler			LIBLDAP = 'ldap',
5752e797996SStefan Bühler			LIBLBER = 'lber',
5762e797996SStefan Bühler		)
57728729997SJan Kneschke
578505cc785SStefan Bühler	if env['with_lua']:
57968284bd7SStefan Bühler		found_lua = False
58064aff80dSGlenn Strauss		for lua_name in ['lua5.4', 'lua-5.4', 'lua5.3', 'lua-5.3', 'lua5.2', 'lua-5.2', 'lua5.1', 'lua-5.1', 'lua']:
5813ba68b25SStefan Bühler			print("Searching for lua: " + lua_name + " >= 5.0")
5823ba68b25SStefan Bühler			if autoconf.CheckParseConfigForLib('LIBLUA', "pkg-config '" + lua_name + " >= 5.0' --cflags --libs"):
5833ba68b25SStefan Bühler				autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LUA_H' ])
58468284bd7SStefan Bühler				found_lua = True
58568284bd7SStefan Bühler				break
58668284bd7SStefan Bühler		if not found_lua:
58766e0cd16SStefan Bühler			fail("Couldn't find any lua implementation")
5889b10531fSJan Kneschke
5896db887adSJan Kneschke	if env['with_mysql']:
59042704e31SStefan Bühler		mysql_config = autoconf.checkProgram('mysql', 'mysql_config')
5913ba68b25SStefan Bühler		if not autoconf.CheckParseConfigForLib('LIBMYSQL', mysql_config + ' --cflags --libs'):
5923ba68b25SStefan Bühler			fail("Couldn't find mysql")
593c7c34201SGlenn Strauss		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_MYSQL' ])
5946db887adSJan Kneschke
595e00deb55SGlenn Strauss	if env['with_nss']:
596e00deb55SGlenn Strauss		nss_config = autoconf.checkProgram('nss', 'nss-config')
597e00deb55SGlenn Strauss		if not autoconf.CheckParseConfigForLib('LIBNSS', nss_config + ' --cflags --libs'):
598e00deb55SGlenn Strauss			fail("Couldn't find NSS")
599e00deb55SGlenn Strauss		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_NSS3_NSS_H' ])
600e00deb55SGlenn Strauss
601505cc785SStefan Bühler	if env['with_openssl']:
60242704e31SStefan Bühler		if not autoconf.CheckLibWithHeader('ssl', 'openssl/ssl.h', 'C'):
60366e0cd16SStefan Bühler			fail("Couldn't find openssl")
6042e797996SStefan Bühler		autoconf.env.Append(
6052e797996SStefan Bühler			CPPFLAGS = [ '-DHAVE_OPENSSL_SSL_H', '-DHAVE_LIBSSL'],
6062e797996SStefan Bühler			LIBSSL = 'ssl',
607ce1d45edSGlenn Strauss			LIBSSLCRYPTO = 'crypto',
6082e797996SStefan Bühler			LIBCRYPTO = 'crypto',
6092e797996SStefan Bühler		)
610505cc785SStefan Bühler
611a950ae15SGlenn Strauss	if env['with_wolfssl']:
612a950ae15SGlenn Strauss		if type(env['with_wolfssl']) is str:
613a950ae15SGlenn Strauss			autoconf.env.AppendUnique(
614a950ae15SGlenn Strauss				CPPPATH = [ env['with_wolfssl'] + '/include',
615a950ae15SGlenn Strauss					    env['with_wolfssl'] + '/include/wolfssl' ],
616a950ae15SGlenn Strauss				LIBPATH = [ env['with_wolfssl'] + '/lib' ],
617a950ae15SGlenn Strauss			)
618a950ae15SGlenn Strauss		if not autoconf.CheckLibWithHeader('wolfssl', 'wolfssl/ssl.h', 'C'):
619a950ae15SGlenn Strauss			fail("Couldn't find wolfssl")
620a950ae15SGlenn Strauss		autoconf.env.Append(
621a950ae15SGlenn Strauss			CPPFLAGS = [ '-DHAVE_WOLFSSL_SSL_H' ],
622ce1d45edSGlenn Strauss			LIBWOLFSSL= 'wolfssl',
623a950ae15SGlenn Strauss			LIBCRYPTO = 'wolfssl',
624a950ae15SGlenn Strauss		)
625a950ae15SGlenn Strauss
626cb753ec5SGlenn Strauss	if env['with_mbedtls']:
627cb753ec5SGlenn Strauss		if not autoconf.CheckLibWithHeader('mbedtls', 'mbedtls/ssl.h', 'C'):
628cb753ec5SGlenn Strauss			fail("Couldn't find mbedtls")
629cb753ec5SGlenn Strauss		autoconf.env.Append(
630cb753ec5SGlenn Strauss			CPPFLAGS = [ '-DHAVE_LIBMBEDCRYPTO' ],
631ce1d45edSGlenn Strauss			LIBMBEDTLS = 'mbedtls',
632ce1d45edSGlenn Strauss			LIBMBEDX509 = 'mbedx509',
633ce1d45edSGlenn Strauss			LIBMBEDCRYPTO = 'mbedcrypto',
634cb753ec5SGlenn Strauss			LIBCRYPTO = 'mbedcrypto',
635cb753ec5SGlenn Strauss		)
636cb753ec5SGlenn Strauss
637b28a3714SGlenn Strauss	if env['with_nettle']:
638b28a3714SGlenn Strauss		if not autoconf.CheckLibWithHeader('nettle', 'nettle/nettle-types.h', 'C'):
639b28a3714SGlenn Strauss			fail("Couldn't find Nettle")
640b28a3714SGlenn Strauss		autoconf.env.Append(
641b28a3714SGlenn Strauss			CPPFLAGS = [ '-DHAVE_NETTLE_NETTLE_TYPES_H' ],
642b28a3714SGlenn Strauss			LIBCRYPTO = 'nettle',
643b28a3714SGlenn Strauss		)
644b28a3714SGlenn Strauss
645bf4054f8SGlenn Strauss	if env['with_gnutls']:
646bf4054f8SGlenn Strauss		if not autoconf.CheckLibWithHeader('gnutls', 'gnutls/crypto.h', 'C'):
647bf4054f8SGlenn Strauss			fail("Couldn't find gnutls")
648bf4054f8SGlenn Strauss		autoconf.env.Append(
649bf4054f8SGlenn Strauss			CPPFLAGS = [ '-DHAVE_GNUTLS_CRYPTO_H' ],
650bf4054f8SGlenn Strauss			LIBGNUTLS = 'gnutls',
651bf4054f8SGlenn Strauss		)
652bf4054f8SGlenn Strauss		if not autoconf.env.exists('LIBCRYPTO'):
653bf4054f8SGlenn Strauss			autoconf.env.Append(
654bf4054f8SGlenn Strauss				LIBCRYPTO = 'gnutls',
655bf4054f8SGlenn Strauss			)
656bf4054f8SGlenn Strauss
657df4812ecSGlenn Strauss	if env['with_pam']:
658df4812ecSGlenn Strauss		if not autoconf.CheckLibWithHeader('pam', 'security/pam_appl.h', 'C'):
659df4812ecSGlenn Strauss			fail("Couldn't find pam")
660df4812ecSGlenn Strauss		autoconf.env.Append(
661df4812ecSGlenn Strauss			CPPFLAGS = [ '-DHAVE_PAM' ],
662df4812ecSGlenn Strauss			LIBPAM = 'pam',
663df4812ecSGlenn Strauss		)
664df4812ecSGlenn Strauss
665750414d3SGlenn Strauss	if env['with_pcre2'] and not env['with_pcre']:
6667512d82cSGlenn Strauss		pcre2_config = autoconf.checkProgram('pcre2', 'pcre2-config')
6677512d82cSGlenn Strauss		if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre2_config + ' --cflags --libs8'):
6687512d82cSGlenn Strauss			fail("Couldn't find pcre2")
6697512d82cSGlenn Strauss		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE2_H', '-DHAVE_PCRE' ])
6707512d82cSGlenn Strauss	elif env['with_pcre']:
67142704e31SStefan Bühler		pcre_config = autoconf.checkProgram('pcre', 'pcre-config')
6723ba68b25SStefan Bühler		if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre_config + ' --cflags --libs'):
6733ba68b25SStefan Bühler			fail("Couldn't find pcre")
6747512d82cSGlenn Strauss		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE_H', '-DHAVE_PCRE' ])
675505cc785SStefan Bühler
6762f83aac9SGlenn Strauss	if env['with_pgsql']:
6773ba68b25SStefan Bühler		if not autoconf.CheckParseConfigForLib('LIBPGSQL', 'pkg-config libpq --cflags --libs'):
6783ba68b25SStefan Bühler			fail("Couldn't find libpq")
679c7c34201SGlenn Strauss		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PGSQL' ])
6802f83aac9SGlenn Strauss
681d61714ddSGlenn Strauss	if env['with_sasl']:
682d61714ddSGlenn Strauss		if not autoconf.CheckLibWithHeader('sasl2', 'sasl/sasl.h', 'C'):
683d61714ddSGlenn Strauss			fail("Couldn't find libsasl2")
684d61714ddSGlenn Strauss		autoconf.env.Append(
685d61714ddSGlenn Strauss			CPPFLAGS = [ '-DHAVE_SASL' ],
686d61714ddSGlenn Strauss			LIBSASL = 'sasl2',
687d61714ddSGlenn Strauss		)
688d61714ddSGlenn Strauss
689505cc785SStefan Bühler	if env['with_sqlite3']:
69042704e31SStefan Bühler		if not autoconf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'):
69166e0cd16SStefan Bühler			fail("Couldn't find sqlite3")
6922e797996SStefan Bühler		autoconf.env.Append(
6932e797996SStefan Bühler			CPPFLAGS = [ '-DHAVE_SQLITE3_H', '-DHAVE_LIBSQLITE3' ],
6942e797996SStefan Bühler			LIBSQLITE3 = 'sqlite3',
6952e797996SStefan Bühler		)
696505cc785SStefan Bühler
697505cc785SStefan Bühler	if env['with_uuid']:
69842704e31SStefan Bühler		if not autoconf.CheckLibWithHeader('uuid', 'uuid/uuid.h', 'C'):
69966e0cd16SStefan Bühler			fail("Couldn't find uuid")
7002e797996SStefan Bühler		autoconf.env.Append(
7012e797996SStefan Bühler			CPPFLAGS = [ '-DHAVE_UUID_UUID_H', '-DHAVE_LIBUUID' ],
7022e797996SStefan Bühler			LIBUUID = 'uuid',
7032e797996SStefan Bühler		)
704505cc785SStefan Bühler
705505cc785SStefan Bühler	if env['with_xml']:
70642704e31SStefan Bühler		xml2_config = autoconf.checkProgram('xml', 'xml2-config')
7073ba68b25SStefan Bühler		if not autoconf.CheckParseConfigForLib('LIBXML2', xml2_config + ' --cflags --libs'):
7083ba68b25SStefan Bühler			fail("Couldn't find xml2")
7093ba68b25SStefan Bühler		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LIBXML_H', '-DHAVE_LIBXML2' ])
710505cc785SStefan Bühler
71107622251SGlenn Strauss	if env['with_xxhash']:
71207622251SGlenn Strauss		if not autoconf.CheckLibWithHeader('xxhash', 'xxhash.h', 'C'):
71307622251SGlenn Strauss			fail("Couldn't find xxhash")
71407622251SGlenn Strauss		autoconf.env.Append(
71507622251SGlenn Strauss			CPPFLAGS = [ '-DHAVE_XXHASH_H' ],
71607622251SGlenn Strauss			LIBXXHASH = 'xxhash',
71707622251SGlenn Strauss		)
71807622251SGlenn Strauss
719505cc785SStefan Bühler	if env['with_zlib']:
72042704e31SStefan Bühler		if not autoconf.CheckLibWithHeader('z', 'zlib.h', 'C'):
72166e0cd16SStefan Bühler			fail("Couldn't find zlib")
7222e797996SStefan Bühler		autoconf.env.Append(
7232e797996SStefan Bühler			CPPFLAGS = [ '-DHAVE_ZLIB_H', '-DHAVE_LIBZ' ],
7242e797996SStefan Bühler			LIBZ = 'z',
7252e797996SStefan Bühler		)
726505cc785SStefan Bühler
7279211fb3dSGlenn Strauss	if env['with_zstd']:
7289211fb3dSGlenn Strauss		if not autoconf.CheckLibWithHeader('zstd', 'zstd.h', 'C'):
7299211fb3dSGlenn Strauss			fail("Couldn't find zstd")
7309211fb3dSGlenn Strauss		autoconf.env.Append(
7319211fb3dSGlenn Strauss			CPPFLAGS = [ '-DHAVE_ZSTD_H', '-DHAVE_ZSTD' ],
7329211fb3dSGlenn Strauss			LIBZSTD = 'zstd',
7339211fb3dSGlenn Strauss		)
7349211fb3dSGlenn Strauss
735505cc785SStefan Bühler	env = autoconf.Finish()
736505cc785SStefan Bühler
73786d03967SGlenn Straussif re.compile("cygwin|mingw|midipix").search(env['PLATFORM']):
738809199f9SmOo	env.Append(COMMON_LIB = 'bin')
739809199f9SmOoelif re.compile("darwin|aix").search(env['PLATFORM']):
740809199f9SmOo	env.Append(COMMON_LIB = 'lib')
741809199f9SmOoelse:
742809199f9SmOo	env.Append(COMMON_LIB = False)
743809199f9SmOo
744d102a711SStefan Bühlerversions = version.split('.')
745809199f9SmOoversion_id = int(versions[0]) << 16 | int(versions[1]) << 8 | int(versions[2])
746e95ea21bSJan Kneschkeenv.Append(CPPFLAGS = [
74768284bd7SStefan Bühler		'-DLIGHTTPD_VERSION_ID=' + hex(version_id),
748e95ea21bSJan Kneschke		'-DPACKAGE_NAME=\\"' + package + '\\"',
749e95ea21bSJan Kneschke		'-DPACKAGE_VERSION=\\"' + version + '\\"',
750e95ea21bSJan Kneschke		'-DLIBRARY_DIR="\\"${libdir}\\""',
751e95ea21bSJan Kneschke		] )
752e95ea21bSJan Kneschke
75368284bd7SStefan BühlerSConscript('src/SConscript', exports = 'env', variant_dir = 'sconsbuild/build', duplicate = 0)
75468284bd7SStefan BühlerSConscript('tests/SConscript', exports = 'env', variant_dir = 'sconsbuild/tests')
755