#! /usr/bin/env python # encoding: utf-8 # mittorn, 2018 from waflib import Logs, Configure import os top = '.' TGMATH_H_TEST = '''#include const float val = 2, val2 = 3; int main(void){ return (int)(-asin(val) + cos(val2)); }''' STRNCASECMP_TEST = '''#include int main(int argc, char **argv) { return strncasecmp(argv[1], argv[2], 10); }''' STRCASECMP_TEST = '''#include int main(int argc, char **argv) { return strcasecmp(argv[1], argv[2]); }''' STRCASESTR_TEST = '''#include int main(int argc, char **argv) { argv[0] = strcasestr(argv[1], argv[2]); return 0; }''' STRCHRNUL_TEST = '''#include int main(int argc, char **argv) { argv[2] = strchrnul(argv[1], 'x'); return 0; }''' STRLCPY_TEST = '''#include int main(int argc, char **argv) { return strlcpy(argv[1], argv[2], 10); }''' STRLCAT_TEST = '''#include int main(int argc, char **argv) { return strlcat(argv[1], argv[2], 10); }''' ALLOCA_TEST = '''#include <%s> int main(void) { alloca(1); return 0; }''' HEADER_TEST = '''#include <%s> int main(void) { return 0; } ''' def options(opt): # stub return def header_frag(header_name): return '#include <%s>' % header_name + EMPTY_PROGRAM @Configure.conf def export_define(conf, define, value=1): if not value: return if value is True: value = 1 # so python won't define it as string True conf.env.EXPORT_DEFINES_LIST += ['%s=%s' % (define, value)] @Configure.conf def simple_check(conf, fragment, msg, mandatory=False, **kw): return conf.check_cc(fragment=fragment, msg='Checking for %s' % msg, mandatory=mandatory, **kw) def options(opt): opt.add_option('--validate-target', action='store', dest='VALIDATE_TARGET', default=None, help='development option, needs --enable-tests flag') def configure(conf): # private to libpublic conf.load('gitversion') conf.define('XASH_BUILD_COMMIT', conf.env.GIT_VERSION if conf.env.GIT_VERSION else 'unknown-commit') conf.define('XASH_BUILD_BRANCH', conf.env.GIT_BRANCH if conf.env.GIT_BRANCH else 'unknown-branch') conf.env.VALIDATE_TARGET = conf.options.VALIDATE_TARGET # need to expose it for everyone using libpublic headers conf.env.EXPORT_DEFINES_LIST = [] conf.export_define('_CRT_SILENCE_NONCONFORMING_TGMATH_H', conf.env.COMPILER_CC == 'msvc') conf.export_define('_GNU_SOURCE', conf.env.DEST_OS != 'win32') # create temporary uselib that just enables extensions conf.env.DEFINES_export = list(conf.env.EXPORT_DEFINES_LIST) # check platform-specific header name for alloca(3) if conf.env.DEST_OS == 'win32': # don't waste time on Win32, it's documented to be always in malloc.h. # (plus test can fail because alloca is underscore-prefixed, e.g. _alloca) conf.export_define('ALLOCA_H', '') elif conf.simple_check(ALLOCA_TEST % 'alloca.h', msg='alloca in alloca.h'): conf.export_define('ALLOCA_H', '') elif conf.simple_check(ALLOCA_TEST % 'malloc.h', msg='alloca in malloc.h'): conf.export_define('ALLOCA_H', '') elif conf.simple_check(ALLOCA_TEST % 'stdlib.h', msg='alloca in stdlib.h'): conf.export_define('ALLOCA_H', '') conf.export_define('STDINT_H', '' if conf.simple_check(HEADER_TEST % 'stdint.h', 'stdint.h') else '') conf.export_define('HAVE_TGMATH_H', conf.simple_check(TGMATH_H_TEST, 'tgmath.h', use='M werror export')) # save some time on Windows, msvc is too slow # these calls must be available with both msvc and mingw if conf.env.DEST_OS == 'win32': conf.export_define('HAVE_STRNICMP') conf.export_define('HAVE_STRICMP') else: # TODO: multicheck for speed def check_libc_extension(frag, msg, define): conf.export_define(define, conf.simple_check(frag, msg, use='werror export')) check_libc_extension(STRNCASECMP_TEST, 'strncasecmp', 'HAVE_STRNCASECMP') check_libc_extension(STRCASECMP_TEST, 'strcasecmp', 'HAVE_STRCASECMP') check_libc_extension(STRCASESTR_TEST, 'strcasestr', 'HAVE_STRCASESTR') check_libc_extension(STRCHRNUL_TEST, 'strchrnul', 'HAVE_STRCHRNUL') check_libc_extension(STRLCPY_TEST, 'strlcpy', 'HAVE_STRLCPY') check_libc_extension(STRLCAT_TEST, 'strlcat', 'HAVE_STRLCAT') # kill temporary uselib del conf.env.DEFINES_export def build(bld): bld(name = 'sdk_includes', export_includes = '. ../common ../pm_shared ../engine', export_defines = bld.env.EXPORT_DEFINES_LIST) bld.stlib(source = bld.path.ant_glob('*.c'), target = 'public', use = 'sdk_includes werror', subsystem = bld.env.MSVC_SUBSYSTEM) if bld.env.TESTS: if bld.env.VALIDATE_TARGET: bld.program(features = 'test', source = 'tests/test_validate_target.c', target = 'validate_target', use = 'public', defines = 'VALIDATE_TARGET="%s"' % bld.env.VALIDATE_TARGET, subsystem = bld.env.CONSOLE_SUBSYSTEM, install_path = None) tests = { 'strings': 'tests/test_strings.c', 'build': 'tests/test_build.c', 'filebase': 'tests/test_filebase.c', 'fileext': 'tests/test_fileext.c', 'efp': 'tests/test_efp.c', 'atoi': 'tests/test_atoi.c', 'parsefile': 'tests/test_parsefile.c', } for i in tests: bld.program(features = 'test', source = tests[i], target = 'test_%s' % i, use = 'public', subsystem = bld.env.CONSOLE_SUBSYSTEM, install_path = None)