summaryrefslogtreecommitdiff
path: root/lib/mesa/scons
diff options
context:
space:
mode:
authorJonathan Gray <jsg@cvs.openbsd.org>2016-12-11 08:40:05 +0000
committerJonathan Gray <jsg@cvs.openbsd.org>2016-12-11 08:40:05 +0000
commit21ab4c9f31674b113c24177398ed39f29b7cd8e6 (patch)
tree8be392d7a792d9663c2586396be77bfd506f5164 /lib/mesa/scons
parenta8f0a7916e26e550dd2a26e7188835c481978004 (diff)
Import Mesa 13.0.2
Diffstat (limited to 'lib/mesa/scons')
-rw-r--r--lib/mesa/scons/custom.py44
-rwxr-xr-xlib/mesa/scons/gallium.py117
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'])