aboutsummaryrefslogtreecommitdiff
path: root/mesalib/scons/gallium.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesalib/scons/gallium.py')
-rw-r--r--mesalib/scons/gallium.py62
1 files changed, 55 insertions, 7 deletions
diff --git a/mesalib/scons/gallium.py b/mesalib/scons/gallium.py
index 7533f0651..efc65e718 100644
--- a/mesalib/scons/gallium.py
+++ b/mesalib/scons/gallium.py
@@ -35,7 +35,7 @@ import os
import os.path
import re
import subprocess
-import platform as _platform
+import platform as host_platform
import sys
import tempfile
@@ -147,6 +147,17 @@ def check_cc(env, cc, expr, cpp_opt = '-E'):
return result
+def check_prog(env, prog):
+ """Check whether this program exists."""
+
+ sys.stdout.write('Checking for %s ... ' % prog)
+
+ result = env.Detect(prog)
+
+ sys.stdout.write(' %s\n' % ['no', 'yes'][int(bool(result))])
+ return result
+
+
def generate(env):
"""Common environment generation code"""
@@ -186,7 +197,7 @@ def generate(env):
env['gcc'] = 0
env['clang'] = 0
env['msvc'] = 0
- if _platform.system() == 'Windows':
+ 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__)')
@@ -210,10 +221,10 @@ def generate(env):
# Determine whether we are cross compiling; in particular, whether we need
# to compile code generators with a different compiler as the target code.
- host_platform = _platform.system().lower()
- if host_platform.startswith('cygwin'):
- host_platform = 'cygwin'
- host_machine = os.environ.get('PROCESSOR_ARCHITEW6432', os.environ.get('PROCESSOR_ARCHITECTURE', _platform.machine()))
+ hosthost_platform = host_platform.system().lower()
+ if hosthost_platform.startswith('cygwin'):
+ hosthost_platform = 'cygwin'
+ host_machine = os.environ.get('PROCESSOR_ARCHITEW6432', os.environ.get('PROCESSOR_ARCHITECTURE', host_platform.machine()))
host_machine = {
'x86': 'x86',
'i386': 'x86',
@@ -224,7 +235,7 @@ def generate(env):
'AMD64': 'x86_64',
'x86_64': 'x86_64',
}.get(host_machine, 'generic')
- env['crosscompile'] = platform != host_platform
+ env['crosscompile'] = platform != hosthost_platform
if machine == 'x86_64' and host_machine != 'x86_64':
env['crosscompile'] = True
env['hostonly'] = False
@@ -351,6 +362,7 @@ def generate(env):
'_SCL_SECURE_NO_WARNINGS',
'_SCL_SECURE_NO_DEPRECATE',
'_ALLOW_KEYWORD_MACROS',
+ '_HAS_EXCEPTIONS=0', # Tell C++ STL to not use exceptions
]
if env['build'] in ('debug', 'checked'):
cppdefines += ['_DEBUG']
@@ -369,6 +381,7 @@ def generate(env):
'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',
@@ -493,8 +506,13 @@ def generate(env):
]
ccflags += [
'/W3', # warning level
+ '/wd4018', # signed/unsigned mismatch
+ '/wd4056', # overflow in floating-point constant arithmetic
'/wd4244', # conversion from 'type1' to 'type2', possible loss of data
+ '/wd4267', # 'var' : conversion from 'size_t' to 'type', possible loss of data
'/wd4305', # truncation from 'type1' to 'type2'
+ '/wd4351', # new behavior: elements of array 'array' will be default initialized
+ '/wd4756', # overflow in constant arithmetic
'/wd4800', # forcing value to bool 'true' or 'false' (performance warning)
'/wd4996', # disable deprecated POSIX name warnings
]
@@ -617,7 +635,37 @@ def generate(env):
# Load tools
env.Tool('lex')
+ if env['msvc']:
+ env.Append(LEXFLAGS = [
+ # Force flex to use const keyword in prototypes, as relies on
+ # __cplusplus or __STDC__ macro to determine whether it's safe to
+ # use const keyword, but MSVC never defines __STDC__ unless we
+ # disable all MSVC extensions.
+ '-DYY_USE_CONST=',
+ ])
+ # Flex relies on __STDC_VERSION__>=199901L to decide when to include
+ # C99 inttypes.h. We always have inttypes.h available with MSVC
+ # (either the one bundled with MSVC 2013, or the one we bundle
+ # ourselves), but we can't just define __STDC_VERSION__ without
+ # breaking stuff, as MSVC doesn't fully support C99. There's also no
+ # way to premptively include stdint.
+ env.Append(CCFLAGS = ['-FIinttypes.h'])
+ if host_platform.system() == 'Windows':
+ # Prefer winflexbison binaries, as not only they are easier to install
+ # (no additional dependencies), but also better Windows support.
+ if check_prog(env, 'win_flex'):
+ env["LEX"] = 'win_flex'
+ env.Append(LEXFLAGS = [
+ # windows compatibility (uses <io.h> instead of <unistd.h> and
+ # _isatty, _fileno functions)
+ '--wincompat'
+ ])
+
env.Tool('yacc')
+ if host_platform.system() == 'Windows':
+ if check_prog(env, 'win_bison'):
+ env["YACC"] = 'win_bison'
+
if env['llvm']:
env.Tool('llvm')