xref: /lighttpd1.4/SConstruct (revision 2d94d56f)
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.59'
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 Exception as e:
144			print(e.message, file=sys.stderr)
145			return False
146
147	def CheckParseConfigForLib(self, lib, *args, **kw):
148		with self.restoreEnvLibs():
149			self.env['LIBS'] = []
150			if not self.CheckParseConfig(*args, **kw):
151				return False
152			self.env.Append(**{lib: self.env['LIBS']})
153			return True
154
155	@staticmethod
156	def __checkGmtOffInStructTm(context):
157		source = """
158#include <time.h>
159int main() {
160	struct tm a;
161	a.tm_gmtoff = 0;
162	return 0;
163}
164"""
165		context.Message('Checking for tm_gmtoff in struct tm...')
166		result = context.TryLink(source, '.c')
167		context.Result(result)
168
169		return result
170
171	@staticmethod
172	def __checkIPv6(context):
173		source = """
174#include <sys/types.h>
175#include <sys/socket.h>
176#include <netinet/in.h>
177
178int main() {
179	struct sockaddr_in6 s; struct in6_addr t=in6addr_any; int i=AF_INET6; s; t.s6_addr[0] = 0;
180	return 0;
181}
182"""
183		context.Message('Checking for IPv6 support...')
184		result = context.TryLink(source, '.c')
185		context.Result(result)
186
187		return result
188
189	@staticmethod
190	def __checkWeakSymbols(context):
191		source = """
192__attribute__((weak)) void __dummy(void *x) { }
193int main() {
194	void *x;
195	__dummy(x);
196}
197"""
198		context.Message('Checking for weak symbol support...')
199		result = context.TryLink(source, '.c')
200		context.Result(result)
201
202		return result
203
204	def checkProgram(self, withname, progname):
205		withname = 'with_' + withname
206		binpath = None
207
208		if self.env[withname] != 1:
209			binpath = self.env[withname]
210		else:
211			prog = self.env.Detect(progname)
212			if prog:
213				binpath = self.env.WhereIs(prog)
214
215		if binpath:
216			mode = os.stat(binpath)[ST_MODE]
217			if S_ISDIR(mode):
218				fail("* error: path `%s' is a directory" % (binpath))
219			if not S_ISREG(mode):
220				fail("* error: path `%s' is not a file or not exists" % (binpath))
221
222		if not binpath:
223			fail("* error: can't find program `%s'" % (progname))
224
225		return binpath
226
227VariantDir('sconsbuild/build', 'src', duplicate = 0)
228VariantDir('sconsbuild/tests', 'tests', duplicate = 0)
229
230vars = Variables()
231vars.AddVariables(
232	('prefix', 'prefix', '/usr/local'),
233	('bindir', 'binary directory', '${prefix}/bin'),
234	('sbindir', 'binary directory', '${prefix}/sbin'),
235	('libdir', 'library directory', '${prefix}/lib'),
236	PathVariable('CC', 'path to the c-compiler', None),
237	BoolVariable('build_dynamic', 'enable dynamic build', 'yes'),
238	BoolVariable('build_static', 'enable static build', 'no'),
239	BoolVariable('build_fullstatic', 'enable fullstatic build', 'no'),
240
241	BoolVariable('with_bzip2', 'enable bzip2 compression', 'no'),
242	BoolVariable('with_brotli', 'enable brotli compression', 'no'),
243	PackageVariable('with_dbi', 'enable dbi support', 'no'),
244	BoolVariable('with_fam', 'enable FAM/gamin support', 'no'),
245	BoolVariable('with_gdbm', 'enable gdbm support', 'no'),
246	BoolVariable('with_geoip', 'enable GeoIP 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 for mod_cml', 'no'),
253	BoolVariable('with_memcached', 'enable memcached 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_pcre', 'enable pcre support', 'yes'),
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('-Wall -O2 -g -W -pedantic -Wunused -Wshadow -std=gnu99'))
293
294env.Append(CPPFLAGS = [
295	'-D_FILE_OFFSET_BITS=64',
296	'-D_LARGEFILE_SOURCE',
297	'-D_LARGE_FILES',
298	'-D_GNU_SOURCE',
299])
300
301if env['with_all']:
302	for feature in vars.keys():
303		# only enable 'with_*' flags
304		if not feature.startswith('with_'): continue
305		# don't overwrite manual arguments
306		if feature in vars.args: continue
307		# now activate
308		env[feature] = True
309
310# cache configure checks
311if 1:
312	autoconf = Autoconf(env)
313
314	if 'CFLAGS' in os.environ:
315		autoconf.env.Append(CCFLAGS = os.environ['CFLAGS'])
316		print(">> Appending custom build flags : " + os.environ['CFLAGS'])
317
318	if 'LDFLAGS' in os.environ:
319		autoconf.env.Append(LINKFLAGS = os.environ['LDFLAGS'])
320		print(">> Appending custom link flags : " + os.environ['LDFLAGS'])
321
322	if 'LIBS' in os.environ:
323		autoconf.env.Append(APPEND_LIBS = os.environ['LIBS'])
324		print(">> Appending custom libraries : " + os.environ['LIBS'])
325	else:
326		autoconf.env.Append(APPEND_LIBS = '')
327
328	autoconf.env.Append(
329		LIBBROTLI = '',
330		LIBBZ2 = '',
331		LIBCRYPT = '',
332		LIBCRYPTO = '',
333		LIBDBI = '',
334		LIBDL = '',
335		LIBGDBM = '',
336		LIBGNUTLS = '',
337		LIBGSSAPI_KRB5 = '',
338		LIBKRB5 = '',
339		LIBLBER = '',
340		LIBLDAP = '',
341		LIBLUA = '',
342		LIBMBEDTLS = '',
343		LIBMBEDX509 = '',
344		LIBMBEDCRYPTO = '',
345		LIBMEMCACHED = '',
346		LIBMYSQL = '',
347		LIBNSS = '',
348		LIBPAM = '',
349		LIBPCRE = '',
350		LIBPGSQL = '',
351		LIBSASL = '',
352		LIBSQLITE3 = '',
353		LIBSSL = '',
354		LIBSSLCRYPTO = '',
355		LIBUUID = '',
356		LIBWOLFSSL = '',
357		LIBX509 = '',
358		LIBXML2 = '',
359		LIBXXHASH = '',
360		LIBZ = '',
361		LIBZSTD = '',
362	)
363
364	autoconf.haveCHeaders([
365		'arpa/inet.h',
366		'crypt.h',
367		'fcntl.h',
368		'getopt.h',
369		'inttypes.h',
370		'linux/random.h',
371		'poll.h',
372		'pwd.h',
373		'stdint.h',
374		'stdlib.h',
375		'string.h',
376		'strings.h',
377		'sys/devpoll.h',
378		'sys/epoll.h',
379		'sys/filio.h',
380		'sys/inotify.h',
381		'sys/loadavg.h',
382		'sys/poll.h',
383		'sys/port.h',
384		'sys/prctl.h',
385		'sys/sendfile.h',
386		'sys/time.h',
387		'sys/wait.h',
388		'syslog.h',
389		'unistd.h',
390		'winsock2.h',
391
392		# "have" the last header if we include others before?
393		['sys/types.h', 'sys/time.h', 'sys/resource.h'],
394		['sys/types.h', 'netinet/in.h'],
395		['sys/types.h', 'sys/event.h'],
396		['sys/types.h', 'sys/mman.h'],
397		['sys/types.h', 'sys/select.h'],
398		['sys/types.h', 'sys/socket.h'],
399		['sys/types.h', 'sys/uio.h'],
400		['sys/types.h', 'sys/un.h'],
401	])
402
403	autoconf.haveFuncs([
404		'arc4random_buf',
405		'chroot',
406		'clock_gettime',
407		'copy_file_range',
408		'dup2',
409		'epoll_ctl',
410		'explicit_bzero',
411		'explicit_memset',
412		'fork',
413		'getcwd',
414		'gethostbyname',
415		'getloadavg',
416		'getopt',
417		'getrlimit',
418		'getuid',
419		'inet_aton',
420		'inet_ntop',
421		'inet_pton',
422		'issetugid',
423		'jrand48',
424		'kqueue',
425		'localtime_r',
426		'lstat',
427		'madvise',
428		'memset_s',
429		'memset',
430		'mmap',
431		'munmap',
432		'pathconf',
433		'pipe2',
434		'poll',
435		'port_create',
436		'posix_fadvise',
437		'prctl',
438		'select',
439		'send_file',
440		'sendfile',
441		'sendfile64',
442		'sigaction',
443		'signal',
444		'socket',
445		'srandom',
446		'stat',
447		'strchr',
448		'strdup',
449		'strerror',
450		'strftime',
451		'strstr',
452		'strtol',
453		'timegm',
454		'writev',
455	])
456	autoconf.haveFunc('getentropy', 'sys/random.h')
457	autoconf.haveFunc('getrandom', 'linux/random.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			CPPFLAGS = [ '-DHAVE_LIBCRYPT' ],
465			LIBCRYPT = 'crypt',
466		)
467		with autoconf.restoreEnvLibs():
468			autoconf.env['LIBS'] = ['crypt']
469			autoconf.haveFuncs(['crypt', 'crypt_r'])
470	else:
471		autoconf.haveFuncs(['crypt', 'crypt_r'])
472
473	if autoconf.CheckType('socklen_t', '#include <unistd.h>\n#include <sys/socket.h>\n#include <sys/types.h>'):
474		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SOCKLEN_T' ])
475
476	if autoconf.CheckType('struct sockaddr_storage', '#include <sys/socket.h>\n'):
477		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_SOCKADDR_STORAGE' ])
478
479	if autoconf.CheckLibWithHeader('elftc', 'libelftc.h', 'c', 'elftc_copyfile(0, 1);'):
480		autoconf.env.Append(
481			CPPFLAGS = [ '-DHAVE_ELFTC_COPYFILE' ],
482			LIBS = [ 'elftc' ],
483		)
484
485	if autoconf.CheckLibWithHeader('rt', 'time.h', 'c', 'clock_gettime(CLOCK_MONOTONIC, (struct timespec*)0);'):
486		autoconf.env.Append(
487			CPPFLAGS = [ '-DHAVE_CLOCK_GETTIME' ],
488			LIBS = [ 'rt' ],
489		)
490
491	if autoconf.CheckIPv6():
492		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_IPV6' ])
493
494	if autoconf.CheckWeakSymbols():
495		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_WEAK_SYMBOLS' ])
496
497	if autoconf.CheckGmtOffInStructTm():
498		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_TM_GMTOFF' ])
499
500	if autoconf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'):
501		autoconf.env.Append(LIBDL = 'dl')
502
503	if env['with_bzip2']:
504		if not autoconf.CheckLibWithHeader('bz2', 'bzlib.h', 'C'):
505			fail("Couldn't find bz2")
506		autoconf.env.Append(
507			CPPFLAGS = [ '-DHAVE_BZLIB_H', '-DHAVE_LIBBZ2' ],
508			LIBBZ2 = 'bz2',
509		)
510
511	if env['with_brotli']:
512		if not autoconf.CheckParseConfigForLib('LIBBROTLI', 'pkg-config --static --cflags --libs libbrotlienc'):
513			fail("Couldn't find libbrotlienc")
514		autoconf.env.Append(
515			CPPFLAGS = [ '-DHAVE_BROTLI_ENCODE_H', '-DHAVE_BROTLI' ],
516		)
517
518	if env['with_dbi']:
519		if not autoconf.CheckLibWithHeader('dbi', 'dbi/dbi.h', 'C'):
520			fail("Couldn't find dbi")
521		autoconf.env.Append(
522			CPPFLAGS = [ '-DHAVE_DBI_H', '-DHAVE_LIBDBI' ],
523			LIBDBI = 'dbi',
524		)
525
526	if env['with_fam'] and not self.CheckCHeader('sys/inotify.h'):
527		if not autoconf.CheckLibWithHeader('fam', 'fam.h', 'C'):
528			fail("Couldn't find fam")
529		autoconf.env.Append(
530			CPPFLAGS = [ '-DHAVE_FAM_H', '-DHAVE_LIBFAM' ],
531			LIBS = [ 'fam' ],
532		)
533		autoconf.haveFunc('FAMNoExists')
534
535	if env['with_gdbm']:
536		if not autoconf.CheckLibWithHeader('gdbm', 'gdbm.h', 'C'):
537			fail("Couldn't find gdbm")
538		autoconf.env.Append(
539			CPPFLAGS = [ '-DHAVE_GDBM_H', '-DHAVE_GDBM' ],
540			LIBGDBM = 'gdbm',
541		)
542
543	if env['with_geoip']:
544		if not autoconf.CheckLibWithHeader('GeoIP', 'GeoIP.h', 'C'):
545			fail("Couldn't find geoip")
546		autoconf.env.Append(
547			CPPFLAGS = [ '-DHAVE_GEOIP' ],
548			LIBGEOIP = 'GeoIP',
549		)
550
551	if env['with_maxminddb']:
552		if not autoconf.CheckLibWithHeader('maxminddb', 'maxminddb.h', 'C'):
553			fail("Couldn't find maxminddb")
554		autoconf.env.Append(
555			CPPFLAGS = [ '-DHAVE_MAXMINDDB' ],
556			LIBMAXMINDDB = 'maxminddb',
557		)
558
559	if env['with_krb5']:
560		if not autoconf.CheckLibWithHeader('krb5', 'krb5.h', 'C'):
561			fail("Couldn't find krb5")
562		if not autoconf.CheckLibWithHeader('gssapi_krb5', 'gssapi/gssapi_krb5.h', 'C'):
563			fail("Couldn't find gssapi_krb5")
564		autoconf.env.Append(
565			CPPFLAGS = [ '-DHAVE_KRB5' ],
566			LIBKRB5 = 'krb5',
567			LIBGSSAPI_KRB5 = 'gssapi_krb5',
568		)
569
570	if env['with_ldap']:
571		if not autoconf.CheckLibWithHeader('ldap', 'ldap.h', 'C'):
572			fail("Couldn't find ldap")
573		if not autoconf.CheckLibWithHeader('lber', 'lber.h', 'C'):
574			fail("Couldn't find lber")
575		autoconf.env.Append(
576			CPPFLAGS = [
577				'-DHAVE_LDAP_H', '-DHAVE_LIBLDAP',
578				'-DHAVE_LBER_H', '-DHAVE_LIBLBER',
579			],
580			LIBLDAP = 'ldap',
581			LIBLBER = 'lber',
582		)
583
584	if env['with_lua']:
585		found_lua = False
586		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']:
587			print("Searching for lua: " + lua_name + " >= 5.0")
588			if autoconf.CheckParseConfigForLib('LIBLUA', "pkg-config '" + lua_name + " >= 5.0' --cflags --libs"):
589				autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LUA_H' ])
590				found_lua = True
591				break
592		if not found_lua:
593			fail("Couldn't find any lua implementation")
594
595	if env['with_memcached']:
596		if not autoconf.CheckLibWithHeader('memcached', 'libmemcached/memcached.h', 'C'):
597			fail("Couldn't find memcached")
598		autoconf.env.Append(
599			CPPFLAGS = [ '-DUSE_MEMCACHED' ],
600			LIBMEMCACHED = 'memcached',
601		)
602
603	if env['with_mysql']:
604		mysql_config = autoconf.checkProgram('mysql', 'mysql_config')
605		if not autoconf.CheckParseConfigForLib('LIBMYSQL', mysql_config + ' --cflags --libs'):
606			fail("Couldn't find mysql")
607		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_MYSQL_H', '-DHAVE_LIBMYSQL' ])
608
609	if env['with_nss']:
610		nss_config = autoconf.checkProgram('nss', 'nss-config')
611		if not autoconf.CheckParseConfigForLib('LIBNSS', nss_config + ' --cflags --libs'):
612			fail("Couldn't find NSS")
613		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_NSS3_NSS_H' ])
614
615	if env['with_openssl']:
616		if not autoconf.CheckLibWithHeader('ssl', 'openssl/ssl.h', 'C'):
617			fail("Couldn't find openssl")
618		autoconf.env.Append(
619			CPPFLAGS = [ '-DHAVE_OPENSSL_SSL_H', '-DHAVE_LIBSSL'],
620			LIBSSL = 'ssl',
621			LIBSSLCRYPTO = 'crypto',
622			LIBCRYPTO = 'crypto',
623		)
624
625	if env['with_wolfssl']:
626		if type(env['with_wolfssl']) is str:
627			autoconf.env.AppendUnique(
628				CPPPATH = [ env['with_wolfssl'] + '/include',
629					    env['with_wolfssl'] + '/include/wolfssl' ],
630				LIBPATH = [ env['with_wolfssl'] + '/lib' ],
631			)
632		if not autoconf.CheckLibWithHeader('wolfssl', 'wolfssl/ssl.h', 'C'):
633			fail("Couldn't find wolfssl")
634		autoconf.env.Append(
635			CPPFLAGS = [ '-DHAVE_WOLFSSL_SSL_H' ],
636			LIBWOLFSSL= 'wolfssl',
637			LIBCRYPTO = 'wolfssl',
638		)
639
640	if env['with_mbedtls']:
641		if not autoconf.CheckLibWithHeader('mbedtls', 'mbedtls/ssl.h', 'C'):
642			fail("Couldn't find mbedtls")
643		autoconf.env.Append(
644			CPPFLAGS = [ '-DHAVE_LIBMBEDCRYPTO' ],
645			LIBMBEDTLS = 'mbedtls',
646			LIBMBEDX509 = 'mbedx509',
647			LIBMBEDCRYPTO = 'mbedcrypto',
648			LIBCRYPTO = 'mbedcrypto',
649		)
650
651	if env['with_nettle']:
652		if not autoconf.CheckLibWithHeader('nettle', 'nettle/nettle-types.h', 'C'):
653			fail("Couldn't find Nettle")
654		autoconf.env.Append(
655			CPPFLAGS = [ '-DHAVE_NETTLE_NETTLE_TYPES_H' ],
656			LIBCRYPTO = 'nettle',
657		)
658
659	if env['with_gnutls']:
660		if not autoconf.CheckLibWithHeader('gnutls', 'gnutls/crypto.h', 'C'):
661			fail("Couldn't find gnutls")
662		autoconf.env.Append(
663			CPPFLAGS = [ '-DHAVE_GNUTLS_CRYPTO_H' ],
664			LIBGNUTLS = 'gnutls',
665		)
666		if not autoconf.env.exists('LIBCRYPTO'):
667			autoconf.env.Append(
668				LIBCRYPTO = 'gnutls',
669			)
670
671	if env['with_pam']:
672		if not autoconf.CheckLibWithHeader('pam', 'security/pam_appl.h', 'C'):
673			fail("Couldn't find pam")
674		autoconf.env.Append(
675			CPPFLAGS = [ '-DHAVE_PAM' ],
676			LIBPAM = 'pam',
677		)
678
679	if env['with_pcre']:
680		pcre_config = autoconf.checkProgram('pcre', 'pcre-config')
681		if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre_config + ' --cflags --libs'):
682			fail("Couldn't find pcre")
683		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE_H', '-DHAVE_LIBPCRE' ])
684
685	if env['with_pgsql']:
686		if not autoconf.CheckParseConfigForLib('LIBPGSQL', 'pkg-config libpq --cflags --libs'):
687			fail("Couldn't find libpq")
688		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PGSQL_H', '-DHAVE_LIBPGSQL' ])
689
690	if env['with_sasl']:
691		if not autoconf.CheckLibWithHeader('sasl2', 'sasl/sasl.h', 'C'):
692			fail("Couldn't find libsasl2")
693		autoconf.env.Append(
694			CPPFLAGS = [ '-DHAVE_SASL' ],
695			LIBSASL = 'sasl2',
696		)
697
698	if env['with_sqlite3']:
699		if not autoconf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'):
700			fail("Couldn't find sqlite3")
701		autoconf.env.Append(
702			CPPFLAGS = [ '-DHAVE_SQLITE3_H', '-DHAVE_LIBSQLITE3' ],
703			LIBSQLITE3 = 'sqlite3',
704		)
705
706	if env['with_uuid']:
707		if not autoconf.CheckLibWithHeader('uuid', 'uuid/uuid.h', 'C'):
708			fail("Couldn't find uuid")
709		autoconf.env.Append(
710			CPPFLAGS = [ '-DHAVE_UUID_UUID_H', '-DHAVE_LIBUUID' ],
711			LIBUUID = 'uuid',
712		)
713
714	if env['with_xml']:
715		xml2_config = autoconf.checkProgram('xml', 'xml2-config')
716		if not autoconf.CheckParseConfigForLib('LIBXML2', xml2_config + ' --cflags --libs'):
717			fail("Couldn't find xml2")
718		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LIBXML_H', '-DHAVE_LIBXML2' ])
719
720	if env['with_xxhash']:
721		if not autoconf.CheckLibWithHeader('xxhash', 'xxhash.h', 'C'):
722			fail("Couldn't find xxhash")
723		autoconf.env.Append(
724			CPPFLAGS = [ '-DHAVE_XXHASH_H' ],
725			LIBXXHASH = 'xxhash',
726		)
727
728	if env['with_zlib']:
729		if not autoconf.CheckLibWithHeader('z', 'zlib.h', 'C'):
730			fail("Couldn't find zlib")
731		autoconf.env.Append(
732			CPPFLAGS = [ '-DHAVE_ZLIB_H', '-DHAVE_LIBZ' ],
733			LIBZ = 'z',
734		)
735
736	if env['with_zstd']:
737		if not autoconf.CheckLibWithHeader('zstd', 'zstd.h', 'C'):
738			fail("Couldn't find zstd")
739		autoconf.env.Append(
740			CPPFLAGS = [ '-DHAVE_ZSTD_H', '-DHAVE_ZSTD' ],
741			LIBZSTD = 'zstd',
742		)
743
744	env = autoconf.Finish()
745
746if re.compile("cygwin|mingw|midipix").search(env['PLATFORM']):
747	env.Append(COMMON_LIB = 'bin')
748elif re.compile("darwin|aix").search(env['PLATFORM']):
749	env.Append(COMMON_LIB = 'lib')
750else:
751	env.Append(COMMON_LIB = False)
752
753versions = version.split('.')
754version_id = int(versions[0]) << 16 | int(versions[1]) << 8 | int(versions[2])
755env.Append(CPPFLAGS = [
756		'-DLIGHTTPD_VERSION_ID=' + hex(version_id),
757		'-DPACKAGE_NAME=\\"' + package + '\\"',
758		'-DPACKAGE_VERSION=\\"' + version + '\\"',
759		'-DLIBRARY_DIR="\\"${libdir}\\""',
760		] )
761
762SConscript('src/SConscript', exports = 'env', variant_dir = 'sconsbuild/build', duplicate = 0)
763SConscript('tests/SConscript', exports = 'env', variant_dir = 'sconsbuild/tests')
764