diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2016-12-11 08:40:05 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2016-12-11 08:40:05 +0000 |
commit | 21ab4c9f31674b113c24177398ed39f29b7cd8e6 (patch) | |
tree | 8be392d7a792d9663c2586396be77bfd506f5164 /lib/mesa/scons | |
parent | a8f0a7916e26e550dd2a26e7188835c481978004 (diff) |
Import Mesa 13.0.2
Diffstat (limited to 'lib/mesa/scons')
-rw-r--r-- | lib/mesa/scons/custom.py | 44 | ||||
-rwxr-xr-x | lib/mesa/scons/gallium.py | 117 |
2 files changed, 76 insertions, 85 deletions
diff --git a/lib/mesa/scons/custom.py b/lib/mesa/scons/custom.py index 043793b5d..bdb4039b8 100644 --- a/lib/mesa/scons/custom.py +++ b/lib/mesa/scons/custom.py @@ -30,11 +30,10 @@ Custom builders and methods. # -import os import os.path -import re import sys import subprocess +import modulefinder import SCons.Action import SCons.Builder @@ -44,6 +43,13 @@ import fixes import source_list +# the get_implicit_deps() method changed between 2.4 and 2.5: now it expects +# a callable that takes a scanner as argument and returns a path, rather than +# a path directly. We want to support both, so we need to detect the SCons version, +# for which no API is provided by SCons 8-P + +scons_version = tuple(map(int, SCons.__version__.split('.'))) + def quietCommandLines(env): # Quiet command lines # See also http://www.scons.org/wiki/HidingCommandLinesInOutput @@ -93,27 +99,25 @@ def createConvenienceLibBuilder(env): return convenience_lib -# TODO: handle import statements with multiple modules -# TODO: handle from import statements -import_re = re.compile(r'^\s*import\s+(\S+)\s*$', re.M) - def python_scan(node, env, path): # http://www.scons.org/doc/0.98.5/HTML/scons-user/c2781.html#AEN2789 + # https://docs.python.org/2/library/modulefinder.html contents = node.get_contents() - source_dir = node.get_dir() - imports = import_re.findall(contents) + + # Tell ModuleFinder to search dependencies in the script dir, and the glapi + # dirs + source_dir = node.get_dir().abspath + GLAPI = env.Dir('#src/mapi/glapi/gen').abspath + path = [source_dir, GLAPI] + sys.path + + finder = modulefinder.ModuleFinder(path=path) + finder.run_script(node.abspath) results = [] - for imp in imports: - for dir in path: - file = os.path.join(str(dir), imp.replace('.', os.sep) + '.py') - if os.path.exists(file): - results.append(env.File(file)) - break - file = os.path.join(str(dir), imp.replace('.', os.sep), '__init__.py') - if os.path.exists(file): - results.append(env.File(file)) - break - #print node, map(str, results) + for name, mod in finder.modules.iteritems(): + if mod.__file__ is None: + continue + assert os.path.exists(mod.__file__) + results.append(env.File(mod.__file__)) return results python_scanner = SCons.Scanner.Scanner(function = python_scan, skeys = ['.py']) @@ -138,7 +142,7 @@ def code_generate(env, script, target, source, command): # Explicitly mark that the generated code depends on the generator, # and on implicitly imported python modules - path = (script_src.get_dir(),) + path = (script_src.get_dir(),) if scons_version < (2, 5, 0) else lambda x: script_src deps = [script_src] deps += script_src.get_implicit_deps(env, python_scanner, path) env.Depends(code, deps) diff --git a/lib/mesa/scons/gallium.py b/lib/mesa/scons/gallium.py index 46520168a..9f7555cf8 100755 --- a/lib/mesa/scons/gallium.py +++ b/lib/mesa/scons/gallium.py @@ -82,11 +82,6 @@ def install_shared_library(env, sources, version = ()): return targets -def createInstallMethods(env): - env.AddMethod(install_program, 'InstallProgram') - env.AddMethod(install_shared_library, 'InstallSharedLibrary') - - def msvc2013_compat(env): if env['gcc']: env.Append(CCFLAGS = [ @@ -94,8 +89,20 @@ def msvc2013_compat(env): '-Werror=pointer-arith', ]) -def createMSVCCompatMethods(env): - env.AddMethod(msvc2013_compat, 'MSVC2013Compat') + +def unit_test(env, test_name, program_target, args=None): + env.InstallProgram(program_target) + + cmd = [program_target[0].abspath] + if args is not None: + cmd += args + cmd = ' '.join(cmd) + + # http://www.scons.org/wiki/UnitTests + action = SCons.Action.Action(cmd, " Running $SOURCE ...") + alias = env.Alias(test_name, program_target, action) + env.AlwaysBuild(alias) + env.Depends('check', alias) def num_jobs(): @@ -164,16 +171,6 @@ def generate(env): # Allow override compiler and specify additional flags from environment if os.environ.has_key('CC'): env['CC'] = os.environ['CC'] - # Update CCVERSION to match - pipe = SCons.Action._subproc(env, [env['CC'], '--version'], - stdin = 'devnull', - stderr = 'devnull', - stdout = subprocess.PIPE) - if pipe.wait() == 0: - line = pipe.stdout.readline() - match = re.search(r'[0-9]+(\.[0-9]+)+', line) - if match: - env['CCVERSION'] = match.group(0) if os.environ.has_key('CFLAGS'): env['CCFLAGS'] += SCons.Util.CLVar(os.environ['CFLAGS']) if os.environ.has_key('CXX'): @@ -186,14 +183,15 @@ def generate(env): # Detect gcc/clang not by executable name, but through pre-defined macros # as autoconf does, to avoid drawing wrong conclusions when using tools # that overrice CC/CXX like scan-build. - env['gcc'] = 0 + env['gcc_compat'] = 0 env['clang'] = 0 env['msvc'] = 0 if host_platform.system() == 'Windows': env['msvc'] = check_cc(env, 'MSVC', 'defined(_MSC_VER)', '/E') if not env['msvc']: - env['gcc'] = check_cc(env, 'GCC', 'defined(__GNUC__) && !defined(__clang__)') - env['clang'] = check_cc(env, 'Clang', '__clang__') + env['gcc_compat'] = check_cc(env, 'GCC', 'defined(__GNUC__)') + env['clang'] = check_cc(env, 'Clang', '__clang__') + env['gcc'] = env['gcc_compat'] and not env['clang'] env['suncc'] = env['platform'] == 'sunos' and os.path.basename(env['CC']) == 'cc' env['icc'] = 'icc' == os.path.basename(env['CC']) @@ -206,7 +204,7 @@ def generate(env): platform = env['platform'] x86 = env['machine'] == 'x86' ppc = env['machine'] == 'ppc' - gcc_compat = env['gcc'] or env['clang'] + gcc_compat = env['gcc_compat'] msvc = env['msvc'] suncc = env['suncc'] icc = env['icc'] @@ -258,7 +256,7 @@ def generate(env): if env['build'] == 'profile': env['debug'] = False env['profile'] = True - if env['build'] == 'release': + if env['build'] in ('release', 'opt'): env['debug'] = False env['profile'] = False @@ -292,13 +290,19 @@ def generate(env): # C preprocessor options cppdefines = [] - cppdefines += ['__STDC_LIMIT_MACROS', '__STDC_CONSTANT_MACROS'] + cppdefines += [ + '__STDC_LIMIT_MACROS', + '__STDC_CONSTANT_MACROS', + 'HAVE_NO_AUTOCONF', + ] if env['build'] in ('debug', 'checked'): cppdefines += ['DEBUG'] else: cppdefines += ['NDEBUG'] if env['build'] == 'profile': cppdefines += ['PROFILE'] + if env['build'] in ('opt', 'profile'): + cppdefines += ['VMX86_STATS'] if env['platform'] in ('posix', 'linux', 'freebsd', 'darwin'): cppdefines += [ '_POSIX_SOURCE', @@ -307,8 +311,6 @@ def generate(env): '_BSD_SOURCE', '_GNU_SOURCE', '_DEFAULT_SOURCE', - 'HAVE_PTHREAD', - 'HAVE_POSIX_MEMALIGN', ] if env['platform'] == 'darwin': cppdefines += [ @@ -329,11 +331,6 @@ def generate(env): if env['platform'] in ('linux', 'darwin'): cppdefines += ['HAVE_XLOCALE_H'] - if env['platform'] == 'haiku': - cppdefines += [ - 'HAVE_PTHREAD', - 'HAVE_POSIX_MEMALIGN' - ] if platform == 'windows': cppdefines += [ 'WIN32', @@ -367,26 +364,6 @@ def generate(env): print 'warning: Floating-point textures enabled.' print 'warning: Please consult docs/patents.txt with your lawyer before building Mesa.' cppdefines += ['TEXTURE_FLOAT_ENABLED'] - if gcc_compat: - ccversion = env['CCVERSION'] - cppdefines += [ - 'HAVE___BUILTIN_EXPECT', - 'HAVE___BUILTIN_FFS', - 'HAVE___BUILTIN_FFSLL', - 'HAVE_FUNC_ATTRIBUTE_FLATTEN', - 'HAVE_FUNC_ATTRIBUTE_UNUSED', - # GCC 3.0 - 'HAVE_FUNC_ATTRIBUTE_FORMAT', - 'HAVE_FUNC_ATTRIBUTE_PACKED', - # GCC 3.4 - 'HAVE___BUILTIN_CTZ', - 'HAVE___BUILTIN_POPCOUNT', - 'HAVE___BUILTIN_POPCOUNTLL', - 'HAVE___BUILTIN_CLZ', - 'HAVE___BUILTIN_CLZLL', - ] - if distutils.version.LooseVersion(ccversion) >= distutils.version.LooseVersion('4.5'): - cppdefines += ['HAVE___BUILTIN_UNREACHABLE'] env.Append(CPPDEFINES = cppdefines) # C compiler options @@ -394,13 +371,8 @@ def generate(env): cxxflags = [] # C++ ccflags = [] # C & C++ if gcc_compat: - ccversion = env['CCVERSION'] if env['build'] == 'debug': ccflags += ['-O0'] - elif env['gcc'] and ccversion.startswith('4.2.'): - # gcc 4.2.x optimizer is broken - print "warning: gcc 4.2.x optimizer is broken -- disabling optimizations" - ccflags += ['-O0'] else: ccflags += ['-O3'] if env['gcc']: @@ -410,7 +382,7 @@ def generate(env): # Work around aliasing bugs - developers should comment this out ccflags += ['-fno-strict-aliasing'] ccflags += ['-g'] - if env['build'] in ('checked', 'profile'): + if env['build'] in ('checked', 'profile') or env['asan']: # See http://code.google.com/p/jrfonseca/wiki/Gprof2Dot#Which_options_should_I_pass_to_gcc_when_compiling_for_profiling? ccflags += [ '-fno-omit-frame-pointer', @@ -480,14 +452,14 @@ def generate(env): ccflags += [ '/O2', # optimize for speed ] - if env['build'] == 'release': - ccflags += [ - '/GL', # enable whole program optimization - ] + if env['build'] in ('release', 'opt'): + if not env['clang']: + ccflags += [ + '/GL', # enable whole program optimization + ] else: ccflags += [ '/Oy-', # disable frame pointer omission - '/GL-', # disable whole program optimization ] ccflags += [ '/W3', # warning level @@ -501,6 +473,10 @@ def generate(env): '/wd4800', # forcing value to bool 'true' or 'false' (performance warning) '/wd4996', # disable deprecated POSIX name warnings ] + if env['clang']: + ccflags += [ + '-Wno-microsoft-enum-value', # enumerator value is not representable in underlying type 'int' + ] if env['machine'] == 'x86': ccflags += [ '/arch:SSE2', # use the SSE2 instructions (default since MSVC 2012) @@ -540,6 +516,16 @@ def generate(env): # scan-build will produce more comprehensive output env.Append(CCFLAGS = ['--analyze']) + # https://github.com/google/sanitizers/wiki/AddressSanitizer + if env['asan']: + if gcc_compat: + env.Append(CCFLAGS = [ + '-fsanitize=address', + ]) + env.Append(LINKFLAGS = [ + '-fsanitize=address', + ]) + # Assembler options if gcc_compat: if env['machine'] == 'x86': @@ -577,7 +563,7 @@ def generate(env): shlinkflags += ['-Wl,--enable-stdcall-fixup'] #shlinkflags += ['-Wl,--kill-at'] if msvc: - if env['build'] == 'release': + if env['build'] in ('release', 'opt') and not env['clang']: # enable Link-time Code Generation linkflags += ['/LTCG'] env.Append(ARFLAGS = ['/LTCG']) @@ -657,14 +643,15 @@ def generate(env): # Custom builders and methods env.Tool('custom') - createInstallMethods(env) - createMSVCCompatMethods(env) + env.AddMethod(install_program, 'InstallProgram') + env.AddMethod(install_shared_library, 'InstallSharedLibrary') + env.AddMethod(msvc2013_compat, 'MSVC2013Compat') + env.AddMethod(unit_test, 'UnitTest') env.PkgCheckModules('X11', ['x11', 'xext', 'xdamage', 'xfixes', 'glproto >= 1.4.13']) env.PkgCheckModules('XCB', ['x11-xcb', 'xcb-glx >= 1.8.1', 'xcb-dri2 >= 1.8']) env.PkgCheckModules('XF86VIDMODE', ['xxf86vm']) env.PkgCheckModules('DRM', ['libdrm >= 2.4.38']) - env.PkgCheckModules('UDEV', ['libudev >= 151']) if env['x11']: env.Append(CPPPATH = env['X11_CPPPATH']) |