File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / lighttpd / SConstruct
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:35:00 2016 UTC (7 years, 8 months ago) by misho
Branches: lighttpd, MAIN
CVS tags: v1_4_41p8, HEAD
lighttpd 1.4.41

    1: import os
    2: import sys
    3: import re
    4: import string
    5: from stat import *
    6: 
    7: package = 'lighttpd'
    8: version = '1.4.41'
    9: 
   10: def checkCHeaders(autoconf, hdrs):
   11: 	p = re.compile('[^A-Z0-9]')
   12: 	for hdr in hdrs:
   13: 		if not hdr:
   14: 			continue
   15: 		_hdr = Split(hdr)
   16: 		if autoconf.CheckCHeader(_hdr):
   17: 			autoconf.env.Append(CPPFLAGS = [ '-DHAVE_' + p.sub('_', _hdr[-1].upper()) ])
   18: 
   19: def checkFuncs(autoconf, funcs):
   20: 	p = re.compile('[^A-Z0-9]')
   21: 	for func in funcs:
   22: 		if autoconf.CheckFunc(func):
   23: 			autoconf.env.Append(CPPFLAGS = [ '-DHAVE_' + p.sub('_', func.upper()) ])
   24: 
   25: def checkTypes(autoconf, types):
   26: 	p = re.compile('[^A-Z0-9]')
   27: 	for type in types:
   28: 		if autoconf.CheckType(type, '#include <sys/types.h>'):
   29: 			autoconf.env.Append(CPPFLAGS = [ '-DHAVE_' + p.sub('_', type.upper()) ])
   30: 
   31: def checkGmtOffInStructTm(context):
   32: 	source = """
   33: #include <time.h>
   34: int main() {
   35: 	struct tm a;
   36: 	a.tm_gmtoff = 0;
   37: 	return 0;
   38: }
   39: """
   40: 	context.Message('Checking for tm_gmtoff in struct tm...')
   41: 	result = context.TryLink(source, '.c')
   42: 	context.Result(result)
   43: 
   44: 	return result
   45: 
   46: def checkIPv6(context):
   47: 	source = """
   48: #include <sys/types.h>
   49: #include <sys/socket.h>
   50: #include <netinet/in.h>
   51: 
   52: int main() {
   53: 	struct sockaddr_in6 s; struct in6_addr t=in6addr_any; int i=AF_INET6; s; t.s6_addr[0] = 0;
   54: 	return 0;
   55: }
   56: """
   57: 	context.Message('Checking for IPv6 support...')
   58: 	result = context.TryLink(source, '.c')
   59: 	context.Result(result)
   60: 
   61: 	return result
   62: 
   63: def checkWeakSymbols(context):
   64: 	source = """
   65: __attribute__((weak)) void __dummy(void *x) { }
   66: int main() {
   67: 	void *x;
   68: 	__dummy(x);
   69: }
   70: """
   71: 	context.Message('Checking for weak symbol support...')
   72: 	result = context.TryLink(source, '.c')
   73: 	context.Result(result)
   74: 
   75: 	return result
   76: 
   77: def checkProgram(env, withname, progname):
   78: 	withname = 'with_' + withname
   79: 	binpath = None
   80: 
   81: 	if env[withname] != 1:
   82: 		binpath = env[withname]
   83: 	else:
   84: 		prog = env.Detect(progname)
   85: 		if prog:
   86: 			binpath = env.WhereIs(prog)
   87: 
   88: 	if binpath:
   89: 		mode = os.stat(binpath)[ST_MODE]
   90: 		if S_ISDIR(mode):
   91: 			print >> sys.stderr, "* error: path `%s' is a directory" % (binpath)
   92: 			env.Exit(-1)
   93: 		if not S_ISREG(mode):
   94: 			print >> sys.stderr, "* error: path `%s' is not a file or not exists" % (binpath)
   95: 			env.Exit(-1)
   96: 
   97: 	if not binpath:
   98: 		print >> sys.stderr, "* error: can't find program `%s'" % (progname)
   99: 		env.Exit(-1)
  100: 
  101: 	return binpath
  102: 
  103: VariantDir('sconsbuild/build', 'src', duplicate = 0)
  104: VariantDir('sconsbuild/tests', 'tests', duplicate = 0)
  105: 
  106: vars = Variables() #('config.py')
  107: vars.AddVariables(
  108: 	('prefix', 'prefix', '/usr/local'),
  109: 	('bindir', 'binary directory', '${prefix}/bin'),
  110: 	('sbindir', 'binary directory', '${prefix}/sbin'),
  111: 	('libdir', 'library directory', '${prefix}/lib'),
  112: 	PackageVariable('with_mysql', 'enable mysql support', 'no'),
  113: 	PackageVariable('with_xml', 'enable xml support', 'no'),
  114: 	PackageVariable('with_pcre', 'enable pcre support', 'yes'),
  115: 	PathVariable('CC', 'path to the c-compiler', None),
  116: 	BoolVariable('build_dynamic', 'enable dynamic build', 'yes'),
  117: 	BoolVariable('build_static', 'enable static build', 'no'),
  118: 	BoolVariable('build_fullstatic', 'enable fullstatic build', 'no'),
  119: 	BoolVariable('with_sqlite3', 'enable sqlite3 support', 'no'),
  120: 	BoolVariable('with_memcached', 'enable memcached support', 'no'),
  121: 	BoolVariable('with_fam', 'enable FAM/gamin support', 'no'),
  122: 	BoolVariable('with_openssl', 'enable openssl support', 'no'),
  123: 	BoolVariable('with_gzip', 'enable gzip compression', 'no'),
  124: 	BoolVariable('with_bzip2', 'enable bzip2 compression', 'no'),
  125: 	BoolVariable('with_lua', 'enable lua support for mod_cml', 'no'),
  126: 	BoolVariable('with_ldap', 'enable ldap auth support', 'no'))
  127: 
  128: env = Environment(
  129: 	ENV = os.environ,
  130: 	variables = vars,
  131: 	CPPPATH = Split('#sconsbuild/build')
  132: )
  133: 
  134: env.Help(vars.GenerateHelpText(env))
  135: 
  136: if env.subst('${CC}') is not '':
  137: 	env['CC'] = env.subst('${CC}')
  138: 
  139: env['package'] = package
  140: env['version'] = version
  141: if env['CC'] == 'gcc':
  142: 	## we need x-open 6 and bsd 4.3 features
  143: 	env.Append(CCFLAGS = Split('-Wall -O2 -g -W -pedantic -Wunused -Wshadow -std=gnu99'))
  144: 
  145: # cache configure checks
  146: if 1:
  147: 	autoconf = Configure(env, custom_tests = {
  148: 		'CheckGmtOffInStructTm': checkGmtOffInStructTm,
  149: 		'CheckIPv6': checkIPv6,
  150: 		'CheckWeakSymbols': checkWeakSymbols,
  151: 	})
  152: 
  153: 	if 'CFLAGS' in os.environ:
  154: 		autoconf.env.Append(CCFLAGS = os.environ['CFLAGS'])
  155: 		print(">> Appending custom build flags : " + os.environ['CFLAGS'])
  156: 
  157: 	if 'LDFLAGS' in os.environ:
  158: 		autoconf.env.Append(LINKFLAGS = os.environ['LDFLAGS'])
  159: 		print(">> Appending custom link flags : " + os.environ['LDFLAGS'])
  160: 
  161: 	if 'LIBS' in os.environ:
  162: 		autoconf.env.Append(APPEND_LIBS = os.environ['LIBS'])
  163: 		print(">> Appending custom libraries : " + os.environ['LIBS'])
  164: 	else:
  165: 		autoconf.env.Append(APPEND_LIBS = '')
  166: 
  167: 	autoconf.headerfile = "foo.h"
  168: 	checkCHeaders(autoconf, string.split("""
  169: 			arpa/inet.h
  170: 			crypt.h
  171: 			fcntl.h
  172: 			getopt.h
  173: 			inttypes.h
  174: 			netinet/in.h
  175: 			poll.h
  176: 			pwd.h
  177: 			stdint.h
  178: 			stdlib.h
  179: 			string.h
  180: 			sys/devpoll.h
  181: 			sys/epoll.h
  182: 			sys/event.h
  183: 			sys/filio.h
  184: 			sys/mman.h
  185: 			sys/poll.h
  186: 			sys/port.h
  187: 			sys/prctl.h
  188: 			sys/resource.h
  189: 			sys/select.h
  190: 			sys/sendfile.h
  191: 			sys/socket.h
  192: 			sys/time.h
  193: 			sys/time.h sys/types.h sys/resource.h
  194: 			sys/types.h netinet/in.h
  195: 			sys/types.h sys/event.h
  196: 			sys/types.h sys/mman.h
  197: 			sys/types.h sys/select.h
  198: 			sys/types.h sys/socket.h
  199: 			sys/types.h sys/uio.h
  200: 			sys/types.h sys/un.h
  201: 			sys/uio.h
  202: 			sys/un.h
  203: 			sys/wait.h
  204: 			syslog.h
  205: 			unistd.h
  206: 			winsock2.h""", "\n"))
  207: 
  208: 	checkFuncs(autoconf, Split('fork stat lstat strftime dup2 getcwd inet_ntoa inet_ntop memset mmap munmap strchr \
  209: 			strdup strerror strstr strtol sendfile getopt socket \
  210: 			gethostbyname poll epoll_ctl getrlimit chroot \
  211: 			getuid select signal pathconf madvise prctl\
  212: 			writev sigaction sendfile64 send_file kqueue port_create localtime_r posix_fadvise issetugid inet_pton \
  213: 			memset_s explicit_bzero clock_gettime'))
  214: 
  215: 	checkTypes(autoconf, Split('pid_t size_t off_t'))
  216: 
  217: 	autoconf.env.Append( LIBSQLITE3 = '', LIBXML2 = '', LIBMYSQL = '', LIBZ = '',
  218: 		LIBBZ2 = '', LIBCRYPT = '', LIBMEMCACHED = '', LIBFCGI = '', LIBPCRE = '',
  219: 		LIBLDAP = '', LIBLBER = '', LIBLUA = '', LIBDL = '', LIBUUID = '')
  220: 
  221: 	if env['with_fam']:
  222: 		if autoconf.CheckLibWithHeader('fam', 'fam.h', 'C'):
  223: 			autoconf.env.Append(CPPFLAGS = [ '-DHAVE_FAM_H', '-DHAVE_LIBFAM' ], LIBS = 'fam')
  224: 			checkFuncs(autoconf, ['FAMNoExists']);
  225: 
  226: 	if autoconf.CheckLib('crypt'):
  227: 		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LIBCRYPT' ], LIBCRYPT = 'crypt')
  228: 		oldlib = env['LIBS']
  229: 		env['LIBS'] += ['crypt']
  230: 		checkFuncs(autoconf, ['crypt', 'crypt_r']);
  231: 		env['LIBS'] = oldlib
  232: 	else:
  233: 		checkFuncs(autoconf, ['crypt', 'crypt_r']);
  234: 
  235: 	if autoconf.CheckLibWithHeader('rt', 'time.h', 'c', 'clock_gettime(CLOCK_MONOTONIC, (struct timespec*)0);'):
  236: 		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_CLOCK_GETTIME' ], LIBS = [ 'rt' ])
  237: 
  238: 	if autoconf.CheckLibWithHeader('uuid', 'uuid/uuid.h', 'C'):
  239: 		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_UUID_UUID_H', '-DHAVE_LIBUUID' ], LIBUUID = 'uuid')
  240: 
  241: 	if env['with_openssl']:
  242: 		if autoconf.CheckLibWithHeader('ssl', 'openssl/ssl.h', 'C'):
  243: 			autoconf.env.Append(CPPFLAGS = [ '-DHAVE_OPENSSL_SSL_H', '-DHAVE_LIBSSL'] , LIBS = [ 'ssl', 'crypto' ])
  244: 
  245: 	if env['with_gzip']:
  246: 		if autoconf.CheckLibWithHeader('z', 'zlib.h', 'C'):
  247: 			autoconf.env.Append(CPPFLAGS = [ '-DHAVE_ZLIB_H', '-DHAVE_LIBZ' ], LIBZ = 'z')
  248: 
  249: 	if env['with_ldap']:
  250: 		if autoconf.CheckLibWithHeader('ldap', 'ldap.h', 'C'):
  251: 			autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LDAP_H', '-DHAVE_LIBLDAP' ], LIBLDAP = 'ldap')
  252: 		if autoconf.CheckLibWithHeader('lber', 'lber.h', 'C'):
  253: 			autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LBER_H', '-DHAVE_LIBLBER' ], LIBLBER = 'lber')
  254: 
  255: 	if env['with_bzip2']:
  256: 		if autoconf.CheckLibWithHeader('bz2', 'bzlib.h', 'C'):
  257: 			autoconf.env.Append(CPPFLAGS = [ '-DHAVE_BZLIB_H', '-DHAVE_LIBBZ2' ], LIBBZ2 = 'bz2')
  258: 
  259: 	if env['with_memcached']:
  260: 		if autoconf.CheckLibWithHeader('memcached', 'libmemcached/memcached.h', 'C'):
  261: 			autoconf.env.Append(CPPFLAGS = [ '-DUSE_MEMCACHED' ], LIBMEMCACHED = 'memcached')
  262: 
  263: 	if env['with_sqlite3']:
  264: 		if autoconf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'):
  265: 			autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SQLITE3_H', '-DHAVE_LIBSQLITE3' ], LIBSQLITE3 = 'sqlite3')
  266: 
  267: 	ol = env['LIBS']
  268: 	if autoconf.CheckLibWithHeader('fcgi', 'fastcgi.h', 'C'):
  269: 		autoconf.env.Append(LIBFCGI = 'fcgi')
  270: 	env['LIBS'] = ol
  271: 
  272: 	ol = env['LIBS']
  273: 	if autoconf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'):
  274: 		autoconf.env.Append(LIBDL = 'dl')
  275: 	env['LIBS'] = ol
  276: 
  277: 	if autoconf.CheckType('socklen_t', '#include <unistd.h>\n#include <sys/socket.h>\n#include <sys/types.h>'):
  278: 		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SOCKLEN_T' ])
  279: 
  280: 	if autoconf.CheckType('struct sockaddr_storage', '#include <sys/socket.h>\n'):
  281: 		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_SOCKADDR_STORAGE' ])
  282: 
  283: 	if autoconf.CheckGmtOffInStructTm():
  284: 		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_TM_GMTOFF' ])
  285: 
  286: 	if autoconf.CheckIPv6():
  287: 		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_IPV6' ])
  288: 
  289: 	if autoconf.CheckWeakSymbols():
  290: 		autoconf.env.Append(CPPFLAGS = [ '-DHAVE_WEAK_SYMBOLS' ])
  291: 
  292: 	env = autoconf.Finish()
  293: 
  294: def TryLua(env, name):
  295: 	result = False
  296: 	oldlibs = env['LIBS']
  297: 	try:
  298: 		print("Searching for lua: " + name + " >= 5.0")
  299: 		env.ParseConfig("pkg-config '" + name + " >= 5.0' --cflags --libs")
  300: 		env.Append(LIBLUA = env['LIBS'][len(oldlibs):])
  301: 		env.Append(CPPFLAGS = [ '-DHAVE_LUA_H' ])
  302: 		result = True
  303: 	except:
  304: 		pass
  305: 	env['LIBS'] = oldlibs
  306: 	return result
  307: 
  308: if env['with_lua']:
  309: 	found_lua = False
  310: 	for lua_name in ['lua5.3', 'lua-5.3', 'lua5.2', 'lua-5.2', 'lua5.1', 'lua-5.1', 'lua']:
  311: 		if TryLua(env, lua_name):
  312: 			found_lua = True
  313: 			break
  314: 	if not found_lua:
  315: 		raise RuntimeError("Couldn't find any lua implementation")
  316: 
  317: if env['with_pcre']:
  318: 	pcre_config = checkProgram(env, 'pcre', 'pcre-config')
  319: 	env.ParseConfig(pcre_config + ' --cflags --libs')
  320: 	env.Append(CPPFLAGS = [ '-DHAVE_PCRE_H', '-DHAVE_LIBPCRE' ], LIBPCRE = 'pcre')
  321: 
  322: if env['with_xml']:
  323: 	xml2_config = checkProgram(env, 'xml', 'xml2-config')
  324: 	oldlib = env['LIBS']
  325: 	env['LIBS'] = []
  326: 	env.ParseConfig(xml2_config + ' --cflags --libs')
  327: 	env.Append(CPPFLAGS = [ '-DHAVE_LIBXML_H', '-DHAVE_LIBXML2' ], LIBXML2 = env['LIBS'])
  328: 	env['LIBS'] = oldlib
  329: 
  330: if env['with_mysql']:
  331: 	mysql_config = checkProgram(env, 'mysql', 'mysql_config')
  332: 	oldlib = env['LIBS']
  333: 	env['LIBS'] = []
  334: 	env.ParseConfig(mysql_config + ' --cflags --libs')
  335: 	env.Append(CPPFLAGS = [ '-DHAVE_MYSQL_H', '-DHAVE_LIBMYSQL' ], LIBMYSQL = 'mysqlclient')
  336: 	env['LIBS'] = oldlib
  337: 
  338: if re.compile("cygwin|mingw").search(env['PLATFORM']):
  339: 	env.Append(COMMON_LIB = 'bin')
  340: elif re.compile("darwin|aix").search(env['PLATFORM']):
  341: 	env.Append(COMMON_LIB = 'lib')
  342: else:
  343: 	env.Append(COMMON_LIB = False)
  344: 
  345: versions = string.split(version, '.')
  346: version_id = int(versions[0]) << 16 | int(versions[1]) << 8 | int(versions[2])
  347: env.Append(CPPFLAGS = [
  348: 		'-DLIGHTTPD_VERSION_ID=' + hex(version_id),
  349: 		'-DPACKAGE_NAME=\\"' + package + '\\"',
  350: 		'-DPACKAGE_VERSION=\\"' + version + '\\"',
  351: 		'-DLIBRARY_DIR="\\"${libdir}\\""',
  352: 		'-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE', '-D_LARGE_FILES'
  353: 		] )
  354: 
  355: SConscript('src/SConscript', exports = 'env', variant_dir = 'sconsbuild/build', duplicate = 0)
  356: SConscript('tests/SConscript', exports = 'env', variant_dir = 'sconsbuild/tests')

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>