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