xref: /lighttpd1.4/SConstruct (revision 3392e8fb)
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.60'
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_gdbm', 'enable gdbm support', 'no'),
248	BoolVariable('with_geoip', 'enable GeoIP support', 'no'),
249	BoolVariable('with_maxminddb', 'enable MaxMind GeoIP2 support', 'no'),
250	BoolVariable('with_krb5', 'enable krb5 auth support', 'no'),
251	BoolVariable('with_ldap', 'enable ldap auth support', 'no'),
252	# with_libev not supported
253	# with_libunwind not supported
254	BoolVariable('with_lua', 'enable lua support for mod_cml', 'no'),
255	BoolVariable('with_memcached', 'enable memcached support', 'no'),
256	PackageVariable('with_mysql', 'enable mysql support', 'no'),
257	BoolVariable('with_openssl', 'enable openssl support', 'no'),
258	PackageVariable('with_gnutls', 'enable GnuTLS support', 'no'),
259	PackageVariable('with_mbedtls', 'enable mbedTLS support', 'no'),
260	PackageVariable('with_nss', 'enable NSS crypto support', 'no'),
261	PackageVariable('with_wolfssl', 'enable wolfSSL support', 'no'),
262	BoolVariable('with_nettle', 'enable Nettle support', 'no'),
263	BoolVariable('with_pam', 'enable PAM auth support', 'no'),
264	PackageVariable('with_pcre', 'enable pcre support', 'yes'),
265	PackageVariable('with_pgsql', 'enable pgsql support', 'no'),
266	PackageVariable('with_sasl', 'enable SASL support', 'no'),
267	BoolVariable('with_sqlite3', 'enable sqlite3 support (required for webdav props)', 'no'),
268	BoolVariable('with_uuid', 'enable uuid support (required for webdav locks)', 'no'),
269	# with_valgrind not supported
270	# with_xattr not supported
271	PackageVariable('with_xml', 'enable xml support (required for webdav props)', 'no'),
272	BoolVariable('with_xxhash', 'build with system-provided xxhash', 'no'),
273	BoolVariable('with_zlib', 'enable deflate/gzip compression', 'no'),
274	BoolVariable('with_zstd', 'enable zstd compression', 'no'),
275
276	BoolVariable('with_all', 'enable all with_* features', 'no'),
277)
278
279env = Environment(
280	ENV = dict(os.environ),  # make sure we have a dict here so .Clone() works properly
281	variables = vars,
282	CPPPATH = Split('#sconsbuild/build')
283)
284
285env.Help(vars.GenerateHelpText(env))
286
287if env.subst('${CC}') != '':
288	env['CC'] = env.subst('${CC}')
289
290env['package'] = package
291env['version'] = version
292if env['CC'] == 'gcc':
293	## we need x-open 6 and bsd 4.3 features
294	env.Append(CCFLAGS = Split('-pipe -Wall -O2 -g -W -pedantic -Wunused -Wshadow -std=gnu99'))
295
296env.Append(CPPFLAGS = [
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		LIBDL = '',
337		LIBGDBM = '',
338		LIBGNUTLS = '',
339		LIBGSSAPI_KRB5 = '',
340		LIBKRB5 = '',
341		LIBLBER = '',
342		LIBLDAP = '',
343		LIBLUA = '',
344		LIBMBEDTLS = '',
345		LIBMBEDX509 = '',
346		LIBMBEDCRYPTO = '',
347		LIBMEMCACHED = '',
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		'fcntl.h',
370		'getopt.h',
371		'inttypes.h',
372		'linux/random.h',
373		'poll.h',
374		'pwd.h',
375		'stdint.h',
376		'stdlib.h',
377		'string.h',
378		'strings.h',
379		'sys/devpoll.h',
380		'sys/epoll.h',
381		'sys/filio.h',
382		'sys/inotify.h',
383		'sys/loadavg.h',
384		'sys/poll.h',
385		'sys/port.h',
386		'sys/prctl.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		'dup2',
411		'epoll_ctl',
412		'explicit_bzero',
413		'explicit_memset',
414		'fork',
415		'getcwd',
416		'gethostbyname',
417		'getloadavg',
418		'getopt',
419		'getrlimit',
420		'getuid',
421		'inet_aton',
422		'inet_ntop',
423		'inet_pton',
424		'issetugid',
425		'jrand48',
426		'kqueue',
427		'localtime_r',
428		'lstat',
429		'madvise',
430		'mempcpy',
431		'memset_s',
432		'memset',
433		'mmap',
434		'munmap',
435		'pathconf',
436		'pipe2',
437		'poll',
438		'port_create',
439		'posix_fadvise',
440		'prctl',
441		'select',
442		'send_file',
443		'sendfile',
444		'sendfile64',
445		'sigaction',
446		'signal',
447		'socket',
448		'srandom',
449		'stat',
450		'strchr',
451		'strdup',
452		'strerror',
453		'strftime',
454		'strstr',
455		'strtol',
456		'timegm',
457		'writev',
458	])
459	autoconf.haveFunc('getentropy', 'sys/random.h')
460	autoconf.haveFunc('getrandom', 'linux/random.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			CPPFLAGS = [ '-DHAVE_LIBCRYPT' ],
468			LIBCRYPT = 'crypt',
469		)
470		with autoconf.restoreEnvLibs():
471			autoconf.env['LIBS'] = ['crypt']
472			autoconf.haveFuncs(['crypt', 'crypt_r'])
473	else:
474		autoconf.haveFuncs(['crypt', 'crypt_r'])
475
476	if autoconf.CheckType('socklen_t', '#include <unistd.h>\n#include <sys/socket.h>\n#include <sys/types.h>'):
477		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SOCKLEN_T' ])
478
479	if autoconf.CheckType('struct sockaddr_storage', '#include <sys/socket.h>\n'):
480		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_SOCKADDR_STORAGE' ])
481
482	if autoconf.CheckLibWithHeader('elftc', 'libelftc.h', 'c', 'elftc_copyfile(0, 1);'):
483		autoconf.env.Append(
484			CPPFLAGS = [ '-DHAVE_ELFTC_COPYFILE' ],
485			LIBS = [ 'elftc' ],
486		)
487
488	if autoconf.CheckLibWithHeader('rt', 'time.h', 'c', 'clock_gettime(CLOCK_MONOTONIC, (struct timespec*)0);'):
489		autoconf.env.Append(
490			CPPFLAGS = [ '-DHAVE_CLOCK_GETTIME' ],
491			LIBS = [ 'rt' ],
492		)
493
494	if autoconf.CheckIPv6():
495		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_IPV6' ])
496
497	if autoconf.CheckWeakSymbols():
498		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_WEAK_SYMBOLS' ])
499
500	if autoconf.CheckGmtOffInStructTm():
501		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_TM_GMTOFF' ])
502
503	if autoconf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'):
504		autoconf.env.Append(LIBDL = 'dl')
505
506	if env['with_bzip2']:
507		if not autoconf.CheckLibWithHeader('bz2', 'bzlib.h', 'C'):
508			fail("Couldn't find bz2")
509		autoconf.env.Append(
510			CPPFLAGS = [ '-DHAVE_BZLIB_H', '-DHAVE_LIBBZ2' ],
511			LIBBZ2 = 'bz2',
512		)
513
514	if env['with_brotli']:
515		if not autoconf.CheckParseConfigForLib('LIBBROTLI', 'pkg-config --static --cflags --libs libbrotlienc'):
516			fail("Couldn't find libbrotlienc")
517		autoconf.env.Append(
518			CPPFLAGS = [ '-DHAVE_BROTLI_ENCODE_H', '-DHAVE_BROTLI' ],
519		)
520
521	if env['with_dbi']:
522		if not autoconf.CheckLibWithHeader('dbi', 'dbi/dbi.h', 'C'):
523			fail("Couldn't find dbi")
524		autoconf.env.Append(
525			CPPFLAGS = [ '-DHAVE_DBI_H', '-DHAVE_LIBDBI' ],
526			LIBDBI = 'dbi',
527		)
528
529	if env['with_fam'] and not autoconf.CheckCHeader('sys/inotify.h'):
530		if not autoconf.CheckLibWithHeader('fam', 'fam.h', 'C'):
531			fail("Couldn't find fam")
532		autoconf.env.Append(
533			CPPFLAGS = [ '-DHAVE_FAM_H', '-DHAVE_LIBFAM' ],
534			LIBS = [ 'fam' ],
535		)
536		autoconf.haveFunc('FAMNoExists')
537
538	if env['with_gdbm']:
539		if not autoconf.CheckLibWithHeader('gdbm', 'gdbm.h', 'C'):
540			fail("Couldn't find gdbm")
541		autoconf.env.Append(
542			CPPFLAGS = [ '-DHAVE_GDBM_H', '-DHAVE_GDBM' ],
543			LIBGDBM = 'gdbm',
544		)
545
546	if env['with_geoip']:
547		if not autoconf.CheckLibWithHeader('GeoIP', 'GeoIP.h', 'C'):
548			fail("Couldn't find geoip")
549		autoconf.env.Append(
550			CPPFLAGS = [ '-DHAVE_GEOIP' ],
551			LIBGEOIP = 'GeoIP',
552		)
553
554	if env['with_maxminddb']:
555		if not autoconf.CheckLibWithHeader('maxminddb', 'maxminddb.h', 'C'):
556			fail("Couldn't find maxminddb")
557		autoconf.env.Append(
558			CPPFLAGS = [ '-DHAVE_MAXMINDDB' ],
559			LIBMAXMINDDB = 'maxminddb',
560		)
561
562	if env['with_krb5']:
563		if not autoconf.CheckLibWithHeader('krb5', 'krb5.h', 'C'):
564			fail("Couldn't find krb5")
565		if not autoconf.CheckLibWithHeader('gssapi_krb5', 'gssapi/gssapi_krb5.h', 'C'):
566			fail("Couldn't find gssapi_krb5")
567		autoconf.env.Append(
568			CPPFLAGS = [ '-DHAVE_KRB5' ],
569			LIBKRB5 = 'krb5',
570			LIBGSSAPI_KRB5 = 'gssapi_krb5',
571		)
572
573	if env['with_ldap']:
574		if not autoconf.CheckLibWithHeader('ldap', 'ldap.h', 'C'):
575			fail("Couldn't find ldap")
576		if not autoconf.CheckLibWithHeader('lber', 'lber.h', 'C'):
577			fail("Couldn't find lber")
578		autoconf.env.Append(
579			CPPFLAGS = [
580				'-DHAVE_LDAP_H', '-DHAVE_LIBLDAP',
581				'-DHAVE_LBER_H', '-DHAVE_LIBLBER',
582			],
583			LIBLDAP = 'ldap',
584			LIBLBER = 'lber',
585		)
586
587	if env['with_lua']:
588		found_lua = False
589		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']:
590			print("Searching for lua: " + lua_name + " >= 5.0")
591			if autoconf.CheckParseConfigForLib('LIBLUA', "pkg-config '" + lua_name + " >= 5.0' --cflags --libs"):
592				autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LUA_H' ])
593				found_lua = True
594				break
595		if not found_lua:
596			fail("Couldn't find any lua implementation")
597
598	if env['with_memcached']:
599		if not autoconf.CheckLibWithHeader('memcached', 'libmemcached/memcached.h', 'C'):
600			fail("Couldn't find memcached")
601		autoconf.env.Append(
602			CPPFLAGS = [ '-DUSE_MEMCACHED' ],
603			LIBMEMCACHED = 'memcached',
604		)
605
606	if env['with_mysql']:
607		mysql_config = autoconf.checkProgram('mysql', 'mysql_config')
608		if not autoconf.CheckParseConfigForLib('LIBMYSQL', mysql_config + ' --cflags --libs'):
609			fail("Couldn't find mysql")
610		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_MYSQL_H', '-DHAVE_LIBMYSQL' ])
611
612	if env['with_nss']:
613		nss_config = autoconf.checkProgram('nss', 'nss-config')
614		if not autoconf.CheckParseConfigForLib('LIBNSS', nss_config + ' --cflags --libs'):
615			fail("Couldn't find NSS")
616		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_NSS3_NSS_H' ])
617
618	if env['with_openssl']:
619		if not autoconf.CheckLibWithHeader('ssl', 'openssl/ssl.h', 'C'):
620			fail("Couldn't find openssl")
621		autoconf.env.Append(
622			CPPFLAGS = [ '-DHAVE_OPENSSL_SSL_H', '-DHAVE_LIBSSL'],
623			LIBSSL = 'ssl',
624			LIBSSLCRYPTO = 'crypto',
625			LIBCRYPTO = 'crypto',
626		)
627
628	if env['with_wolfssl']:
629		if type(env['with_wolfssl']) is str:
630			autoconf.env.AppendUnique(
631				CPPPATH = [ env['with_wolfssl'] + '/include',
632					    env['with_wolfssl'] + '/include/wolfssl' ],
633				LIBPATH = [ env['with_wolfssl'] + '/lib' ],
634			)
635		if not autoconf.CheckLibWithHeader('wolfssl', 'wolfssl/ssl.h', 'C'):
636			fail("Couldn't find wolfssl")
637		autoconf.env.Append(
638			CPPFLAGS = [ '-DHAVE_WOLFSSL_SSL_H' ],
639			LIBWOLFSSL= 'wolfssl',
640			LIBCRYPTO = 'wolfssl',
641		)
642
643	if env['with_mbedtls']:
644		if not autoconf.CheckLibWithHeader('mbedtls', 'mbedtls/ssl.h', 'C'):
645			fail("Couldn't find mbedtls")
646		autoconf.env.Append(
647			CPPFLAGS = [ '-DHAVE_LIBMBEDCRYPTO' ],
648			LIBMBEDTLS = 'mbedtls',
649			LIBMBEDX509 = 'mbedx509',
650			LIBMBEDCRYPTO = 'mbedcrypto',
651			LIBCRYPTO = 'mbedcrypto',
652		)
653
654	if env['with_nettle']:
655		if not autoconf.CheckLibWithHeader('nettle', 'nettle/nettle-types.h', 'C'):
656			fail("Couldn't find Nettle")
657		autoconf.env.Append(
658			CPPFLAGS = [ '-DHAVE_NETTLE_NETTLE_TYPES_H' ],
659			LIBCRYPTO = 'nettle',
660		)
661
662	if env['with_gnutls']:
663		if not autoconf.CheckLibWithHeader('gnutls', 'gnutls/crypto.h', 'C'):
664			fail("Couldn't find gnutls")
665		autoconf.env.Append(
666			CPPFLAGS = [ '-DHAVE_GNUTLS_CRYPTO_H' ],
667			LIBGNUTLS = 'gnutls',
668		)
669		if not autoconf.env.exists('LIBCRYPTO'):
670			autoconf.env.Append(
671				LIBCRYPTO = 'gnutls',
672			)
673
674	if env['with_pam']:
675		if not autoconf.CheckLibWithHeader('pam', 'security/pam_appl.h', 'C'):
676			fail("Couldn't find pam")
677		autoconf.env.Append(
678			CPPFLAGS = [ '-DHAVE_PAM' ],
679			LIBPAM = 'pam',
680		)
681
682	if env['with_pcre']:
683		pcre_config = autoconf.checkProgram('pcre', 'pcre-config')
684		if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre_config + ' --cflags --libs'):
685			fail("Couldn't find pcre")
686		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE_H', '-DHAVE_LIBPCRE' ])
687
688	if env['with_pgsql']:
689		if not autoconf.CheckParseConfigForLib('LIBPGSQL', 'pkg-config libpq --cflags --libs'):
690			fail("Couldn't find libpq")
691		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PGSQL_H', '-DHAVE_LIBPGSQL' ])
692
693	if env['with_sasl']:
694		if not autoconf.CheckLibWithHeader('sasl2', 'sasl/sasl.h', 'C'):
695			fail("Couldn't find libsasl2")
696		autoconf.env.Append(
697			CPPFLAGS = [ '-DHAVE_SASL' ],
698			LIBSASL = 'sasl2',
699		)
700
701	if env['with_sqlite3']:
702		if not autoconf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'):
703			fail("Couldn't find sqlite3")
704		autoconf.env.Append(
705			CPPFLAGS = [ '-DHAVE_SQLITE3_H', '-DHAVE_LIBSQLITE3' ],
706			LIBSQLITE3 = 'sqlite3',
707		)
708
709	if env['with_uuid']:
710		if not autoconf.CheckLibWithHeader('uuid', 'uuid/uuid.h', 'C'):
711			fail("Couldn't find uuid")
712		autoconf.env.Append(
713			CPPFLAGS = [ '-DHAVE_UUID_UUID_H', '-DHAVE_LIBUUID' ],
714			LIBUUID = 'uuid',
715		)
716
717	if env['with_xml']:
718		xml2_config = autoconf.checkProgram('xml', 'xml2-config')
719		if not autoconf.CheckParseConfigForLib('LIBXML2', xml2_config + ' --cflags --libs'):
720			fail("Couldn't find xml2")
721		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LIBXML_H', '-DHAVE_LIBXML2' ])
722
723	if env['with_xxhash']:
724		if not autoconf.CheckLibWithHeader('xxhash', 'xxhash.h', 'C'):
725			fail("Couldn't find xxhash")
726		autoconf.env.Append(
727			CPPFLAGS = [ '-DHAVE_XXHASH_H' ],
728			LIBXXHASH = 'xxhash',
729		)
730
731	if env['with_zlib']:
732		if not autoconf.CheckLibWithHeader('z', 'zlib.h', 'C'):
733			fail("Couldn't find zlib")
734		autoconf.env.Append(
735			CPPFLAGS = [ '-DHAVE_ZLIB_H', '-DHAVE_LIBZ' ],
736			LIBZ = 'z',
737		)
738
739	if env['with_zstd']:
740		if not autoconf.CheckLibWithHeader('zstd', 'zstd.h', 'C'):
741			fail("Couldn't find zstd")
742		autoconf.env.Append(
743			CPPFLAGS = [ '-DHAVE_ZSTD_H', '-DHAVE_ZSTD' ],
744			LIBZSTD = 'zstd',
745		)
746
747	env = autoconf.Finish()
748
749if re.compile("cygwin|mingw|midipix").search(env['PLATFORM']):
750	env.Append(COMMON_LIB = 'bin')
751elif re.compile("darwin|aix").search(env['PLATFORM']):
752	env.Append(COMMON_LIB = 'lib')
753else:
754	env.Append(COMMON_LIB = False)
755
756versions = version.split('.')
757version_id = int(versions[0]) << 16 | int(versions[1]) << 8 | int(versions[2])
758env.Append(CPPFLAGS = [
759		'-DLIGHTTPD_VERSION_ID=' + hex(version_id),
760		'-DPACKAGE_NAME=\\"' + package + '\\"',
761		'-DPACKAGE_VERSION=\\"' + version + '\\"',
762		'-DLIBRARY_DIR="\\"${libdir}\\""',
763		] )
764
765SConscript('src/SConscript', exports = 'env', variant_dir = 'sconsbuild/build', duplicate = 0)
766SConscript('tests/SConscript', exports = 'env', variant_dir = 'sconsbuild/tests')
767