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