123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- import os
- import sys
- import re
- import string
- from stat import *
- package = 'lighttpd'
- version = '1.4.33'
- def checkCHeaders(autoconf, hdrs):
- p = re.compile('[^A-Z0-9]')
- for hdr in hdrs:
- if not hdr:
- continue
- _hdr = Split(hdr)
- if autoconf.CheckCHeader(_hdr):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_' + p.sub('_', _hdr[-1].upper()) ])
- def checkFuncs(autoconf, funcs):
- p = re.compile('[^A-Z0-9]')
- for func in funcs:
- if autoconf.CheckFunc(func):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_' + p.sub('_', func.upper()) ])
- def checkTypes(autoconf, types):
- p = re.compile('[^A-Z0-9]')
- for type in types:
- if autoconf.CheckType(type, '#include <sys/types.h>'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_' + p.sub('_', type.upper()) ])
- def checkProgram(env, withname, progname):
- withname = 'with_' + withname
- binpath = None
- if env[withname] != 1:
- binpath = env[withname]
- else:
- prog = env.Detect(progname)
- if prog:
- binpath = env.WhereIs(prog)
- if binpath:
- mode = os.stat(binpath)[ST_MODE]
- if S_ISDIR(mode):
- print >> sys.stderr, "* error: path `%s' is a directory" % (binpath)
- env.Exit(-1)
- if not S_ISREG(mode):
- print >> sys.stderr, "* error: path `%s' is not a file or not exists" % (binpath)
- env.Exit(-1)
- if not binpath:
- print >> sys.stderr, "* error: can't find program `%s'" % (progname)
- env.Exit(-1)
- return binpath
- def checkStructMember(context):
- struct_member = """
- #include <time.h>
- int main() {
- struct tm a;
- a.tm_gmtoff = 0;
- return 0;
- }
- """
- context.Message('Checking for tm_gmtoff in struct tm...')
- result = context.TryLink(struct_member, '.c')
- context.Result(result)
- return result
- BuildDir('build', 'src', duplicate = 0)
- opts = Options('config.py')
- opts.AddOptions(
- ('prefix', 'prefix', '/usr/local'),
- ('bindir', 'binary directory', '${prefix}/bin'),
- ('sbindir', 'binary directory', '${prefix}/sbin'),
- ('libdir', 'library directory', '${prefix}/lib'),
- PackageOption('with_mysql', 'enable mysql support', 'no'),
- PackageOption('with_xml', 'enable xml support', 'no'),
- PackageOption('with_pcre', 'enable pcre support', 'yes'),
- PathOption('CC', 'path to the c-compiler', None),
- BoolOption('build_dynamic', 'enable dynamic build', 'yes'),
- BoolOption('build_static', 'enable static build', 'no'),
- BoolOption('build_fullstatic', 'enable fullstatic build', 'no'),
- BoolOption('with_sqlite3', 'enable sqlite3 support', 'no'),
- BoolOption('with_memcache', 'enable memcache support', 'no'),
- BoolOption('with_fam', 'enable FAM/gamin support', 'no'),
- BoolOption('with_openssl', 'enable memcache support', 'no'),
- BoolOption('with_gzip', 'enable gzip compression', 'no'),
- BoolOption('with_bzip2', 'enable bzip2 compression', 'no'),
- BoolOption('with_lua', 'enable lua support for mod_cml', 'no'),
- BoolOption('with_ldap', 'enable ldap auth support', 'no'))
- env = Environment(
- env = os.environ,
- options = opts,
- CPPPATH = Split('#build')
- )
- env.Help(opts.GenerateHelpText(env))
- if env.subst('${CC}') is not '':
- env['CC'] = env.subst('${CC}')
- env['package'] = package
- env['version'] = version
- if env['CC'] == 'gcc':
- ## we need x-open 6 and bsd 4.3 features
- env.Append(CCFLAGS = Split('-Wall -O2 -g -W -pedantic -Wunused -Wshadow -std=gnu99'))
- # cache configure checks
- if 1:
- autoconf = Configure(env, custom_tests = {'CheckStructMember': checkStructMember })
- autoconf.headerfile = "foo.h"
- checkCHeaders(autoconf, string.split("""
- arpa/inet.h
- fcntl.h
- netinet/in.h
- sys/types.h netinet/in.h
- stdlib.h
- string.h
- sys/socket.h
- sys/types.h sys/socket.h
- sys/time.h
- unistd.h
- sys/sendfile.h
- sys/uio.h
- sys/types.h sys/uio.h
- getopt.h
- sys/epoll.h
- sys/select.h
- sys/types.h sys/select.h
- poll.h
- sys/poll.h
- sys/devpoll.h
- sys/filio.h
- sys/mman.h
- sys/types.h sys/mman.h
- sys/event.h
- sys/types.h sys/event.h
- sys/port.h
- winsock2.h
- pwd.h
- sys/syslimits.h
- sys/resource.h
- sys/time.h sys/types.h sys/resource.h
- sys/un.h
- sys/types.h sys/un.h
- syslog.h
- stdint.h
- inttypes.h
- sys/prctl.h
- sys/wait.h""", "\n"))
- checkFuncs(autoconf, Split('fork stat lstat strftime dup2 getcwd inet_ntoa inet_ntop memset mmap munmap strchr \
- strdup strerror strstr strtol sendfile getopt socket \
- gethostbyname poll epoll_ctl getrlimit chroot \
- getuid select signal pathconf madvise prctl\
- writev sigaction sendfile64 send_file kqueue port_create localtime_r posix_fadvise issetugid inet_pton'))
- checkTypes(autoconf, Split('pid_t size_t off_t'))
- autoconf.env.Append( LIBSQLITE3 = '', LIBXML2 = '', LIBMYSQL = '', LIBZ = '',
- LIBBZ2 = '', LIBCRYPT = '', LIBMEMCACHE = '', LIBFCGI = '', LIBPCRE = '',
- LIBLDAP = '', LIBLBER = '', LIBLUA = '', LIBLUALIB = '', LIBDL = '')
- if env['with_fam']:
- if autoconf.CheckLibWithHeader('fam', 'fam.h', 'C'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_FAM_H', '-DHAVE_LIBFAM' ], LIBS = 'fam')
- checkFuncs(autoconf, ['FAMNoExists']);
- if autoconf.CheckLibWithHeader('crypt', 'crypt.h', 'C'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_CRYPT_H', '-DHAVE_LIBCRYPT' ], LIBCRYPT = 'crypt')
- if autoconf.CheckLibWithHeader('uuid', 'uuid/uuid.h', 'C'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_UUID_UUID_H', '-DHAVE_LIBUUID' ], LIBUUID = 'uuid')
- if env['with_openssl']:
- if autoconf.CheckLibWithHeader('ssl', 'openssl/ssl.h', 'C'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_OPENSSL_SSL_H', '-DHAVE_LIBSSL'] , LIBS = [ 'ssl', 'crypto' ])
- if env['with_gzip']:
- if autoconf.CheckLibWithHeader('z', 'zlib.h', 'C'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_ZLIB_H', '-DHAVE_LIBZ' ], LIBZ = 'z')
- if env['with_ldap']:
- if autoconf.CheckLibWithHeader('ldap', 'ldap.h', 'C'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LDAP_H', '-DHAVE_LIBLDAP' ], LIBLDAP = 'ldap')
- if autoconf.CheckLibWithHeader('lber', 'lber.h', 'C'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LBER_H', '-DHAVE_LIBLBER' ], LIBLBER = 'lber')
- if env['with_bzip2']:
- if autoconf.CheckLibWithHeader('bz2', 'bzlib.h', 'C'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_BZLIB_H', '-DHAVE_LIBBZ2' ], LIBBZ2 = 'bz2')
- if env['with_memcache']:
- if autoconf.CheckLibWithHeader('memcache', 'memcache.h', 'C'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_MEMCACHE_H', '-DHAVE_LIBMEMCACHE' ], LIBMEMCACHE = 'memcache')
- if env['with_sqlite3']:
- if autoconf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SQLITE3_H', '-DHAVE_LIBSQLITE3' ], LIBSQLITE3 = 'sqlite3')
- ol = env['LIBS']
- if autoconf.CheckLibWithHeader('fcgi', 'fastcgi.h', 'C'):
- autoconf.env.Append(LIBFCGI = 'fcgi')
- env['LIBS'] = ol
- ol = env['LIBS']
- if autoconf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'):
- autoconf.env.Append(LIBDL = 'dl')
- env['LIBS'] = ol
- if autoconf.CheckType('socklen_t', '#include <unistd.h>\n#include <sys/socket.h>\n#include <sys/types.h>'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SOCKLEN_T' ])
- if autoconf.CheckType('struct sockaddr_storage', '#include <sys/socket.h>\n'):
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_SOCKADDR_STORAGE' ])
- if autoconf.CheckStructMember():
- autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_TM_GMTOFF' ])
- env = autoconf.Finish()
- if env['with_lua']:
- oldlibs = env['LIBS']
- env.ParseConfig("pkg-config 'lua >= 5.0' --cflags --libs")
- lualibs = env['LIBS'][len(oldlibs):]
- env.Append(LIBLUA = lualibs)
- env.Append(CPPFLAGS = [ '-DHAVE_LUA_H' ])
- env['LIBS'] = oldlibs
- if env['with_pcre']:
- pcre_config = checkProgram(env, 'pcre', 'pcre-config')
- env.ParseConfig(pcre_config + ' --cflags --libs')
- env.Append(CPPFLAGS = [ '-DHAVE_PCRE_H', '-DHAVE_LIBPCRE' ], LIBPCRE = 'pcre')
- if env['with_xml']:
- xml2_config = checkProgram(env, 'xml', 'xml2-config')
- oldlib = env['LIBS']
- env['LIBS'] = []
- env.ParseConfig(xml2_config + ' --cflags --libs')
- env.Append(CPPFLAGS = [ '-DHAVE_LIBXML_H', '-DHAVE_LIBXML2' ], LIBXML2 = env['LIBS'])
- env['LIBS'] = oldlib
- if env['with_mysql']:
- mysql_config = checkProgram(env, 'mysql', 'mysql_config')
- oldlib = env['LIBS']
- env['LIBS'] = []
- env.ParseConfig(mysql_config + ' --cflags --libs')
- env.Append(CPPFLAGS = [ '-DHAVE_MYSQL_H', '-DHAVE_LIBMYSQL' ], LIBMYSQL = 'mysqlclient')
- env['LIBS'] = oldlib
- if re.compile("cygwin|mingw").search(env['PLATFORM']):
- env.Append(COMMON_LIB = 'bin')
- elif re.compile("darwin|aix").search(env['PLATFORM']):
- env.Append(COMMON_LIB = 'lib')
- else:
- env.Append(COMMON_LIB = False)
- versions = string.split(version, '.')
- version_id = int(versions[0]) << 16 | int(versions[1]) << 8 | int(versions[2])
- env.Append(CPPFLAGS = [
- '-DLIGHTTPD_VERSION_ID=' + str(version_id),
- '-DPACKAGE_NAME=\\"' + package + '\\"',
- '-DPACKAGE_VERSION=\\"' + version + '\\"',
- '-DLIBRARY_DIR="\\"${libdir}\\""',
- '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE', '-D_LARGE_FILES'
- ] )
- SConscript( 'src/SConscript', 'env', build_dir = 'build', duplicate = 0)
- SConscript( 'tests/SConscript', 'env' )
|