xref: /lighttpd1.4/SConstruct (revision aeba3144)
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.64'
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_maxminddb', 'enable MaxMind GeoIP2 support', 'no'),
248	BoolVariable('with_krb5', 'enable krb5 auth support', 'no'),
249	BoolVariable('with_ldap', 'enable ldap auth support', 'no'),
250	# with_libev not supported
251	# with_libunwind not supported
252	BoolVariable('with_lua', 'enable lua support', 'no'),
253	PackageVariable('with_mysql', 'enable mysql support', 'no'),
254	BoolVariable('with_openssl', 'enable openssl support', 'no'),
255	PackageVariable('with_gnutls', 'enable GnuTLS support', 'no'),
256	PackageVariable('with_mbedtls', 'enable mbedTLS support', 'no'),
257	PackageVariable('with_nss', 'enable NSS crypto support', 'no'),
258	PackageVariable('with_wolfssl', 'enable wolfSSL support', 'no'),
259	BoolVariable('with_nettle', 'enable Nettle support', 'no'),
260	BoolVariable('with_pam', 'enable PAM auth support', 'no'),
261	PackageVariable('with_pcre2', 'enable pcre2 support', 'yes'),
262	PackageVariable('with_pcre', 'enable pcre support', 'no'),
263	PackageVariable('with_pgsql', 'enable pgsql support', 'no'),
264	PackageVariable('with_sasl', 'enable SASL support', 'no'),
265	BoolVariable('with_sqlite3', 'enable sqlite3 support (required for webdav props)', 'no'),
266	BoolVariable('with_uuid', 'enable uuid support (required for webdav locks)', 'no'),
267	# with_valgrind not supported
268	# with_xattr not supported
269	PackageVariable('with_xml', 'enable xml support (required for webdav props)', 'no'),
270	BoolVariable('with_xxhash', 'build with system-provided xxhash', 'no'),
271	BoolVariable('with_zlib', 'enable deflate/gzip compression', 'no'),
272	BoolVariable('with_zstd', 'enable zstd compression', 'no'),
273
274	BoolVariable('with_all', 'enable all with_* features', 'no'),
275)
276
277env = Environment(
278	ENV = dict(os.environ),  # make sure we have a dict here so .Clone() works properly
279	variables = vars,
280	CPPPATH = Split('#sconsbuild/build')
281)
282
283env.Help(vars.GenerateHelpText(env))
284
285if env.subst('${CC}') != '':
286	env['CC'] = env.subst('${CC}')
287
288env['package'] = package
289env['version'] = version
290if env['CC'] == 'gcc':
291	## we need x-open 6 and bsd 4.3 features
292	env.Append(CCFLAGS = Split('-pipe -Wall -O2 -g -W -pedantic -Wunused -Wshadow -std=gnu99'))
293
294env.Append(CPPFLAGS = [
295	'-D_TIME_BITS=64',
296	'-D_FILE_OFFSET_BITS=64',
297	'-D_LARGEFILE_SOURCE',
298	'-D_LARGE_FILES',
299	'-D_GNU_SOURCE',
300])
301
302if env['with_all']:
303	for feature in vars.keys():
304		# only enable 'with_*' flags
305		if not feature.startswith('with_'): continue
306		# don't overwrite manual arguments
307		if feature in vars.args: continue
308		# now activate
309		env[feature] = True
310
311# cache configure checks
312if 1:
313	autoconf = Autoconf(env)
314
315	if 'CFLAGS' in os.environ:
316		autoconf.env.Append(CCFLAGS = os.environ['CFLAGS'])
317		print(">> Appending custom build flags : " + os.environ['CFLAGS'])
318
319	if 'LDFLAGS' in os.environ:
320		autoconf.env.Append(LINKFLAGS = os.environ['LDFLAGS'])
321		print(">> Appending custom link flags : " + os.environ['LDFLAGS'])
322
323	if 'LIBS' in os.environ:
324		autoconf.env.Append(APPEND_LIBS = os.environ['LIBS'])
325		print(">> Appending custom libraries : " + os.environ['LIBS'])
326	else:
327		autoconf.env.Append(APPEND_LIBS = '')
328
329	autoconf.env.Append(
330		LIBBROTLI = '',
331		LIBBZ2 = '',
332		LIBCRYPT = '',
333		LIBCRYPTO = '',
334		LIBDBI = '',
335		LIBDL = '',
336		LIBGNUTLS = '',
337		LIBGSSAPI_KRB5 = '',
338		LIBKRB5 = '',
339		LIBLBER = '',
340		LIBLDAP = '',
341		LIBLUA = '',
342		LIBMBEDTLS = '',
343		LIBMBEDX509 = '',
344		LIBMBEDCRYPTO = '',
345		LIBMYSQL = '',
346		LIBNSS = '',
347		LIBPAM = '',
348		LIBPCRE = '',
349		LIBPGSQL = '',
350		LIBSASL = '',
351		LIBSQLITE3 = '',
352		LIBSSL = '',
353		LIBSSLCRYPTO = '',
354		LIBUUID = '',
355		LIBWOLFSSL = '',
356		LIBX509 = '',
357		LIBXML2 = '',
358		LIBXXHASH = '',
359		LIBZ = '',
360		LIBZSTD = '',
361	)
362
363	autoconf.haveCHeaders([
364		'arpa/inet.h',
365		'crypt.h',
366		'dlfcn.h',
367		'fcntl.h',
368		'getopt.h',
369		'inttypes.h',
370		'linux/random.h',
371		'malloc.h',
372		'poll.h',
373		'pwd.h',
374		'stdint.h',
375		'stdlib.h',
376		'string.h',
377		'strings.h',
378		'sys/epoll.h',
379		'sys/inotify.h',
380		'sys/loadavg.h',
381		'sys/poll.h',
382		'sys/prctl.h',
383		'sys/procctl.h',
384		'sys/sendfile.h',
385		'sys/time.h',
386		'sys/wait.h',
387		'syslog.h',
388		'unistd.h',
389		'winsock2.h',
390
391		# "have" the last header if we include others before?
392		['sys/types.h', 'sys/time.h', 'sys/resource.h'],
393		['sys/types.h', 'netinet/in.h'],
394		['sys/types.h', 'sys/event.h'],
395		['sys/types.h', 'sys/mman.h'],
396		['sys/types.h', 'sys/select.h'],
397		['sys/types.h', 'sys/socket.h'],
398		['sys/types.h', 'sys/uio.h'],
399		['sys/types.h', 'sys/un.h'],
400	])
401
402	autoconf.haveFuncs([
403		'arc4random_buf',
404		'chroot',
405		'clock_gettime',
406		'copy_file_range',
407		'epoll_ctl',
408		'explicit_bzero',
409		'explicit_memset',
410		'fork',
411		'getloadavg',
412		'getrlimit',
413		'getuid',
414		'gmtime_r',
415		'inet_aton',
416		'inet_pton',
417		'issetugid',
418		'jrand48',
419		'kqueue',
420		'localtime_r',
421		'lstat',
422		'madvise',
423		'malloc_trim',
424		'mallopt',
425		'mempcpy',
426		'memset_s',
427		'mkostemp',
428		'mmap',
429		'pipe2',
430		'poll',
431		'pread',
432		'preadv',
433		'pwrite',
434		'pwritev',
435		'select',
436		'sendfile',
437		'sendfile64',
438		'sigaction',
439		'signal',
440		'splice',
441		'srandom',
442		'strerror_r',
443		'timegm',
444		'writev',
445	])
446	autoconf.haveFunc('getentropy', 'sys/random.h')
447	autoconf.haveFunc('getrandom', 'linux/random.h')
448	if re.compile("sunos|solaris").search(env['PLATFORM']):
449		autoconf.haveCHeaders([
450			'port.h',
451			'priv.h',
452			'sys/devpoll.h',
453			'sys/filio.h',
454		])
455		autoconf.haveFunc('port_create', 'port.h')
456		autoconf.haveFunc('sendfilev')
457		autoconf.haveFunc('setpflags', 'priv.h')
458
459	autoconf.haveTypes(Split('pid_t size_t off_t'))
460
461	# have crypt_r/crypt, and is -lcrypt needed?
462	if autoconf.CheckLib('crypt'):
463		autoconf.env.Append(
464			LIBCRYPT = 'crypt',
465		)
466		with autoconf.restoreEnvLibs():
467			autoconf.env['LIBS'] = ['crypt']
468			autoconf.haveFuncs(['crypt', 'crypt_r'])
469	else:
470		autoconf.haveFuncs(['crypt', 'crypt_r'])
471
472	if autoconf.CheckType('socklen_t', '#include <unistd.h>\n#include <sys/socket.h>\n#include <sys/types.h>'):
473		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SOCKLEN_T' ])
474
475	if autoconf.CheckType('struct sockaddr_storage', '#include <sys/socket.h>\n'):
476		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_SOCKADDR_STORAGE' ])
477
478	if autoconf.CheckLibWithHeader('elftc', 'libelftc.h', 'c', 'elftc_copyfile(0, 1);'):
479		autoconf.env.Append(
480			CPPFLAGS = [ '-DHAVE_ELFTC_COPYFILE' ],
481			LIBS = [ 'elftc' ],
482		)
483
484	if autoconf.CheckLibWithHeader('rt', 'time.h', 'c', 'clock_gettime(CLOCK_MONOTONIC, (struct timespec*)0);'):
485		autoconf.env.Append(
486			CPPFLAGS = [ '-DHAVE_CLOCK_GETTIME' ],
487			LIBS = [ 'rt' ],
488		)
489
490	if autoconf.CheckIPv6():
491		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_IPV6' ])
492
493	if autoconf.CheckWeakSymbols():
494		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_WEAK_SYMBOLS' ])
495
496	if autoconf.CheckGmtOffInStructTm():
497		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_TM_GMTOFF' ])
498
499	if autoconf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'):
500		autoconf.env.Append(LIBDL = 'dl')
501
502	if env['with_bzip2']:
503		if not autoconf.CheckLibWithHeader('bz2', 'bzlib.h', 'C'):
504			fail("Couldn't find bz2")
505		autoconf.env.Append(
506			CPPFLAGS = [ '-DHAVE_BZLIB_H', '-DHAVE_LIBBZ2' ],
507			LIBBZ2 = 'bz2',
508		)
509
510	if env['with_brotli']:
511		if not autoconf.CheckParseConfigForLib('LIBBROTLI', 'pkg-config --static --cflags --libs libbrotlienc'):
512			fail("Couldn't find libbrotlienc")
513		autoconf.env.Append(
514			CPPFLAGS = [ '-DHAVE_BROTLI_ENCODE_H', '-DHAVE_BROTLI' ],
515		)
516
517	if env['with_dbi']:
518		if not autoconf.CheckLibWithHeader('dbi', 'dbi/dbi.h', 'C'):
519			fail("Couldn't find dbi")
520		autoconf.env.Append(
521			CPPFLAGS = [ '-DHAVE_DBI' ],
522			LIBDBI = 'dbi',
523		)
524
525	if env['with_fam'] and not autoconf.CheckCHeader('sys/inotify.h'):
526		if not autoconf.CheckLibWithHeader('fam', 'fam.h', 'C'):
527			fail("Couldn't find fam")
528		autoconf.env.Append(
529			CPPFLAGS = [ '-DHAVE_FAM_H', '-DHAVE_LIBFAM' ],
530			LIBS = [ 'fam' ],
531		)
532		autoconf.haveFunc('FAMNoExists')
533
534	if env['with_maxminddb']:
535		if not autoconf.CheckLibWithHeader('maxminddb', 'maxminddb.h', 'C'):
536			fail("Couldn't find maxminddb")
537		autoconf.env.Append(
538			CPPFLAGS = [ '-DHAVE_MAXMINDDB' ],
539			LIBMAXMINDDB = 'maxminddb',
540		)
541
542	if env['with_krb5']:
543		if not autoconf.CheckLibWithHeader('krb5', 'krb5.h', 'C'):
544			fail("Couldn't find krb5")
545		if not autoconf.CheckLibWithHeader('gssapi_krb5', 'gssapi/gssapi_krb5.h', 'C'):
546			fail("Couldn't find gssapi_krb5")
547		autoconf.env.Append(
548			CPPFLAGS = [ '-DHAVE_KRB5' ],
549			LIBKRB5 = 'krb5',
550			LIBGSSAPI_KRB5 = 'gssapi_krb5',
551		)
552
553	if env['with_ldap']:
554		if not autoconf.CheckLibWithHeader('ldap', 'ldap.h', 'C'):
555			fail("Couldn't find ldap")
556		if not autoconf.CheckLibWithHeader('lber', 'lber.h', 'C'):
557			fail("Couldn't find lber")
558		autoconf.env.Append(
559			CPPFLAGS = [
560				'-DHAVE_LDAP_H', '-DHAVE_LIBLDAP',
561				'-DHAVE_LBER_H', '-DHAVE_LIBLBER',
562			],
563			LIBLDAP = 'ldap',
564			LIBLBER = 'lber',
565		)
566
567	if env['with_lua']:
568		found_lua = False
569		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']:
570			print("Searching for lua: " + lua_name + " >= 5.0")
571			if autoconf.CheckParseConfigForLib('LIBLUA', "pkg-config '" + lua_name + " >= 5.0' --cflags --libs"):
572				autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LUA_H' ])
573				found_lua = True
574				break
575		if not found_lua:
576			fail("Couldn't find any lua implementation")
577
578	if env['with_mysql']:
579		mysql_config = autoconf.checkProgram('mysql', 'mysql_config')
580		if not autoconf.CheckParseConfigForLib('LIBMYSQL', mysql_config + ' --cflags --libs'):
581			fail("Couldn't find mysql")
582		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_MYSQL' ])
583
584	if env['with_nss']:
585		nss_config = autoconf.checkProgram('nss', 'nss-config')
586		if not autoconf.CheckParseConfigForLib('LIBNSS', nss_config + ' --cflags --libs'):
587			fail("Couldn't find NSS")
588		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_NSS3_NSS_H' ])
589
590	if env['with_openssl']:
591		if not autoconf.CheckLibWithHeader('ssl', 'openssl/ssl.h', 'C'):
592			fail("Couldn't find openssl")
593		autoconf.env.Append(
594			CPPFLAGS = [ '-DHAVE_OPENSSL_SSL_H', '-DHAVE_LIBSSL'],
595			LIBSSL = 'ssl',
596			LIBSSLCRYPTO = 'crypto',
597			LIBCRYPTO = 'crypto',
598		)
599
600	if env['with_wolfssl']:
601		if type(env['with_wolfssl']) is str:
602			autoconf.env.AppendUnique(
603				CPPPATH = [ env['with_wolfssl'] + '/include',
604					    env['with_wolfssl'] + '/include/wolfssl' ],
605				LIBPATH = [ env['with_wolfssl'] + '/lib' ],
606			)
607		if not autoconf.CheckLibWithHeader('wolfssl', 'wolfssl/ssl.h', 'C'):
608			fail("Couldn't find wolfssl")
609		autoconf.env.Append(
610			CPPFLAGS = [ '-DHAVE_WOLFSSL_SSL_H' ],
611			LIBWOLFSSL= 'wolfssl',
612			LIBCRYPTO = 'wolfssl',
613		)
614
615	if env['with_mbedtls']:
616		if not autoconf.CheckLibWithHeader('mbedtls', 'mbedtls/ssl.h', 'C'):
617			fail("Couldn't find mbedtls")
618		autoconf.env.Append(
619			CPPFLAGS = [ '-DHAVE_LIBMBEDCRYPTO' ],
620			LIBMBEDTLS = 'mbedtls',
621			LIBMBEDX509 = 'mbedx509',
622			LIBMBEDCRYPTO = 'mbedcrypto',
623			LIBCRYPTO = 'mbedcrypto',
624		)
625
626	if env['with_nettle']:
627		if not autoconf.CheckLibWithHeader('nettle', 'nettle/nettle-types.h', 'C'):
628			fail("Couldn't find Nettle")
629		autoconf.env.Append(
630			CPPFLAGS = [ '-DHAVE_NETTLE_NETTLE_TYPES_H' ],
631			LIBCRYPTO = 'nettle',
632		)
633
634	if env['with_gnutls']:
635		if not autoconf.CheckLibWithHeader('gnutls', 'gnutls/crypto.h', 'C'):
636			fail("Couldn't find gnutls")
637		autoconf.env.Append(
638			CPPFLAGS = [ '-DHAVE_GNUTLS_CRYPTO_H' ],
639			LIBGNUTLS = 'gnutls',
640		)
641		if not autoconf.env.exists('LIBCRYPTO'):
642			autoconf.env.Append(
643				LIBCRYPTO = 'gnutls',
644			)
645
646	if env['with_pam']:
647		if not autoconf.CheckLibWithHeader('pam', 'security/pam_appl.h', 'C'):
648			fail("Couldn't find pam")
649		autoconf.env.Append(
650			CPPFLAGS = [ '-DHAVE_PAM' ],
651			LIBPAM = 'pam',
652		)
653
654	if env['with_pcre2'] and not env['with_pcre']:
655		pcre2_config = autoconf.checkProgram('pcre2', 'pcre2-config')
656		if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre2_config + ' --cflags --libs8'):
657			fail("Couldn't find pcre2")
658		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE2_H', '-DHAVE_PCRE' ])
659	elif env['with_pcre']:
660		pcre_config = autoconf.checkProgram('pcre', 'pcre-config')
661		if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre_config + ' --cflags --libs'):
662			fail("Couldn't find pcre")
663		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE_H', '-DHAVE_PCRE' ])
664
665	if env['with_pgsql']:
666		if not autoconf.CheckParseConfigForLib('LIBPGSQL', 'pkg-config libpq --cflags --libs'):
667			fail("Couldn't find libpq")
668		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PGSQL' ])
669
670	if env['with_sasl']:
671		if not autoconf.CheckLibWithHeader('sasl2', 'sasl/sasl.h', 'C'):
672			fail("Couldn't find libsasl2")
673		autoconf.env.Append(
674			CPPFLAGS = [ '-DHAVE_SASL' ],
675			LIBSASL = 'sasl2',
676		)
677
678	if env['with_sqlite3']:
679		if not autoconf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'):
680			fail("Couldn't find sqlite3")
681		autoconf.env.Append(
682			CPPFLAGS = [ '-DHAVE_SQLITE3_H', '-DHAVE_LIBSQLITE3' ],
683			LIBSQLITE3 = 'sqlite3',
684		)
685
686	if env['with_uuid']:
687		if not autoconf.CheckLibWithHeader('uuid', 'uuid/uuid.h', 'C'):
688			fail("Couldn't find uuid")
689		autoconf.env.Append(
690			CPPFLAGS = [ '-DHAVE_UUID_UUID_H', '-DHAVE_LIBUUID' ],
691			LIBUUID = 'uuid',
692		)
693
694	if env['with_xml']:
695		xml2_config = autoconf.checkProgram('xml', 'xml2-config')
696		if not autoconf.CheckParseConfigForLib('LIBXML2', xml2_config + ' --cflags --libs'):
697			fail("Couldn't find xml2")
698		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LIBXML_H', '-DHAVE_LIBXML2' ])
699
700	if env['with_xxhash']:
701		if not autoconf.CheckLibWithHeader('xxhash', 'xxhash.h', 'C'):
702			fail("Couldn't find xxhash")
703		autoconf.env.Append(
704			CPPFLAGS = [ '-DHAVE_XXHASH_H' ],
705			LIBXXHASH = 'xxhash',
706		)
707
708	if env['with_zlib']:
709		if not autoconf.CheckLibWithHeader('z', 'zlib.h', 'C'):
710			fail("Couldn't find zlib")
711		autoconf.env.Append(
712			CPPFLAGS = [ '-DHAVE_ZLIB_H', '-DHAVE_LIBZ' ],
713			LIBZ = 'z',
714		)
715
716	if env['with_zstd']:
717		if not autoconf.CheckLibWithHeader('zstd', 'zstd.h', 'C'):
718			fail("Couldn't find zstd")
719		autoconf.env.Append(
720			CPPFLAGS = [ '-DHAVE_ZSTD_H', '-DHAVE_ZSTD' ],
721			LIBZSTD = 'zstd',
722		)
723
724	env = autoconf.Finish()
725
726if re.compile("cygwin|mingw|midipix").search(env['PLATFORM']):
727	env.Append(COMMON_LIB = 'bin')
728elif re.compile("darwin|aix").search(env['PLATFORM']):
729	env.Append(COMMON_LIB = 'lib')
730else:
731	env.Append(COMMON_LIB = False)
732
733versions = version.split('.')
734version_id = int(versions[0]) << 16 | int(versions[1]) << 8 | int(versions[2])
735env.Append(CPPFLAGS = [
736		'-DLIGHTTPD_VERSION_ID=' + hex(version_id),
737		'-DPACKAGE_NAME=\\"' + package + '\\"',
738		'-DPACKAGE_VERSION=\\"' + version + '\\"',
739		'-DLIBRARY_DIR="\\"${libdir}\\""',
740		] )
741
742SConscript('src/SConscript', exports = 'env', variant_dir = 'sconsbuild/build', duplicate = 0)
743SConscript('tests/SConscript', exports = 'env', variant_dir = 'sconsbuild/tests')
744