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.64' 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_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', 'no'), 253 PackageVariable('with_mysql', 'enable mysql support', 'no'), 254 BoolVariable('with_openssl', 'enable openssl support', 'no'), 255 PackageVariable('with_gnutls', 'enable GnuTLS support', 'no'), 256 PackageVariable('with_mbedtls', 'enable mbedTLS support', 'no'), 257 PackageVariable('with_nss', 'enable NSS crypto support', 'no'), 258 PackageVariable('with_wolfssl', 'enable wolfSSL support', 'no'), 259 BoolVariable('with_nettle', 'enable Nettle support', 'no'), 260 BoolVariable('with_pam', 'enable PAM auth support', 'no'), 261 PackageVariable('with_pcre2', 'enable pcre2 support', 'yes'), 262 PackageVariable('with_pcre', 'enable pcre support', 'no'), 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('-pipe -Wall -O2 -g -W -pedantic -Wunused -Wshadow -std=gnu99')) 293 294env.Append(CPPFLAGS = [ 295 '-D_TIME_BITS=64', 296 '-D_FILE_OFFSET_BITS=64', 297 '-D_LARGEFILE_SOURCE', 298 '-D_LARGE_FILES', 299 '-D_GNU_SOURCE', 300]) 301 302if env['with_all']: 303 for feature in vars.keys(): 304 # only enable 'with_*' flags 305 if not feature.startswith('with_'): continue 306 # don't overwrite manual arguments 307 if feature in vars.args: continue 308 # now activate 309 env[feature] = True 310 311# cache configure checks 312if 1: 313 autoconf = Autoconf(env) 314 315 if 'CFLAGS' in os.environ: 316 autoconf.env.Append(CCFLAGS = os.environ['CFLAGS']) 317 print(">> Appending custom build flags : " + os.environ['CFLAGS']) 318 319 if 'LDFLAGS' in os.environ: 320 autoconf.env.Append(LINKFLAGS = os.environ['LDFLAGS']) 321 print(">> Appending custom link flags : " + os.environ['LDFLAGS']) 322 323 if 'LIBS' in os.environ: 324 autoconf.env.Append(APPEND_LIBS = os.environ['LIBS']) 325 print(">> Appending custom libraries : " + os.environ['LIBS']) 326 else: 327 autoconf.env.Append(APPEND_LIBS = '') 328 329 autoconf.env.Append( 330 LIBBROTLI = '', 331 LIBBZ2 = '', 332 LIBCRYPT = '', 333 LIBCRYPTO = '', 334 LIBDBI = '', 335 LIBDL = '', 336 LIBGNUTLS = '', 337 LIBGSSAPI_KRB5 = '', 338 LIBKRB5 = '', 339 LIBLBER = '', 340 LIBLDAP = '', 341 LIBLUA = '', 342 LIBMBEDTLS = '', 343 LIBMBEDX509 = '', 344 LIBMBEDCRYPTO = '', 345 LIBMYSQL = '', 346 LIBNSS = '', 347 LIBPAM = '', 348 LIBPCRE = '', 349 LIBPGSQL = '', 350 LIBSASL = '', 351 LIBSQLITE3 = '', 352 LIBSSL = '', 353 LIBSSLCRYPTO = '', 354 LIBUUID = '', 355 LIBWOLFSSL = '', 356 LIBX509 = '', 357 LIBXML2 = '', 358 LIBXXHASH = '', 359 LIBZ = '', 360 LIBZSTD = '', 361 ) 362 363 autoconf.haveCHeaders([ 364 'arpa/inet.h', 365 'crypt.h', 366 'dlfcn.h', 367 'fcntl.h', 368 'getopt.h', 369 'inttypes.h', 370 'linux/random.h', 371 'malloc.h', 372 'poll.h', 373 'port.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/prctl.h', 386 'sys/procctl.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 'epoll_ctl', 411 'explicit_bzero', 412 'explicit_memset', 413 'fork', 414 'getloadavg', 415 'getrlimit', 416 'getuid', 417 'gmtime_r', 418 'inet_aton', 419 'inet_pton', 420 'issetugid', 421 'jrand48', 422 'kqueue', 423 'localtime_r', 424 'lstat', 425 'madvise', 426 'malloc_trim', 427 'mallopt', 428 'mempcpy', 429 'memset_s', 430 'mkostemp', 431 'mmap', 432 'pipe2', 433 'poll', 434 'port_create', 435 'pread', 436 'preadv', 437 'pwrite', 438 'pwritev', 439 'select', 440 'send_file', 441 'sendfile', 442 'sendfile64', 443 'sigaction', 444 'signal', 445 'splice', 446 'srandom', 447 'strerror_r', 448 'timegm', 449 'writev', 450 ]) 451 autoconf.haveFunc('getentropy', 'sys/random.h') 452 autoconf.haveFunc('getrandom', 'linux/random.h') 453 if re.compile("sunos|solaris").search(env['PLATFORM']): 454 autoconf.haveCHeader('priv.h') 455 autoconf.haveFunc('setpflags', 'priv.h') 456 457 autoconf.haveTypes(Split('pid_t size_t off_t')) 458 459 # have crypt_r/crypt, and is -lcrypt needed? 460 if autoconf.CheckLib('crypt'): 461 autoconf.env.Append( 462 LIBCRYPT = 'crypt', 463 ) 464 with autoconf.restoreEnvLibs(): 465 autoconf.env['LIBS'] = ['crypt'] 466 autoconf.haveFuncs(['crypt', 'crypt_r']) 467 else: 468 autoconf.haveFuncs(['crypt', 'crypt_r']) 469 470 if autoconf.CheckType('socklen_t', '#include <unistd.h>\n#include <sys/socket.h>\n#include <sys/types.h>'): 471 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SOCKLEN_T' ]) 472 473 if autoconf.CheckType('struct sockaddr_storage', '#include <sys/socket.h>\n'): 474 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_SOCKADDR_STORAGE' ]) 475 476 if autoconf.CheckLibWithHeader('elftc', 'libelftc.h', 'c', 'elftc_copyfile(0, 1);'): 477 autoconf.env.Append( 478 CPPFLAGS = [ '-DHAVE_ELFTC_COPYFILE' ], 479 LIBS = [ 'elftc' ], 480 ) 481 482 if autoconf.CheckLibWithHeader('rt', 'time.h', 'c', 'clock_gettime(CLOCK_MONOTONIC, (struct timespec*)0);'): 483 autoconf.env.Append( 484 CPPFLAGS = [ '-DHAVE_CLOCK_GETTIME' ], 485 LIBS = [ 'rt' ], 486 ) 487 488 if autoconf.CheckIPv6(): 489 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_IPV6' ]) 490 491 if autoconf.CheckWeakSymbols(): 492 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_WEAK_SYMBOLS' ]) 493 494 if autoconf.CheckGmtOffInStructTm(): 495 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_TM_GMTOFF' ]) 496 497 if autoconf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'): 498 autoconf.env.Append(LIBDL = 'dl') 499 500 if env['with_bzip2']: 501 if not autoconf.CheckLibWithHeader('bz2', 'bzlib.h', 'C'): 502 fail("Couldn't find bz2") 503 autoconf.env.Append( 504 CPPFLAGS = [ '-DHAVE_BZLIB_H', '-DHAVE_LIBBZ2' ], 505 LIBBZ2 = 'bz2', 506 ) 507 508 if env['with_brotli']: 509 if not autoconf.CheckParseConfigForLib('LIBBROTLI', 'pkg-config --static --cflags --libs libbrotlienc'): 510 fail("Couldn't find libbrotlienc") 511 autoconf.env.Append( 512 CPPFLAGS = [ '-DHAVE_BROTLI_ENCODE_H', '-DHAVE_BROTLI' ], 513 ) 514 515 if env['with_dbi']: 516 if not autoconf.CheckLibWithHeader('dbi', 'dbi/dbi.h', 'C'): 517 fail("Couldn't find dbi") 518 autoconf.env.Append( 519 CPPFLAGS = [ '-DHAVE_DBI' ], 520 LIBDBI = 'dbi', 521 ) 522 523 if env['with_fam'] and not autoconf.CheckCHeader('sys/inotify.h'): 524 if not autoconf.CheckLibWithHeader('fam', 'fam.h', 'C'): 525 fail("Couldn't find fam") 526 autoconf.env.Append( 527 CPPFLAGS = [ '-DHAVE_FAM_H', '-DHAVE_LIBFAM' ], 528 LIBS = [ 'fam' ], 529 ) 530 autoconf.haveFunc('FAMNoExists') 531 532 if env['with_maxminddb']: 533 if not autoconf.CheckLibWithHeader('maxminddb', 'maxminddb.h', 'C'): 534 fail("Couldn't find maxminddb") 535 autoconf.env.Append( 536 CPPFLAGS = [ '-DHAVE_MAXMINDDB' ], 537 LIBMAXMINDDB = 'maxminddb', 538 ) 539 540 if env['with_krb5']: 541 if not autoconf.CheckLibWithHeader('krb5', 'krb5.h', 'C'): 542 fail("Couldn't find krb5") 543 if not autoconf.CheckLibWithHeader('gssapi_krb5', 'gssapi/gssapi_krb5.h', 'C'): 544 fail("Couldn't find gssapi_krb5") 545 autoconf.env.Append( 546 CPPFLAGS = [ '-DHAVE_KRB5' ], 547 LIBKRB5 = 'krb5', 548 LIBGSSAPI_KRB5 = 'gssapi_krb5', 549 ) 550 551 if env['with_ldap']: 552 if not autoconf.CheckLibWithHeader('ldap', 'ldap.h', 'C'): 553 fail("Couldn't find ldap") 554 if not autoconf.CheckLibWithHeader('lber', 'lber.h', 'C'): 555 fail("Couldn't find lber") 556 autoconf.env.Append( 557 CPPFLAGS = [ 558 '-DHAVE_LDAP_H', '-DHAVE_LIBLDAP', 559 '-DHAVE_LBER_H', '-DHAVE_LIBLBER', 560 ], 561 LIBLDAP = 'ldap', 562 LIBLBER = 'lber', 563 ) 564 565 if env['with_lua']: 566 found_lua = False 567 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']: 568 print("Searching for lua: " + lua_name + " >= 5.0") 569 if autoconf.CheckParseConfigForLib('LIBLUA', "pkg-config '" + lua_name + " >= 5.0' --cflags --libs"): 570 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LUA_H' ]) 571 found_lua = True 572 break 573 if not found_lua: 574 fail("Couldn't find any lua implementation") 575 576 if env['with_mysql']: 577 mysql_config = autoconf.checkProgram('mysql', 'mysql_config') 578 if not autoconf.CheckParseConfigForLib('LIBMYSQL', mysql_config + ' --cflags --libs'): 579 fail("Couldn't find mysql") 580 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_MYSQL' ]) 581 582 if env['with_nss']: 583 nss_config = autoconf.checkProgram('nss', 'nss-config') 584 if not autoconf.CheckParseConfigForLib('LIBNSS', nss_config + ' --cflags --libs'): 585 fail("Couldn't find NSS") 586 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_NSS3_NSS_H' ]) 587 588 if env['with_openssl']: 589 if not autoconf.CheckLibWithHeader('ssl', 'openssl/ssl.h', 'C'): 590 fail("Couldn't find openssl") 591 autoconf.env.Append( 592 CPPFLAGS = [ '-DHAVE_OPENSSL_SSL_H', '-DHAVE_LIBSSL'], 593 LIBSSL = 'ssl', 594 LIBSSLCRYPTO = 'crypto', 595 LIBCRYPTO = 'crypto', 596 ) 597 598 if env['with_wolfssl']: 599 if type(env['with_wolfssl']) is str: 600 autoconf.env.AppendUnique( 601 CPPPATH = [ env['with_wolfssl'] + '/include', 602 env['with_wolfssl'] + '/include/wolfssl' ], 603 LIBPATH = [ env['with_wolfssl'] + '/lib' ], 604 ) 605 if not autoconf.CheckLibWithHeader('wolfssl', 'wolfssl/ssl.h', 'C'): 606 fail("Couldn't find wolfssl") 607 autoconf.env.Append( 608 CPPFLAGS = [ '-DHAVE_WOLFSSL_SSL_H' ], 609 LIBWOLFSSL= 'wolfssl', 610 LIBCRYPTO = 'wolfssl', 611 ) 612 613 if env['with_mbedtls']: 614 if not autoconf.CheckLibWithHeader('mbedtls', 'mbedtls/ssl.h', 'C'): 615 fail("Couldn't find mbedtls") 616 autoconf.env.Append( 617 CPPFLAGS = [ '-DHAVE_LIBMBEDCRYPTO' ], 618 LIBMBEDTLS = 'mbedtls', 619 LIBMBEDX509 = 'mbedx509', 620 LIBMBEDCRYPTO = 'mbedcrypto', 621 LIBCRYPTO = 'mbedcrypto', 622 ) 623 624 if env['with_nettle']: 625 if not autoconf.CheckLibWithHeader('nettle', 'nettle/nettle-types.h', 'C'): 626 fail("Couldn't find Nettle") 627 autoconf.env.Append( 628 CPPFLAGS = [ '-DHAVE_NETTLE_NETTLE_TYPES_H' ], 629 LIBCRYPTO = 'nettle', 630 ) 631 632 if env['with_gnutls']: 633 if not autoconf.CheckLibWithHeader('gnutls', 'gnutls/crypto.h', 'C'): 634 fail("Couldn't find gnutls") 635 autoconf.env.Append( 636 CPPFLAGS = [ '-DHAVE_GNUTLS_CRYPTO_H' ], 637 LIBGNUTLS = 'gnutls', 638 ) 639 if not autoconf.env.exists('LIBCRYPTO'): 640 autoconf.env.Append( 641 LIBCRYPTO = 'gnutls', 642 ) 643 644 if env['with_pam']: 645 if not autoconf.CheckLibWithHeader('pam', 'security/pam_appl.h', 'C'): 646 fail("Couldn't find pam") 647 autoconf.env.Append( 648 CPPFLAGS = [ '-DHAVE_PAM' ], 649 LIBPAM = 'pam', 650 ) 651 652 if env['with_pcre2'] and not env['with_pcre']: 653 pcre2_config = autoconf.checkProgram('pcre2', 'pcre2-config') 654 if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre2_config + ' --cflags --libs8'): 655 fail("Couldn't find pcre2") 656 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE2_H', '-DHAVE_PCRE' ]) 657 elif env['with_pcre']: 658 pcre_config = autoconf.checkProgram('pcre', 'pcre-config') 659 if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre_config + ' --cflags --libs'): 660 fail("Couldn't find pcre") 661 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE_H', '-DHAVE_PCRE' ]) 662 663 if env['with_pgsql']: 664 if not autoconf.CheckParseConfigForLib('LIBPGSQL', 'pkg-config libpq --cflags --libs'): 665 fail("Couldn't find libpq") 666 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PGSQL' ]) 667 668 if env['with_sasl']: 669 if not autoconf.CheckLibWithHeader('sasl2', 'sasl/sasl.h', 'C'): 670 fail("Couldn't find libsasl2") 671 autoconf.env.Append( 672 CPPFLAGS = [ '-DHAVE_SASL' ], 673 LIBSASL = 'sasl2', 674 ) 675 676 if env['with_sqlite3']: 677 if not autoconf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'): 678 fail("Couldn't find sqlite3") 679 autoconf.env.Append( 680 CPPFLAGS = [ '-DHAVE_SQLITE3_H', '-DHAVE_LIBSQLITE3' ], 681 LIBSQLITE3 = 'sqlite3', 682 ) 683 684 if env['with_uuid']: 685 if not autoconf.CheckLibWithHeader('uuid', 'uuid/uuid.h', 'C'): 686 fail("Couldn't find uuid") 687 autoconf.env.Append( 688 CPPFLAGS = [ '-DHAVE_UUID_UUID_H', '-DHAVE_LIBUUID' ], 689 LIBUUID = 'uuid', 690 ) 691 692 if env['with_xml']: 693 xml2_config = autoconf.checkProgram('xml', 'xml2-config') 694 if not autoconf.CheckParseConfigForLib('LIBXML2', xml2_config + ' --cflags --libs'): 695 fail("Couldn't find xml2") 696 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LIBXML_H', '-DHAVE_LIBXML2' ]) 697 698 if env['with_xxhash']: 699 if not autoconf.CheckLibWithHeader('xxhash', 'xxhash.h', 'C'): 700 fail("Couldn't find xxhash") 701 autoconf.env.Append( 702 CPPFLAGS = [ '-DHAVE_XXHASH_H' ], 703 LIBXXHASH = 'xxhash', 704 ) 705 706 if env['with_zlib']: 707 if not autoconf.CheckLibWithHeader('z', 'zlib.h', 'C'): 708 fail("Couldn't find zlib") 709 autoconf.env.Append( 710 CPPFLAGS = [ '-DHAVE_ZLIB_H', '-DHAVE_LIBZ' ], 711 LIBZ = 'z', 712 ) 713 714 if env['with_zstd']: 715 if not autoconf.CheckLibWithHeader('zstd', 'zstd.h', 'C'): 716 fail("Couldn't find zstd") 717 autoconf.env.Append( 718 CPPFLAGS = [ '-DHAVE_ZSTD_H', '-DHAVE_ZSTD' ], 719 LIBZSTD = 'zstd', 720 ) 721 722 env = autoconf.Finish() 723 724if re.compile("cygwin|mingw|midipix").search(env['PLATFORM']): 725 env.Append(COMMON_LIB = 'bin') 726elif re.compile("darwin|aix").search(env['PLATFORM']): 727 env.Append(COMMON_LIB = 'lib') 728else: 729 env.Append(COMMON_LIB = False) 730 731versions = version.split('.') 732version_id = int(versions[0]) << 16 | int(versions[1]) << 8 | int(versions[2]) 733env.Append(CPPFLAGS = [ 734 '-DLIGHTTPD_VERSION_ID=' + hex(version_id), 735 '-DPACKAGE_NAME=\\"' + package + '\\"', 736 '-DPACKAGE_VERSION=\\"' + version + '\\"', 737 '-DLIBRARY_DIR="\\"${libdir}\\""', 738 ] ) 739 740SConscript('src/SConscript', exports = 'env', variant_dir = 'sconsbuild/build', duplicate = 0) 741SConscript('tests/SConscript', exports = 'env', variant_dir = 'sconsbuild/tests') 742