xref: /lighttpd1.4/SConstruct (revision bd67d9f4)
1from __future__ import print_function
2import os
3import re
4import string
5import sys
6from copy import copy
7from stat import *
8
9try:
10	string_types = basestring
11except NameError:
12	string_types = str
13
14package = 'lighttpd'
15version = '1.4.65'
16
17underscorify_reg = re.compile('[^A-Z0-9]')
18def underscorify(id):
19	return underscorify_reg.sub('_', id.upper())
20
21def fail(*args, **kwargs):
22	print(*args, file=sys.stderr, **kwargs)
23	sys.exit(-1)
24
25class Autoconf:
26	class RestoreEnvLibs:
27		def __init__(self, env):
28			self.env = env
29			self.active = False
30
31		def __enter__(self):
32			if self.active:
33				raise Exception('entered twice')
34			self.active = True
35			if 'LIBS' in self.env:
36				#print("Backup LIBS: " + repr(self.env['LIBS']))
37				self.empty = False
38				self.backup_libs = copy(self.env['LIBS'])
39			else:
40				#print("No LIBS to backup")
41				self.empty = True
42
43		def __exit__(self, type, value, traceback):
44			if not self.active:
45				raise Exception('exited twice')
46			self.active = False
47			if self.empty:
48				if 'LIBS' in self.env:
49					del self.env['LIBS']
50			else:
51				#print("Restoring LIBS, now: " + repr(self.env['LIBS']))
52				self.env['LIBS'] = self.backup_libs
53				#print("Restoring LIBS, to: " + repr(self.env['LIBS']))
54
55	def __init__(self, env):
56		self.conf = Configure(env, custom_tests = {
57			'CheckGmtOffInStructTm': Autoconf.__checkGmtOffInStructTm,
58			'CheckIPv6': Autoconf.__checkIPv6,
59			'CheckWeakSymbols': Autoconf.__checkWeakSymbols,
60		})
61
62	def append(self, *args, **kw):
63		return self.conf.env.Append(*args, **kw)
64
65	def Finish(self):
66		return self.conf.Finish()
67
68	@property
69	def env(self):
70		return self.conf.env
71
72	def restoreEnvLibs(self):
73		return Autoconf.RestoreEnvLibs(self.conf.env)
74
75	def CheckType(self, *args, **kw):
76		return self.conf.CheckType(*args, **kw)
77
78	def CheckLib(self, *args, **kw):
79		return self.conf.CheckLib(*args, autoadd = 0, **kw)
80
81	def CheckLibWithHeader(self, *args, **kw):
82		return self.conf.CheckLibWithHeader(*args, autoadd = 0, **kw)
83
84	def CheckGmtOffInStructTm(self):
85		return self.conf.CheckGmtOffInStructTm()
86
87	def CheckIPv6(self):
88		return self.conf.CheckIPv6()
89
90	def CheckWeakSymbols(self):
91		return self.conf.CheckWeakSymbols()
92
93	def CheckCHeader(self, hdr):
94		return self.conf.CheckCHeader(hdr)
95
96	def haveCHeader(self, hdr):
97		if self.CheckCHeader(hdr):
98			# if we have a list of headers define HAVE_ only for last one
99			target = hdr
100			if not isinstance(target, string_types):
101				target = target[-1]
102			self.conf.env.Append(CPPFLAGS = [ '-DHAVE_' + underscorify(target) ])
103			return True
104		return False
105
106	def haveCHeaders(self, hdrs):
107		for hdr in hdrs:
108			self.haveCHeader(hdr)
109
110	def CheckFunc(self, func, header = None, libs = []):
111		with self.restoreEnvLibs():
112			self.env.Append(LIBS = libs)
113			return self.conf.CheckFunc(func, header = header)
114
115	def CheckFuncInLib(self, func, lib):
116		return self.CheckFunc(func, libs = [lib])
117
118	def haveFuncInLib(self, func, lib):
119		if self.CheckFuncInLib(func, lib):
120			self.conf.env.Append(CPPFLAGS = [ '-DHAVE_' + underscorify(func) ])
121			return True
122		return False
123
124	def haveFunc(self, func, header = None, libs = []):
125		if self.CheckFunc(func, header = header, libs = libs):
126			self.conf.env.Append(CPPFLAGS = [ '-DHAVE_' + underscorify(func) ])
127			return True
128		return False
129
130	def haveFuncs(self, funcs):
131		for func in funcs:
132			self.haveFunc(func)
133
134	def haveTypes(self, types):
135		for type in types:
136			if self.conf.CheckType(type, '#include <sys/types.h>'):
137				self.conf.env.Append(CPPFLAGS = [ '-DHAVE_' + underscorify(type) ])
138
139	def CheckParseConfig(self, *args, **kw):
140		try:
141			self.conf.env.ParseConfig(*args, **kw)
142			return True
143		except OSError:
144			return False
145		except Exception as e:
146			print(e.message, file=sys.stderr)
147			return False
148
149	def CheckParseConfigForLib(self, lib, *args, **kw):
150		with self.restoreEnvLibs():
151			self.env['LIBS'] = []
152			if not self.CheckParseConfig(*args, **kw):
153				return False
154			self.env.Append(**{lib: self.env['LIBS']})
155			return True
156
157	@staticmethod
158	def __checkGmtOffInStructTm(context):
159		source = """
160#include <time.h>
161int main() {
162	struct tm a;
163	a.tm_gmtoff = 0;
164	return 0;
165}
166"""
167		context.Message('Checking for tm_gmtoff in struct tm...')
168		result = context.TryLink(source, '.c')
169		context.Result(result)
170
171		return result
172
173	@staticmethod
174	def __checkIPv6(context):
175		source = """
176#include <sys/types.h>
177#include <sys/socket.h>
178#include <netinet/in.h>
179
180int main() {
181	struct sockaddr_in6 s; struct in6_addr t=in6addr_any; int i=AF_INET6; s; t.s6_addr[0] = 0;
182	return 0;
183}
184"""
185		context.Message('Checking for IPv6 support...')
186		result = context.TryLink(source, '.c')
187		context.Result(result)
188
189		return result
190
191	@staticmethod
192	def __checkWeakSymbols(context):
193		source = """
194__attribute__((weak)) void __dummy(void *x) { }
195int main() {
196	void *x;
197	__dummy(x);
198}
199"""
200		context.Message('Checking for weak symbol support...')
201		result = context.TryLink(source, '.c')
202		context.Result(result)
203
204		return result
205
206	def checkProgram(self, withname, progname):
207		withname = 'with_' + withname
208		binpath = None
209
210		if self.env[withname] != 1:
211			binpath = self.env[withname]
212		else:
213			prog = self.env.Detect(progname)
214			if prog:
215				binpath = self.env.WhereIs(prog)
216
217		if binpath:
218			mode = os.stat(binpath)[ST_MODE]
219			if S_ISDIR(mode):
220				fail("* error: path `%s' is a directory" % (binpath))
221			if not S_ISREG(mode):
222				fail("* error: path `%s' is not a file or not exists" % (binpath))
223
224		if not binpath:
225			fail("* error: can't find program `%s'" % (progname))
226
227		return binpath
228
229VariantDir('sconsbuild/build', 'src', duplicate = 0)
230VariantDir('sconsbuild/tests', 'tests', duplicate = 0)
231
232vars = Variables()
233vars.AddVariables(
234	('prefix', 'prefix', '/usr/local'),
235	('bindir', 'binary directory', '${prefix}/bin'),
236	('sbindir', 'binary directory', '${prefix}/sbin'),
237	('libdir', 'library directory', '${prefix}/lib'),
238	PathVariable('CC', 'path to the c-compiler', None),
239	BoolVariable('build_dynamic', 'enable dynamic build', 'yes'),
240	BoolVariable('build_static', 'enable static build', 'no'),
241	BoolVariable('build_fullstatic', 'enable fullstatic build', 'no'),
242
243	BoolVariable('with_bzip2', 'enable bzip2 compression', 'no'),
244	BoolVariable('with_brotli', 'enable brotli compression', 'no'),
245	PackageVariable('with_dbi', 'enable dbi support', 'no'),
246	BoolVariable('with_fam', 'enable FAM/gamin support', 'no'),
247	BoolVariable('with_libdeflate', 'enable libdeflate compression', 'no'),
248	BoolVariable('with_maxminddb', 'enable MaxMind GeoIP2 support', 'no'),
249	BoolVariable('with_krb5', 'enable krb5 auth support', 'no'),
250	BoolVariable('with_ldap', 'enable ldap auth support', 'no'),
251	# with_libev not supported
252	# with_libunwind not supported
253	BoolVariable('with_lua', 'enable lua support', 'no'),
254	PackageVariable('with_mysql', 'enable mysql support', 'no'),
255	BoolVariable('with_openssl', 'enable openssl support', 'no'),
256	PackageVariable('with_gnutls', 'enable GnuTLS support', 'no'),
257	PackageVariable('with_mbedtls', 'enable mbedTLS support', 'no'),
258	PackageVariable('with_nss', 'enable NSS crypto support', 'no'),
259	PackageVariable('with_wolfssl', 'enable wolfSSL support', 'no'),
260	BoolVariable('with_nettle', 'enable Nettle support', 'no'),
261	BoolVariable('with_pam', 'enable PAM auth support', 'no'),
262	PackageVariable('with_pcre2', 'enable pcre2 support', 'yes'),
263	PackageVariable('with_pcre', 'enable pcre support', 'no'),
264	PackageVariable('with_pgsql', 'enable pgsql support', 'no'),
265	PackageVariable('with_sasl', 'enable SASL support', 'no'),
266	BoolVariable('with_sqlite3', 'enable sqlite3 support (required for webdav props)', 'no'),
267	BoolVariable('with_uuid', 'enable uuid support (required for webdav locks)', 'no'),
268	# with_valgrind not supported
269	# with_xattr not supported
270	PackageVariable('with_xml', 'enable xml support (required for webdav props)', 'no'),
271	BoolVariable('with_xxhash', 'build with system-provided xxhash', 'no'),
272	BoolVariable('with_zlib', 'enable deflate/gzip compression', 'no'),
273	BoolVariable('with_zstd', 'enable zstd compression', 'no'),
274
275	BoolVariable('with_all', 'enable all with_* features', 'no'),
276)
277
278env = Environment(
279	ENV = dict(os.environ),  # make sure we have a dict here so .Clone() works properly
280	variables = vars,
281	CPPPATH = Split('#sconsbuild/build')
282)
283
284env.Help(vars.GenerateHelpText(env))
285
286if env.subst('${CC}') != '':
287	env['CC'] = env.subst('${CC}')
288
289env['package'] = package
290env['version'] = version
291if env['CC'] == 'gcc':
292	## we need x-open 6 and bsd 4.3 features
293	env.Append(CCFLAGS = Split('-pipe -Wall -O2 -g -W -pedantic -Wunused -Wshadow -std=gnu99'))
294
295env.Append(CPPFLAGS = [
296	'-D_TIME_BITS=64',
297	'-D_FILE_OFFSET_BITS=64',
298	'-D_LARGEFILE_SOURCE',
299	'-D_LARGE_FILES',
300	'-D_GNU_SOURCE',
301])
302
303if env['with_all']:
304	for feature in vars.keys():
305		# only enable 'with_*' flags
306		if not feature.startswith('with_'): continue
307		# don't overwrite manual arguments
308		if feature in vars.args: continue
309		# now activate
310		env[feature] = True
311
312# cache configure checks
313if 1:
314	autoconf = Autoconf(env)
315
316	if 'CFLAGS' in os.environ:
317		autoconf.env.Append(CCFLAGS = os.environ['CFLAGS'])
318		print(">> Appending custom build flags : " + os.environ['CFLAGS'])
319
320	if 'LDFLAGS' in os.environ:
321		autoconf.env.Append(LINKFLAGS = os.environ['LDFLAGS'])
322		print(">> Appending custom link flags : " + os.environ['LDFLAGS'])
323
324	if 'LIBS' in os.environ:
325		autoconf.env.Append(APPEND_LIBS = os.environ['LIBS'])
326		print(">> Appending custom libraries : " + os.environ['LIBS'])
327	else:
328		autoconf.env.Append(APPEND_LIBS = '')
329
330	autoconf.env.Append(
331		LIBBROTLI = '',
332		LIBBZ2 = '',
333		LIBCRYPT = '',
334		LIBCRYPTO = '',
335		LIBDBI = '',
336		LIBDEFLATE = '',
337		LIBDL = '',
338		LIBGNUTLS = '',
339		LIBGSSAPI_KRB5 = '',
340		LIBKRB5 = '',
341		LIBLBER = '',
342		LIBLDAP = '',
343		LIBLUA = '',
344		LIBMBEDTLS = '',
345		LIBMBEDX509 = '',
346		LIBMBEDCRYPTO = '',
347		LIBMYSQL = '',
348		LIBNSS = '',
349		LIBPAM = '',
350		LIBPCRE = '',
351		LIBPGSQL = '',
352		LIBSASL = '',
353		LIBSQLITE3 = '',
354		LIBSSL = '',
355		LIBSSLCRYPTO = '',
356		LIBUUID = '',
357		LIBWOLFSSL = '',
358		LIBX509 = '',
359		LIBXML2 = '',
360		LIBXXHASH = '',
361		LIBZ = '',
362		LIBZSTD = '',
363	)
364
365	autoconf.haveCHeaders([
366		'arpa/inet.h',
367		'crypt.h',
368		'dlfcn.h',
369		'fcntl.h',
370		'getopt.h',
371		'inttypes.h',
372		'linux/random.h',
373		'malloc.h',
374		'poll.h',
375		'pwd.h',
376		'stdint.h',
377		'stdlib.h',
378		'string.h',
379		'strings.h',
380		'sys/epoll.h',
381		'sys/inotify.h',
382		'sys/loadavg.h',
383		'sys/poll.h',
384		'sys/prctl.h',
385		'sys/procctl.h',
386		'sys/sendfile.h',
387		'sys/time.h',
388		'sys/wait.h',
389		'syslog.h',
390		'unistd.h',
391		'winsock2.h',
392
393		# "have" the last header if we include others before?
394		['sys/types.h', 'sys/time.h', 'sys/resource.h'],
395		['sys/types.h', 'netinet/in.h'],
396		['sys/types.h', 'sys/event.h'],
397		['sys/types.h', 'sys/mman.h'],
398		['sys/types.h', 'sys/select.h'],
399		['sys/types.h', 'sys/socket.h'],
400		['sys/types.h', 'sys/uio.h'],
401		['sys/types.h', 'sys/un.h'],
402	])
403
404	autoconf.haveFuncs([
405		'arc4random_buf',
406		'chroot',
407		'clock_gettime',
408		'copy_file_range',
409		'epoll_ctl',
410		'explicit_bzero',
411		'explicit_memset',
412		'fork',
413		'getloadavg',
414		'getrlimit',
415		'getuid',
416		'gmtime_r',
417		'inet_aton',
418		'inet_pton',
419		'issetugid',
420		'jrand48',
421		'kqueue',
422		'localtime_r',
423		'lstat',
424		'madvise',
425		'malloc_trim',
426		'mallopt',
427		'mempcpy',
428		'memset_s',
429		'mkostemp',
430		'mmap',
431		'pipe2',
432		'poll',
433		'pread',
434		'preadv',
435		'pwrite',
436		'pwritev',
437		'select',
438		'sendfile',
439		'sendfile64',
440		'sigaction',
441		'signal',
442		'splice',
443		'srandom',
444		'strerror_r',
445		'timegm',
446		'writev',
447	])
448	autoconf.haveFunc('getentropy', 'sys/random.h')
449	autoconf.haveFunc('getrandom', 'linux/random.h')
450	if re.compile("sunos|solaris").search(env['PLATFORM']):
451		autoconf.haveCHeaders([
452			'port.h',
453			'priv.h',
454			'sys/devpoll.h',
455			'sys/filio.h',
456		])
457		autoconf.haveFunc('port_create', 'port.h')
458		autoconf.haveFunc('sendfilev')
459		autoconf.haveFunc('setpflags', 'priv.h')
460
461	autoconf.haveTypes(Split('pid_t size_t off_t'))
462
463	# have crypt_r/crypt, and is -lcrypt needed?
464	if autoconf.CheckLib('crypt'):
465		autoconf.env.Append(
466			LIBCRYPT = 'crypt',
467		)
468		with autoconf.restoreEnvLibs():
469			autoconf.env['LIBS'] = ['crypt']
470			autoconf.haveFuncs(['crypt', 'crypt_r'])
471	else:
472		autoconf.haveFuncs(['crypt', 'crypt_r'])
473
474	if autoconf.CheckType('socklen_t', '#include <unistd.h>\n#include <sys/socket.h>\n#include <sys/types.h>'):
475		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SOCKLEN_T' ])
476
477	if autoconf.CheckType('struct sockaddr_storage', '#include <sys/socket.h>\n'):
478		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_SOCKADDR_STORAGE' ])
479
480	if autoconf.CheckLibWithHeader('elftc', 'libelftc.h', 'c', 'elftc_copyfile(0, 1);'):
481		autoconf.env.Append(
482			CPPFLAGS = [ '-DHAVE_ELFTC_COPYFILE' ],
483			LIBS = [ 'elftc' ],
484		)
485
486	if autoconf.CheckLibWithHeader('rt', 'time.h', 'c', 'clock_gettime(CLOCK_MONOTONIC, (struct timespec*)0);'):
487		autoconf.env.Append(
488			CPPFLAGS = [ '-DHAVE_CLOCK_GETTIME' ],
489			LIBS = [ 'rt' ],
490		)
491
492	if autoconf.CheckIPv6():
493		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_IPV6' ])
494
495	if autoconf.CheckWeakSymbols():
496		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_WEAK_SYMBOLS' ])
497
498	if autoconf.CheckGmtOffInStructTm():
499		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_TM_GMTOFF' ])
500
501	if autoconf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'):
502		autoconf.env.Append(LIBDL = 'dl')
503
504	if env['with_bzip2']:
505		if not autoconf.CheckLibWithHeader('bz2', 'bzlib.h', 'C'):
506			fail("Couldn't find bz2")
507		autoconf.env.Append(
508			CPPFLAGS = [ '-DHAVE_BZLIB_H', '-DHAVE_LIBBZ2' ],
509			LIBBZ2 = 'bz2',
510		)
511
512	if env['with_brotli']:
513		if not autoconf.CheckParseConfigForLib('LIBBROTLI', 'pkg-config --static --cflags --libs libbrotlienc'):
514			fail("Couldn't find libbrotlienc")
515		autoconf.env.Append(
516			CPPFLAGS = [ '-DHAVE_BROTLI_ENCODE_H', '-DHAVE_BROTLI' ],
517		)
518
519	if env['with_dbi']:
520		if not autoconf.CheckLibWithHeader('dbi', 'dbi/dbi.h', 'C'):
521			fail("Couldn't find dbi")
522		autoconf.env.Append(
523			CPPFLAGS = [ '-DHAVE_DBI' ],
524			LIBDBI = 'dbi',
525		)
526
527	if env['with_fam'] and not autoconf.CheckCHeader('sys/inotify.h'):
528		if not autoconf.CheckLibWithHeader('fam', 'fam.h', 'C'):
529			fail("Couldn't find fam")
530		autoconf.env.Append(
531			CPPFLAGS = [ '-DHAVE_FAM_H', '-DHAVE_LIBFAM' ],
532			LIBS = [ 'fam' ],
533		)
534		autoconf.haveFunc('FAMNoExists')
535
536	if env['with_libdeflate']:
537		if not autoconf.CheckLibWithHeader('deflate', 'libdeflate.h', 'C'):
538			fail("Couldn't find libdeflate")
539		autoconf.env.Append(
540			CPPFLAGS = [ '-DHAVE_LIBDEFLATE' ],
541			LIBDEFLATE = 'libdeflate',
542		)
543
544	if env['with_maxminddb']:
545		if not autoconf.CheckLibWithHeader('maxminddb', 'maxminddb.h', 'C'):
546			fail("Couldn't find maxminddb")
547		autoconf.env.Append(
548			CPPFLAGS = [ '-DHAVE_MAXMINDDB' ],
549			LIBMAXMINDDB = 'maxminddb',
550		)
551
552	if env['with_krb5']:
553		if not autoconf.CheckLibWithHeader('krb5', 'krb5.h', 'C'):
554			fail("Couldn't find krb5")
555		if not autoconf.CheckLibWithHeader('gssapi_krb5', 'gssapi/gssapi_krb5.h', 'C'):
556			fail("Couldn't find gssapi_krb5")
557		autoconf.env.Append(
558			CPPFLAGS = [ '-DHAVE_KRB5' ],
559			LIBKRB5 = 'krb5',
560			LIBGSSAPI_KRB5 = 'gssapi_krb5',
561		)
562
563	if env['with_ldap']:
564		if not autoconf.CheckLibWithHeader('ldap', 'ldap.h', 'C'):
565			fail("Couldn't find ldap")
566		if not autoconf.CheckLibWithHeader('lber', 'lber.h', 'C'):
567			fail("Couldn't find lber")
568		autoconf.env.Append(
569			CPPFLAGS = [
570				'-DHAVE_LDAP_H', '-DHAVE_LIBLDAP',
571				'-DHAVE_LBER_H', '-DHAVE_LIBLBER',
572			],
573			LIBLDAP = 'ldap',
574			LIBLBER = 'lber',
575		)
576
577	if env['with_lua']:
578		found_lua = False
579		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']:
580			print("Searching for lua: " + lua_name + " >= 5.0")
581			if autoconf.CheckParseConfigForLib('LIBLUA', "pkg-config '" + lua_name + " >= 5.0' --cflags --libs"):
582				autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LUA_H' ])
583				found_lua = True
584				break
585		if not found_lua:
586			fail("Couldn't find any lua implementation")
587
588	if env['with_mysql']:
589		mysql_config = autoconf.checkProgram('mysql', 'mysql_config')
590		if not autoconf.CheckParseConfigForLib('LIBMYSQL', mysql_config + ' --cflags --libs'):
591			fail("Couldn't find mysql")
592		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_MYSQL' ])
593
594	if env['with_nss']:
595		nss_config = autoconf.checkProgram('nss', 'nss-config')
596		if not autoconf.CheckParseConfigForLib('LIBNSS', nss_config + ' --cflags --libs'):
597			fail("Couldn't find NSS")
598		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_NSS3_NSS_H' ])
599
600	if env['with_openssl']:
601		if not autoconf.CheckLibWithHeader('ssl', 'openssl/ssl.h', 'C'):
602			fail("Couldn't find openssl")
603		autoconf.env.Append(
604			CPPFLAGS = [ '-DHAVE_OPENSSL_SSL_H', '-DHAVE_LIBSSL'],
605			LIBSSL = 'ssl',
606			LIBSSLCRYPTO = 'crypto',
607			LIBCRYPTO = 'crypto',
608		)
609
610	if env['with_wolfssl']:
611		if type(env['with_wolfssl']) is str:
612			autoconf.env.AppendUnique(
613				CPPPATH = [ env['with_wolfssl'] + '/include',
614					    env['with_wolfssl'] + '/include/wolfssl' ],
615				LIBPATH = [ env['with_wolfssl'] + '/lib' ],
616			)
617		if not autoconf.CheckLibWithHeader('wolfssl', 'wolfssl/ssl.h', 'C'):
618			fail("Couldn't find wolfssl")
619		autoconf.env.Append(
620			CPPFLAGS = [ '-DHAVE_WOLFSSL_SSL_H' ],
621			LIBWOLFSSL= 'wolfssl',
622			LIBCRYPTO = 'wolfssl',
623		)
624
625	if env['with_mbedtls']:
626		if not autoconf.CheckLibWithHeader('mbedtls', 'mbedtls/ssl.h', 'C'):
627			fail("Couldn't find mbedtls")
628		autoconf.env.Append(
629			CPPFLAGS = [ '-DHAVE_LIBMBEDCRYPTO' ],
630			LIBMBEDTLS = 'mbedtls',
631			LIBMBEDX509 = 'mbedx509',
632			LIBMBEDCRYPTO = 'mbedcrypto',
633			LIBCRYPTO = 'mbedcrypto',
634		)
635
636	if env['with_nettle']:
637		if not autoconf.CheckLibWithHeader('nettle', 'nettle/nettle-types.h', 'C'):
638			fail("Couldn't find Nettle")
639		autoconf.env.Append(
640			CPPFLAGS = [ '-DHAVE_NETTLE_NETTLE_TYPES_H' ],
641			LIBCRYPTO = 'nettle',
642		)
643
644	if env['with_gnutls']:
645		if not autoconf.CheckLibWithHeader('gnutls', 'gnutls/crypto.h', 'C'):
646			fail("Couldn't find gnutls")
647		autoconf.env.Append(
648			CPPFLAGS = [ '-DHAVE_GNUTLS_CRYPTO_H' ],
649			LIBGNUTLS = 'gnutls',
650		)
651		if not autoconf.env.exists('LIBCRYPTO'):
652			autoconf.env.Append(
653				LIBCRYPTO = 'gnutls',
654			)
655
656	if env['with_pam']:
657		if not autoconf.CheckLibWithHeader('pam', 'security/pam_appl.h', 'C'):
658			fail("Couldn't find pam")
659		autoconf.env.Append(
660			CPPFLAGS = [ '-DHAVE_PAM' ],
661			LIBPAM = 'pam',
662		)
663
664	if env['with_pcre2'] and not env['with_pcre']:
665		pcre2_config = autoconf.checkProgram('pcre2', 'pcre2-config')
666		if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre2_config + ' --cflags --libs8'):
667			fail("Couldn't find pcre2")
668		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE2_H', '-DHAVE_PCRE' ])
669	elif env['with_pcre']:
670		pcre_config = autoconf.checkProgram('pcre', 'pcre-config')
671		if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre_config + ' --cflags --libs'):
672			fail("Couldn't find pcre")
673		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE_H', '-DHAVE_PCRE' ])
674
675	if env['with_pgsql']:
676		if not autoconf.CheckParseConfigForLib('LIBPGSQL', 'pkg-config libpq --cflags --libs'):
677			fail("Couldn't find libpq")
678		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PGSQL' ])
679
680	if env['with_sasl']:
681		if not autoconf.CheckLibWithHeader('sasl2', 'sasl/sasl.h', 'C'):
682			fail("Couldn't find libsasl2")
683		autoconf.env.Append(
684			CPPFLAGS = [ '-DHAVE_SASL' ],
685			LIBSASL = 'sasl2',
686		)
687
688	if env['with_sqlite3']:
689		if not autoconf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'):
690			fail("Couldn't find sqlite3")
691		autoconf.env.Append(
692			CPPFLAGS = [ '-DHAVE_SQLITE3_H', '-DHAVE_LIBSQLITE3' ],
693			LIBSQLITE3 = 'sqlite3',
694		)
695
696	if env['with_uuid']:
697		if not autoconf.CheckLibWithHeader('uuid', 'uuid/uuid.h', 'C'):
698			fail("Couldn't find uuid")
699		autoconf.env.Append(
700			CPPFLAGS = [ '-DHAVE_UUID_UUID_H', '-DHAVE_LIBUUID' ],
701			LIBUUID = 'uuid',
702		)
703
704	if env['with_xml']:
705		xml2_config = autoconf.checkProgram('xml', 'xml2-config')
706		if not autoconf.CheckParseConfigForLib('LIBXML2', xml2_config + ' --cflags --libs'):
707			fail("Couldn't find xml2")
708		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LIBXML_H', '-DHAVE_LIBXML2' ])
709
710	if env['with_xxhash']:
711		if not autoconf.CheckLibWithHeader('xxhash', 'xxhash.h', 'C'):
712			fail("Couldn't find xxhash")
713		autoconf.env.Append(
714			CPPFLAGS = [ '-DHAVE_XXHASH_H' ],
715			LIBXXHASH = 'xxhash',
716		)
717
718	if env['with_zlib']:
719		if not autoconf.CheckLibWithHeader('z', 'zlib.h', 'C'):
720			fail("Couldn't find zlib")
721		autoconf.env.Append(
722			CPPFLAGS = [ '-DHAVE_ZLIB_H', '-DHAVE_LIBZ' ],
723			LIBZ = 'z',
724		)
725
726	if env['with_zstd']:
727		if not autoconf.CheckLibWithHeader('zstd', 'zstd.h', 'C'):
728			fail("Couldn't find zstd")
729		autoconf.env.Append(
730			CPPFLAGS = [ '-DHAVE_ZSTD_H', '-DHAVE_ZSTD' ],
731			LIBZSTD = 'zstd',
732		)
733
734	env = autoconf.Finish()
735
736if re.compile("cygwin|mingw|midipix").search(env['PLATFORM']):
737	env.Append(COMMON_LIB = 'bin')
738elif re.compile("darwin|aix").search(env['PLATFORM']):
739	env.Append(COMMON_LIB = 'lib')
740else:
741	env.Append(COMMON_LIB = False)
742
743versions = version.split('.')
744version_id = int(versions[0]) << 16 | int(versions[1]) << 8 | int(versions[2])
745env.Append(CPPFLAGS = [
746		'-DLIGHTTPD_VERSION_ID=' + hex(version_id),
747		'-DPACKAGE_NAME=\\"' + package + '\\"',
748		'-DPACKAGE_VERSION=\\"' + version + '\\"',
749		'-DLIBRARY_DIR="\\"${libdir}\\""',
750		] )
751
752SConscript('src/SConscript', exports = 'env', variant_dir = 'sconsbuild/build', duplicate = 0)
753SConscript('tests/SConscript', exports = 'env', variant_dir = 'sconsbuild/tests')
754