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