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 'pwd.h', 374 'stdint.h', 375 'stdlib.h', 376 'string.h', 377 'strings.h', 378 'sys/epoll.h', 379 'sys/inotify.h', 380 'sys/loadavg.h', 381 'sys/poll.h', 382 'sys/prctl.h', 383 'sys/procctl.h', 384 'sys/sendfile.h', 385 'sys/time.h', 386 'sys/wait.h', 387 'syslog.h', 388 'unistd.h', 389 'winsock2.h', 390 391 # "have" the last header if we include others before? 392 ['sys/types.h', 'sys/time.h', 'sys/resource.h'], 393 ['sys/types.h', 'netinet/in.h'], 394 ['sys/types.h', 'sys/event.h'], 395 ['sys/types.h', 'sys/mman.h'], 396 ['sys/types.h', 'sys/select.h'], 397 ['sys/types.h', 'sys/socket.h'], 398 ['sys/types.h', 'sys/uio.h'], 399 ['sys/types.h', 'sys/un.h'], 400 ]) 401 402 autoconf.haveFuncs([ 403 'arc4random_buf', 404 'chroot', 405 'clock_gettime', 406 'copy_file_range', 407 'epoll_ctl', 408 'explicit_bzero', 409 'explicit_memset', 410 'fork', 411 'getloadavg', 412 'getrlimit', 413 'getuid', 414 'gmtime_r', 415 'inet_aton', 416 'inet_pton', 417 'issetugid', 418 'jrand48', 419 'kqueue', 420 'localtime_r', 421 'lstat', 422 'madvise', 423 'malloc_trim', 424 'mallopt', 425 'mempcpy', 426 'memset_s', 427 'mkostemp', 428 'mmap', 429 'pipe2', 430 'poll', 431 'pread', 432 'preadv', 433 'pwrite', 434 'pwritev', 435 'select', 436 'sendfile', 437 'sendfile64', 438 'sigaction', 439 'signal', 440 'splice', 441 'srandom', 442 'strerror_r', 443 'timegm', 444 'writev', 445 ]) 446 autoconf.haveFunc('getentropy', 'sys/random.h') 447 autoconf.haveFunc('getrandom', 'linux/random.h') 448 if re.compile("sunos|solaris").search(env['PLATFORM']): 449 autoconf.haveCHeaders([ 450 'port.h', 451 'priv.h', 452 'sys/devpoll.h', 453 'sys/filio.h', 454 ]) 455 autoconf.haveFunc('port_create', 'port.h') 456 autoconf.haveFunc('sendfilev') 457 autoconf.haveFunc('setpflags', 'priv.h') 458 459 autoconf.haveTypes(Split('pid_t size_t off_t')) 460 461 # have crypt_r/crypt, and is -lcrypt needed? 462 if autoconf.CheckLib('crypt'): 463 autoconf.env.Append( 464 LIBCRYPT = 'crypt', 465 ) 466 with autoconf.restoreEnvLibs(): 467 autoconf.env['LIBS'] = ['crypt'] 468 autoconf.haveFuncs(['crypt', 'crypt_r']) 469 else: 470 autoconf.haveFuncs(['crypt', 'crypt_r']) 471 472 if autoconf.CheckType('socklen_t', '#include <unistd.h>\n#include <sys/socket.h>\n#include <sys/types.h>'): 473 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SOCKLEN_T' ]) 474 475 if autoconf.CheckType('struct sockaddr_storage', '#include <sys/socket.h>\n'): 476 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_SOCKADDR_STORAGE' ]) 477 478 if autoconf.CheckLibWithHeader('elftc', 'libelftc.h', 'c', 'elftc_copyfile(0, 1);'): 479 autoconf.env.Append( 480 CPPFLAGS = [ '-DHAVE_ELFTC_COPYFILE' ], 481 LIBS = [ 'elftc' ], 482 ) 483 484 if autoconf.CheckLibWithHeader('rt', 'time.h', 'c', 'clock_gettime(CLOCK_MONOTONIC, (struct timespec*)0);'): 485 autoconf.env.Append( 486 CPPFLAGS = [ '-DHAVE_CLOCK_GETTIME' ], 487 LIBS = [ 'rt' ], 488 ) 489 490 if autoconf.CheckIPv6(): 491 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_IPV6' ]) 492 493 if autoconf.CheckWeakSymbols(): 494 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_WEAK_SYMBOLS' ]) 495 496 if autoconf.CheckGmtOffInStructTm(): 497 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_TM_GMTOFF' ]) 498 499 if autoconf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'): 500 autoconf.env.Append(LIBDL = 'dl') 501 502 if env['with_bzip2']: 503 if not autoconf.CheckLibWithHeader('bz2', 'bzlib.h', 'C'): 504 fail("Couldn't find bz2") 505 autoconf.env.Append( 506 CPPFLAGS = [ '-DHAVE_BZLIB_H', '-DHAVE_LIBBZ2' ], 507 LIBBZ2 = 'bz2', 508 ) 509 510 if env['with_brotli']: 511 if not autoconf.CheckParseConfigForLib('LIBBROTLI', 'pkg-config --static --cflags --libs libbrotlienc'): 512 fail("Couldn't find libbrotlienc") 513 autoconf.env.Append( 514 CPPFLAGS = [ '-DHAVE_BROTLI_ENCODE_H', '-DHAVE_BROTLI' ], 515 ) 516 517 if env['with_dbi']: 518 if not autoconf.CheckLibWithHeader('dbi', 'dbi/dbi.h', 'C'): 519 fail("Couldn't find dbi") 520 autoconf.env.Append( 521 CPPFLAGS = [ '-DHAVE_DBI' ], 522 LIBDBI = 'dbi', 523 ) 524 525 if env['with_fam'] and not autoconf.CheckCHeader('sys/inotify.h'): 526 if not autoconf.CheckLibWithHeader('fam', 'fam.h', 'C'): 527 fail("Couldn't find fam") 528 autoconf.env.Append( 529 CPPFLAGS = [ '-DHAVE_FAM_H', '-DHAVE_LIBFAM' ], 530 LIBS = [ 'fam' ], 531 ) 532 autoconf.haveFunc('FAMNoExists') 533 534 if env['with_maxminddb']: 535 if not autoconf.CheckLibWithHeader('maxminddb', 'maxminddb.h', 'C'): 536 fail("Couldn't find maxminddb") 537 autoconf.env.Append( 538 CPPFLAGS = [ '-DHAVE_MAXMINDDB' ], 539 LIBMAXMINDDB = 'maxminddb', 540 ) 541 542 if env['with_krb5']: 543 if not autoconf.CheckLibWithHeader('krb5', 'krb5.h', 'C'): 544 fail("Couldn't find krb5") 545 if not autoconf.CheckLibWithHeader('gssapi_krb5', 'gssapi/gssapi_krb5.h', 'C'): 546 fail("Couldn't find gssapi_krb5") 547 autoconf.env.Append( 548 CPPFLAGS = [ '-DHAVE_KRB5' ], 549 LIBKRB5 = 'krb5', 550 LIBGSSAPI_KRB5 = 'gssapi_krb5', 551 ) 552 553 if env['with_ldap']: 554 if not autoconf.CheckLibWithHeader('ldap', 'ldap.h', 'C'): 555 fail("Couldn't find ldap") 556 if not autoconf.CheckLibWithHeader('lber', 'lber.h', 'C'): 557 fail("Couldn't find lber") 558 autoconf.env.Append( 559 CPPFLAGS = [ 560 '-DHAVE_LDAP_H', '-DHAVE_LIBLDAP', 561 '-DHAVE_LBER_H', '-DHAVE_LIBLBER', 562 ], 563 LIBLDAP = 'ldap', 564 LIBLBER = 'lber', 565 ) 566 567 if env['with_lua']: 568 found_lua = False 569 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']: 570 print("Searching for lua: " + lua_name + " >= 5.0") 571 if autoconf.CheckParseConfigForLib('LIBLUA', "pkg-config '" + lua_name + " >= 5.0' --cflags --libs"): 572 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LUA_H' ]) 573 found_lua = True 574 break 575 if not found_lua: 576 fail("Couldn't find any lua implementation") 577 578 if env['with_mysql']: 579 mysql_config = autoconf.checkProgram('mysql', 'mysql_config') 580 if not autoconf.CheckParseConfigForLib('LIBMYSQL', mysql_config + ' --cflags --libs'): 581 fail("Couldn't find mysql") 582 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_MYSQL' ]) 583 584 if env['with_nss']: 585 nss_config = autoconf.checkProgram('nss', 'nss-config') 586 if not autoconf.CheckParseConfigForLib('LIBNSS', nss_config + ' --cflags --libs'): 587 fail("Couldn't find NSS") 588 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_NSS3_NSS_H' ]) 589 590 if env['with_openssl']: 591 if not autoconf.CheckLibWithHeader('ssl', 'openssl/ssl.h', 'C'): 592 fail("Couldn't find openssl") 593 autoconf.env.Append( 594 CPPFLAGS = [ '-DHAVE_OPENSSL_SSL_H', '-DHAVE_LIBSSL'], 595 LIBSSL = 'ssl', 596 LIBSSLCRYPTO = 'crypto', 597 LIBCRYPTO = 'crypto', 598 ) 599 600 if env['with_wolfssl']: 601 if type(env['with_wolfssl']) is str: 602 autoconf.env.AppendUnique( 603 CPPPATH = [ env['with_wolfssl'] + '/include', 604 env['with_wolfssl'] + '/include/wolfssl' ], 605 LIBPATH = [ env['with_wolfssl'] + '/lib' ], 606 ) 607 if not autoconf.CheckLibWithHeader('wolfssl', 'wolfssl/ssl.h', 'C'): 608 fail("Couldn't find wolfssl") 609 autoconf.env.Append( 610 CPPFLAGS = [ '-DHAVE_WOLFSSL_SSL_H' ], 611 LIBWOLFSSL= 'wolfssl', 612 LIBCRYPTO = 'wolfssl', 613 ) 614 615 if env['with_mbedtls']: 616 if not autoconf.CheckLibWithHeader('mbedtls', 'mbedtls/ssl.h', 'C'): 617 fail("Couldn't find mbedtls") 618 autoconf.env.Append( 619 CPPFLAGS = [ '-DHAVE_LIBMBEDCRYPTO' ], 620 LIBMBEDTLS = 'mbedtls', 621 LIBMBEDX509 = 'mbedx509', 622 LIBMBEDCRYPTO = 'mbedcrypto', 623 LIBCRYPTO = 'mbedcrypto', 624 ) 625 626 if env['with_nettle']: 627 if not autoconf.CheckLibWithHeader('nettle', 'nettle/nettle-types.h', 'C'): 628 fail("Couldn't find Nettle") 629 autoconf.env.Append( 630 CPPFLAGS = [ '-DHAVE_NETTLE_NETTLE_TYPES_H' ], 631 LIBCRYPTO = 'nettle', 632 ) 633 634 if env['with_gnutls']: 635 if not autoconf.CheckLibWithHeader('gnutls', 'gnutls/crypto.h', 'C'): 636 fail("Couldn't find gnutls") 637 autoconf.env.Append( 638 CPPFLAGS = [ '-DHAVE_GNUTLS_CRYPTO_H' ], 639 LIBGNUTLS = 'gnutls', 640 ) 641 if not autoconf.env.exists('LIBCRYPTO'): 642 autoconf.env.Append( 643 LIBCRYPTO = 'gnutls', 644 ) 645 646 if env['with_pam']: 647 if not autoconf.CheckLibWithHeader('pam', 'security/pam_appl.h', 'C'): 648 fail("Couldn't find pam") 649 autoconf.env.Append( 650 CPPFLAGS = [ '-DHAVE_PAM' ], 651 LIBPAM = 'pam', 652 ) 653 654 if env['with_pcre2'] and not env['with_pcre']: 655 pcre2_config = autoconf.checkProgram('pcre2', 'pcre2-config') 656 if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre2_config + ' --cflags --libs8'): 657 fail("Couldn't find pcre2") 658 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE2_H', '-DHAVE_PCRE' ]) 659 elif env['with_pcre']: 660 pcre_config = autoconf.checkProgram('pcre', 'pcre-config') 661 if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre_config + ' --cflags --libs'): 662 fail("Couldn't find pcre") 663 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE_H', '-DHAVE_PCRE' ]) 664 665 if env['with_pgsql']: 666 if not autoconf.CheckParseConfigForLib('LIBPGSQL', 'pkg-config libpq --cflags --libs'): 667 fail("Couldn't find libpq") 668 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PGSQL' ]) 669 670 if env['with_sasl']: 671 if not autoconf.CheckLibWithHeader('sasl2', 'sasl/sasl.h', 'C'): 672 fail("Couldn't find libsasl2") 673 autoconf.env.Append( 674 CPPFLAGS = [ '-DHAVE_SASL' ], 675 LIBSASL = 'sasl2', 676 ) 677 678 if env['with_sqlite3']: 679 if not autoconf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'): 680 fail("Couldn't find sqlite3") 681 autoconf.env.Append( 682 CPPFLAGS = [ '-DHAVE_SQLITE3_H', '-DHAVE_LIBSQLITE3' ], 683 LIBSQLITE3 = 'sqlite3', 684 ) 685 686 if env['with_uuid']: 687 if not autoconf.CheckLibWithHeader('uuid', 'uuid/uuid.h', 'C'): 688 fail("Couldn't find uuid") 689 autoconf.env.Append( 690 CPPFLAGS = [ '-DHAVE_UUID_UUID_H', '-DHAVE_LIBUUID' ], 691 LIBUUID = 'uuid', 692 ) 693 694 if env['with_xml']: 695 xml2_config = autoconf.checkProgram('xml', 'xml2-config') 696 if not autoconf.CheckParseConfigForLib('LIBXML2', xml2_config + ' --cflags --libs'): 697 fail("Couldn't find xml2") 698 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LIBXML_H', '-DHAVE_LIBXML2' ]) 699 700 if env['with_xxhash']: 701 if not autoconf.CheckLibWithHeader('xxhash', 'xxhash.h', 'C'): 702 fail("Couldn't find xxhash") 703 autoconf.env.Append( 704 CPPFLAGS = [ '-DHAVE_XXHASH_H' ], 705 LIBXXHASH = 'xxhash', 706 ) 707 708 if env['with_zlib']: 709 if not autoconf.CheckLibWithHeader('z', 'zlib.h', 'C'): 710 fail("Couldn't find zlib") 711 autoconf.env.Append( 712 CPPFLAGS = [ '-DHAVE_ZLIB_H', '-DHAVE_LIBZ' ], 713 LIBZ = 'z', 714 ) 715 716 if env['with_zstd']: 717 if not autoconf.CheckLibWithHeader('zstd', 'zstd.h', 'C'): 718 fail("Couldn't find zstd") 719 autoconf.env.Append( 720 CPPFLAGS = [ '-DHAVE_ZSTD_H', '-DHAVE_ZSTD' ], 721 LIBZSTD = 'zstd', 722 ) 723 724 env = autoconf.Finish() 725 726if re.compile("cygwin|mingw|midipix").search(env['PLATFORM']): 727 env.Append(COMMON_LIB = 'bin') 728elif re.compile("darwin|aix").search(env['PLATFORM']): 729 env.Append(COMMON_LIB = 'lib') 730else: 731 env.Append(COMMON_LIB = False) 732 733versions = version.split('.') 734version_id = int(versions[0]) << 16 | int(versions[1]) << 8 | int(versions[2]) 735env.Append(CPPFLAGS = [ 736 '-DLIGHTTPD_VERSION_ID=' + hex(version_id), 737 '-DPACKAGE_NAME=\\"' + package + '\\"', 738 '-DPACKAGE_VERSION=\\"' + version + '\\"', 739 '-DLIBRARY_DIR="\\"${libdir}\\""', 740 ] ) 741 742SConscript('src/SConscript', exports = 'env', variant_dir = 'sconsbuild/build', duplicate = 0) 743SConscript('tests/SConscript', exports = 'env', variant_dir = 'sconsbuild/tests') 744