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