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.59' 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 Exception as e: 144 print(e.message, file=sys.stderr) 145 return False 146 147 def CheckParseConfigForLib(self, lib, *args, **kw): 148 with self.restoreEnvLibs(): 149 self.env['LIBS'] = [] 150 if not self.CheckParseConfig(*args, **kw): 151 return False 152 self.env.Append(**{lib: self.env['LIBS']}) 153 return True 154 155 @staticmethod 156 def __checkGmtOffInStructTm(context): 157 source = """ 158#include <time.h> 159int main() { 160 struct tm a; 161 a.tm_gmtoff = 0; 162 return 0; 163} 164""" 165 context.Message('Checking for tm_gmtoff in struct tm...') 166 result = context.TryLink(source, '.c') 167 context.Result(result) 168 169 return result 170 171 @staticmethod 172 def __checkIPv6(context): 173 source = """ 174#include <sys/types.h> 175#include <sys/socket.h> 176#include <netinet/in.h> 177 178int main() { 179 struct sockaddr_in6 s; struct in6_addr t=in6addr_any; int i=AF_INET6; s; t.s6_addr[0] = 0; 180 return 0; 181} 182""" 183 context.Message('Checking for IPv6 support...') 184 result = context.TryLink(source, '.c') 185 context.Result(result) 186 187 return result 188 189 @staticmethod 190 def __checkWeakSymbols(context): 191 source = """ 192__attribute__((weak)) void __dummy(void *x) { } 193int main() { 194 void *x; 195 __dummy(x); 196} 197""" 198 context.Message('Checking for weak symbol support...') 199 result = context.TryLink(source, '.c') 200 context.Result(result) 201 202 return result 203 204 def checkProgram(self, withname, progname): 205 withname = 'with_' + withname 206 binpath = None 207 208 if self.env[withname] != 1: 209 binpath = self.env[withname] 210 else: 211 prog = self.env.Detect(progname) 212 if prog: 213 binpath = self.env.WhereIs(prog) 214 215 if binpath: 216 mode = os.stat(binpath)[ST_MODE] 217 if S_ISDIR(mode): 218 fail("* error: path `%s' is a directory" % (binpath)) 219 if not S_ISREG(mode): 220 fail("* error: path `%s' is not a file or not exists" % (binpath)) 221 222 if not binpath: 223 fail("* error: can't find program `%s'" % (progname)) 224 225 return binpath 226 227VariantDir('sconsbuild/build', 'src', duplicate = 0) 228VariantDir('sconsbuild/tests', 'tests', duplicate = 0) 229 230vars = Variables() 231vars.AddVariables( 232 ('prefix', 'prefix', '/usr/local'), 233 ('bindir', 'binary directory', '${prefix}/bin'), 234 ('sbindir', 'binary directory', '${prefix}/sbin'), 235 ('libdir', 'library directory', '${prefix}/lib'), 236 PathVariable('CC', 'path to the c-compiler', None), 237 BoolVariable('build_dynamic', 'enable dynamic build', 'yes'), 238 BoolVariable('build_static', 'enable static build', 'no'), 239 BoolVariable('build_fullstatic', 'enable fullstatic build', 'no'), 240 241 BoolVariable('with_bzip2', 'enable bzip2 compression', 'no'), 242 BoolVariable('with_brotli', 'enable brotli compression', 'no'), 243 PackageVariable('with_dbi', 'enable dbi support', 'no'), 244 BoolVariable('with_fam', 'enable FAM/gamin support', 'no'), 245 BoolVariable('with_gdbm', 'enable gdbm support', 'no'), 246 BoolVariable('with_geoip', 'enable GeoIP 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 for mod_cml', 'no'), 253 BoolVariable('with_memcached', 'enable memcached 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_pcre', 'enable pcre support', 'yes'), 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('-Wall -O2 -g -W -pedantic -Wunused -Wshadow -std=gnu99')) 293 294env.Append(CPPFLAGS = [ 295 '-D_FILE_OFFSET_BITS=64', 296 '-D_LARGEFILE_SOURCE', 297 '-D_LARGE_FILES', 298 '-D_GNU_SOURCE', 299]) 300 301if env['with_all']: 302 for feature in vars.keys(): 303 # only enable 'with_*' flags 304 if not feature.startswith('with_'): continue 305 # don't overwrite manual arguments 306 if feature in vars.args: continue 307 # now activate 308 env[feature] = True 309 310# cache configure checks 311if 1: 312 autoconf = Autoconf(env) 313 314 if 'CFLAGS' in os.environ: 315 autoconf.env.Append(CCFLAGS = os.environ['CFLAGS']) 316 print(">> Appending custom build flags : " + os.environ['CFLAGS']) 317 318 if 'LDFLAGS' in os.environ: 319 autoconf.env.Append(LINKFLAGS = os.environ['LDFLAGS']) 320 print(">> Appending custom link flags : " + os.environ['LDFLAGS']) 321 322 if 'LIBS' in os.environ: 323 autoconf.env.Append(APPEND_LIBS = os.environ['LIBS']) 324 print(">> Appending custom libraries : " + os.environ['LIBS']) 325 else: 326 autoconf.env.Append(APPEND_LIBS = '') 327 328 autoconf.env.Append( 329 LIBBROTLI = '', 330 LIBBZ2 = '', 331 LIBCRYPT = '', 332 LIBCRYPTO = '', 333 LIBDBI = '', 334 LIBDL = '', 335 LIBGDBM = '', 336 LIBGNUTLS = '', 337 LIBGSSAPI_KRB5 = '', 338 LIBKRB5 = '', 339 LIBLBER = '', 340 LIBLDAP = '', 341 LIBLUA = '', 342 LIBMBEDTLS = '', 343 LIBMBEDX509 = '', 344 LIBMBEDCRYPTO = '', 345 LIBMEMCACHED = '', 346 LIBMYSQL = '', 347 LIBNSS = '', 348 LIBPAM = '', 349 LIBPCRE = '', 350 LIBPGSQL = '', 351 LIBSASL = '', 352 LIBSQLITE3 = '', 353 LIBSSL = '', 354 LIBSSLCRYPTO = '', 355 LIBUUID = '', 356 LIBWOLFSSL = '', 357 LIBX509 = '', 358 LIBXML2 = '', 359 LIBXXHASH = '', 360 LIBZ = '', 361 LIBZSTD = '', 362 ) 363 364 autoconf.haveCHeaders([ 365 'arpa/inet.h', 366 'crypt.h', 367 'fcntl.h', 368 'getopt.h', 369 'inttypes.h', 370 'linux/random.h', 371 'poll.h', 372 'pwd.h', 373 'stdint.h', 374 'stdlib.h', 375 'string.h', 376 'strings.h', 377 'sys/devpoll.h', 378 'sys/epoll.h', 379 'sys/filio.h', 380 'sys/inotify.h', 381 'sys/loadavg.h', 382 'sys/poll.h', 383 'sys/port.h', 384 'sys/prctl.h', 385 'sys/sendfile.h', 386 'sys/time.h', 387 'sys/wait.h', 388 'syslog.h', 389 'unistd.h', 390 'winsock2.h', 391 392 # "have" the last header if we include others before? 393 ['sys/types.h', 'sys/time.h', 'sys/resource.h'], 394 ['sys/types.h', 'netinet/in.h'], 395 ['sys/types.h', 'sys/event.h'], 396 ['sys/types.h', 'sys/mman.h'], 397 ['sys/types.h', 'sys/select.h'], 398 ['sys/types.h', 'sys/socket.h'], 399 ['sys/types.h', 'sys/uio.h'], 400 ['sys/types.h', 'sys/un.h'], 401 ]) 402 403 autoconf.haveFuncs([ 404 'arc4random_buf', 405 'chroot', 406 'clock_gettime', 407 'copy_file_range', 408 'dup2', 409 'epoll_ctl', 410 'explicit_bzero', 411 'explicit_memset', 412 'fork', 413 'getcwd', 414 'gethostbyname', 415 'getloadavg', 416 'getopt', 417 'getrlimit', 418 'getuid', 419 'inet_aton', 420 'inet_ntop', 421 'inet_pton', 422 'issetugid', 423 'jrand48', 424 'kqueue', 425 'localtime_r', 426 'lstat', 427 'madvise', 428 'memset_s', 429 'memset', 430 'mmap', 431 'munmap', 432 'pathconf', 433 'pipe2', 434 'poll', 435 'port_create', 436 'posix_fadvise', 437 'prctl', 438 'select', 439 'send_file', 440 'sendfile', 441 'sendfile64', 442 'sigaction', 443 'signal', 444 'socket', 445 'srandom', 446 'stat', 447 'strchr', 448 'strdup', 449 'strerror', 450 'strftime', 451 'strstr', 452 'strtol', 453 'timegm', 454 'writev', 455 ]) 456 autoconf.haveFunc('getentropy', 'sys/random.h') 457 autoconf.haveFunc('getrandom', 'linux/random.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 CPPFLAGS = [ '-DHAVE_LIBCRYPT' ], 465 LIBCRYPT = 'crypt', 466 ) 467 with autoconf.restoreEnvLibs(): 468 autoconf.env['LIBS'] = ['crypt'] 469 autoconf.haveFuncs(['crypt', 'crypt_r']) 470 else: 471 autoconf.haveFuncs(['crypt', 'crypt_r']) 472 473 if autoconf.CheckType('socklen_t', '#include <unistd.h>\n#include <sys/socket.h>\n#include <sys/types.h>'): 474 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_SOCKLEN_T' ]) 475 476 if autoconf.CheckType('struct sockaddr_storage', '#include <sys/socket.h>\n'): 477 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_SOCKADDR_STORAGE' ]) 478 479 if autoconf.CheckLibWithHeader('elftc', 'libelftc.h', 'c', 'elftc_copyfile(0, 1);'): 480 autoconf.env.Append( 481 CPPFLAGS = [ '-DHAVE_ELFTC_COPYFILE' ], 482 LIBS = [ 'elftc' ], 483 ) 484 485 if autoconf.CheckLibWithHeader('rt', 'time.h', 'c', 'clock_gettime(CLOCK_MONOTONIC, (struct timespec*)0);'): 486 autoconf.env.Append( 487 CPPFLAGS = [ '-DHAVE_CLOCK_GETTIME' ], 488 LIBS = [ 'rt' ], 489 ) 490 491 if autoconf.CheckIPv6(): 492 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_IPV6' ]) 493 494 if autoconf.CheckWeakSymbols(): 495 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_WEAK_SYMBOLS' ]) 496 497 if autoconf.CheckGmtOffInStructTm(): 498 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_STRUCT_TM_GMTOFF' ]) 499 500 if autoconf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'): 501 autoconf.env.Append(LIBDL = 'dl') 502 503 if env['with_bzip2']: 504 if not autoconf.CheckLibWithHeader('bz2', 'bzlib.h', 'C'): 505 fail("Couldn't find bz2") 506 autoconf.env.Append( 507 CPPFLAGS = [ '-DHAVE_BZLIB_H', '-DHAVE_LIBBZ2' ], 508 LIBBZ2 = 'bz2', 509 ) 510 511 if env['with_brotli']: 512 if not autoconf.CheckParseConfigForLib('LIBBROTLI', 'pkg-config --static --cflags --libs libbrotlienc'): 513 fail("Couldn't find libbrotlienc") 514 autoconf.env.Append( 515 CPPFLAGS = [ '-DHAVE_BROTLI_ENCODE_H', '-DHAVE_BROTLI' ], 516 ) 517 518 if env['with_dbi']: 519 if not autoconf.CheckLibWithHeader('dbi', 'dbi/dbi.h', 'C'): 520 fail("Couldn't find dbi") 521 autoconf.env.Append( 522 CPPFLAGS = [ '-DHAVE_DBI_H', '-DHAVE_LIBDBI' ], 523 LIBDBI = 'dbi', 524 ) 525 526 if env['with_fam'] and not self.CheckCHeader('sys/inotify.h'): 527 if not autoconf.CheckLibWithHeader('fam', 'fam.h', 'C'): 528 fail("Couldn't find fam") 529 autoconf.env.Append( 530 CPPFLAGS = [ '-DHAVE_FAM_H', '-DHAVE_LIBFAM' ], 531 LIBS = [ 'fam' ], 532 ) 533 autoconf.haveFunc('FAMNoExists') 534 535 if env['with_gdbm']: 536 if not autoconf.CheckLibWithHeader('gdbm', 'gdbm.h', 'C'): 537 fail("Couldn't find gdbm") 538 autoconf.env.Append( 539 CPPFLAGS = [ '-DHAVE_GDBM_H', '-DHAVE_GDBM' ], 540 LIBGDBM = 'gdbm', 541 ) 542 543 if env['with_geoip']: 544 if not autoconf.CheckLibWithHeader('GeoIP', 'GeoIP.h', 'C'): 545 fail("Couldn't find geoip") 546 autoconf.env.Append( 547 CPPFLAGS = [ '-DHAVE_GEOIP' ], 548 LIBGEOIP = 'GeoIP', 549 ) 550 551 if env['with_maxminddb']: 552 if not autoconf.CheckLibWithHeader('maxminddb', 'maxminddb.h', 'C'): 553 fail("Couldn't find maxminddb") 554 autoconf.env.Append( 555 CPPFLAGS = [ '-DHAVE_MAXMINDDB' ], 556 LIBMAXMINDDB = 'maxminddb', 557 ) 558 559 if env['with_krb5']: 560 if not autoconf.CheckLibWithHeader('krb5', 'krb5.h', 'C'): 561 fail("Couldn't find krb5") 562 if not autoconf.CheckLibWithHeader('gssapi_krb5', 'gssapi/gssapi_krb5.h', 'C'): 563 fail("Couldn't find gssapi_krb5") 564 autoconf.env.Append( 565 CPPFLAGS = [ '-DHAVE_KRB5' ], 566 LIBKRB5 = 'krb5', 567 LIBGSSAPI_KRB5 = 'gssapi_krb5', 568 ) 569 570 if env['with_ldap']: 571 if not autoconf.CheckLibWithHeader('ldap', 'ldap.h', 'C'): 572 fail("Couldn't find ldap") 573 if not autoconf.CheckLibWithHeader('lber', 'lber.h', 'C'): 574 fail("Couldn't find lber") 575 autoconf.env.Append( 576 CPPFLAGS = [ 577 '-DHAVE_LDAP_H', '-DHAVE_LIBLDAP', 578 '-DHAVE_LBER_H', '-DHAVE_LIBLBER', 579 ], 580 LIBLDAP = 'ldap', 581 LIBLBER = 'lber', 582 ) 583 584 if env['with_lua']: 585 found_lua = False 586 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']: 587 print("Searching for lua: " + lua_name + " >= 5.0") 588 if autoconf.CheckParseConfigForLib('LIBLUA', "pkg-config '" + lua_name + " >= 5.0' --cflags --libs"): 589 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LUA_H' ]) 590 found_lua = True 591 break 592 if not found_lua: 593 fail("Couldn't find any lua implementation") 594 595 if env['with_memcached']: 596 if not autoconf.CheckLibWithHeader('memcached', 'libmemcached/memcached.h', 'C'): 597 fail("Couldn't find memcached") 598 autoconf.env.Append( 599 CPPFLAGS = [ '-DUSE_MEMCACHED' ], 600 LIBMEMCACHED = 'memcached', 601 ) 602 603 if env['with_mysql']: 604 mysql_config = autoconf.checkProgram('mysql', 'mysql_config') 605 if not autoconf.CheckParseConfigForLib('LIBMYSQL', mysql_config + ' --cflags --libs'): 606 fail("Couldn't find mysql") 607 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_MYSQL_H', '-DHAVE_LIBMYSQL' ]) 608 609 if env['with_nss']: 610 nss_config = autoconf.checkProgram('nss', 'nss-config') 611 if not autoconf.CheckParseConfigForLib('LIBNSS', nss_config + ' --cflags --libs'): 612 fail("Couldn't find NSS") 613 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_NSS3_NSS_H' ]) 614 615 if env['with_openssl']: 616 if not autoconf.CheckLibWithHeader('ssl', 'openssl/ssl.h', 'C'): 617 fail("Couldn't find openssl") 618 autoconf.env.Append( 619 CPPFLAGS = [ '-DHAVE_OPENSSL_SSL_H', '-DHAVE_LIBSSL'], 620 LIBSSL = 'ssl', 621 LIBSSLCRYPTO = 'crypto', 622 LIBCRYPTO = 'crypto', 623 ) 624 625 if env['with_wolfssl']: 626 if type(env['with_wolfssl']) is str: 627 autoconf.env.AppendUnique( 628 CPPPATH = [ env['with_wolfssl'] + '/include', 629 env['with_wolfssl'] + '/include/wolfssl' ], 630 LIBPATH = [ env['with_wolfssl'] + '/lib' ], 631 ) 632 if not autoconf.CheckLibWithHeader('wolfssl', 'wolfssl/ssl.h', 'C'): 633 fail("Couldn't find wolfssl") 634 autoconf.env.Append( 635 CPPFLAGS = [ '-DHAVE_WOLFSSL_SSL_H' ], 636 LIBWOLFSSL= 'wolfssl', 637 LIBCRYPTO = 'wolfssl', 638 ) 639 640 if env['with_mbedtls']: 641 if not autoconf.CheckLibWithHeader('mbedtls', 'mbedtls/ssl.h', 'C'): 642 fail("Couldn't find mbedtls") 643 autoconf.env.Append( 644 CPPFLAGS = [ '-DHAVE_LIBMBEDCRYPTO' ], 645 LIBMBEDTLS = 'mbedtls', 646 LIBMBEDX509 = 'mbedx509', 647 LIBMBEDCRYPTO = 'mbedcrypto', 648 LIBCRYPTO = 'mbedcrypto', 649 ) 650 651 if env['with_nettle']: 652 if not autoconf.CheckLibWithHeader('nettle', 'nettle/nettle-types.h', 'C'): 653 fail("Couldn't find Nettle") 654 autoconf.env.Append( 655 CPPFLAGS = [ '-DHAVE_NETTLE_NETTLE_TYPES_H' ], 656 LIBCRYPTO = 'nettle', 657 ) 658 659 if env['with_gnutls']: 660 if not autoconf.CheckLibWithHeader('gnutls', 'gnutls/crypto.h', 'C'): 661 fail("Couldn't find gnutls") 662 autoconf.env.Append( 663 CPPFLAGS = [ '-DHAVE_GNUTLS_CRYPTO_H' ], 664 LIBGNUTLS = 'gnutls', 665 ) 666 if not autoconf.env.exists('LIBCRYPTO'): 667 autoconf.env.Append( 668 LIBCRYPTO = 'gnutls', 669 ) 670 671 if env['with_pam']: 672 if not autoconf.CheckLibWithHeader('pam', 'security/pam_appl.h', 'C'): 673 fail("Couldn't find pam") 674 autoconf.env.Append( 675 CPPFLAGS = [ '-DHAVE_PAM' ], 676 LIBPAM = 'pam', 677 ) 678 679 if env['with_pcre']: 680 pcre_config = autoconf.checkProgram('pcre', 'pcre-config') 681 if not autoconf.CheckParseConfigForLib('LIBPCRE', pcre_config + ' --cflags --libs'): 682 fail("Couldn't find pcre") 683 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PCRE_H', '-DHAVE_LIBPCRE' ]) 684 685 if env['with_pgsql']: 686 if not autoconf.CheckParseConfigForLib('LIBPGSQL', 'pkg-config libpq --cflags --libs'): 687 fail("Couldn't find libpq") 688 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_PGSQL_H', '-DHAVE_LIBPGSQL' ]) 689 690 if env['with_sasl']: 691 if not autoconf.CheckLibWithHeader('sasl2', 'sasl/sasl.h', 'C'): 692 fail("Couldn't find libsasl2") 693 autoconf.env.Append( 694 CPPFLAGS = [ '-DHAVE_SASL' ], 695 LIBSASL = 'sasl2', 696 ) 697 698 if env['with_sqlite3']: 699 if not autoconf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'): 700 fail("Couldn't find sqlite3") 701 autoconf.env.Append( 702 CPPFLAGS = [ '-DHAVE_SQLITE3_H', '-DHAVE_LIBSQLITE3' ], 703 LIBSQLITE3 = 'sqlite3', 704 ) 705 706 if env['with_uuid']: 707 if not autoconf.CheckLibWithHeader('uuid', 'uuid/uuid.h', 'C'): 708 fail("Couldn't find uuid") 709 autoconf.env.Append( 710 CPPFLAGS = [ '-DHAVE_UUID_UUID_H', '-DHAVE_LIBUUID' ], 711 LIBUUID = 'uuid', 712 ) 713 714 if env['with_xml']: 715 xml2_config = autoconf.checkProgram('xml', 'xml2-config') 716 if not autoconf.CheckParseConfigForLib('LIBXML2', xml2_config + ' --cflags --libs'): 717 fail("Couldn't find xml2") 718 autoconf.env.Append(CPPFLAGS = [ '-DHAVE_LIBXML_H', '-DHAVE_LIBXML2' ]) 719 720 if env['with_xxhash']: 721 if not autoconf.CheckLibWithHeader('xxhash', 'xxhash.h', 'C'): 722 fail("Couldn't find xxhash") 723 autoconf.env.Append( 724 CPPFLAGS = [ '-DHAVE_XXHASH_H' ], 725 LIBXXHASH = 'xxhash', 726 ) 727 728 if env['with_zlib']: 729 if not autoconf.CheckLibWithHeader('z', 'zlib.h', 'C'): 730 fail("Couldn't find zlib") 731 autoconf.env.Append( 732 CPPFLAGS = [ '-DHAVE_ZLIB_H', '-DHAVE_LIBZ' ], 733 LIBZ = 'z', 734 ) 735 736 if env['with_zstd']: 737 if not autoconf.CheckLibWithHeader('zstd', 'zstd.h', 'C'): 738 fail("Couldn't find zstd") 739 autoconf.env.Append( 740 CPPFLAGS = [ '-DHAVE_ZSTD_H', '-DHAVE_ZSTD' ], 741 LIBZSTD = 'zstd', 742 ) 743 744 env = autoconf.Finish() 745 746if re.compile("cygwin|mingw|midipix").search(env['PLATFORM']): 747 env.Append(COMMON_LIB = 'bin') 748elif re.compile("darwin|aix").search(env['PLATFORM']): 749 env.Append(COMMON_LIB = 'lib') 750else: 751 env.Append(COMMON_LIB = False) 752 753versions = version.split('.') 754version_id = int(versions[0]) << 16 | int(versions[1]) << 8 | int(versions[2]) 755env.Append(CPPFLAGS = [ 756 '-DLIGHTTPD_VERSION_ID=' + hex(version_id), 757 '-DPACKAGE_NAME=\\"' + package + '\\"', 758 '-DPACKAGE_VERSION=\\"' + version + '\\"', 759 '-DLIBRARY_DIR="\\"${libdir}\\""', 760 ] ) 761 762SConscript('src/SConscript', exports = 'env', variant_dir = 'sconsbuild/build', duplicate = 0) 763SConscript('tests/SConscript', exports = 'env', variant_dir = 'sconsbuild/tests') 764