Index: SConstruct |
diff --git a/SConstruct b/SConstruct |
index 84707e98475d514e15c10a8e9e62838627fe4232..bf75d5b3af55f358b883c5073fb9c9d29739a821 100644 |
--- a/SConstruct |
+++ b/SConstruct |
@@ -27,6 +27,7 @@ |
import platform |
import re |
+import subprocess |
import sys |
import os |
from os.path import join, dirname, abspath |
@@ -142,6 +143,9 @@ LIBRARY_FLAGS = { |
# Use visibility=default to disable this. |
'CXXFLAGS': ['-fvisibility=hidden'] |
}, |
+ 'strictaliasing:off': { |
+ 'CCFLAGS': ['-fno-strict-aliasing'] |
+ }, |
'mode:debug': { |
'CCFLAGS': ['-g', '-O0'], |
'CPPDEFINES': ['ENABLE_DISASSEMBLER', 'DEBUG'], |
@@ -652,8 +656,16 @@ def Abort(message): |
sys.exit(1) |
-def GuessToolchain(os): |
- tools = Environment()['TOOLS'] |
+def GuessOS(env): |
+ return utils.GuessOS() |
+ |
+ |
+def GuessArch(env): |
+ return utils.GuessArchitecture() |
+ |
+ |
+def GuessToolchain(env): |
+ tools = env['TOOLS'] |
if 'gcc' in tools: |
return 'gcc' |
elif 'msvc' in tools: |
@@ -662,7 +674,9 @@ def GuessToolchain(os): |
return None |
-def GuessVisibility(os, toolchain): |
+def GuessVisibility(env): |
+ os = env['os'] |
+ toolchain = env['toolchain']; |
if (os == 'win32' or os == 'cygwin') and toolchain == 'gcc': |
# MinGW / Cygwin can't do it. |
return 'default' |
@@ -672,28 +686,41 @@ def GuessVisibility(os, toolchain): |
return 'hidden' |
-OS_GUESS = utils.GuessOS() |
-TOOLCHAIN_GUESS = GuessToolchain(OS_GUESS) |
-ARCH_GUESS = utils.GuessArchitecture() |
-VISIBILITY_GUESS = GuessVisibility(OS_GUESS, TOOLCHAIN_GUESS) |
+def GuessStrictAliasing(env): |
+ # There seems to be a problem with gcc 4.5.x. |
+ # See http://code.google.com/p/v8/issues/detail?id=884 |
+ # It can be worked around by disabling strict aliasing. |
+ toolchain = env['toolchain']; |
+ if toolchain == 'gcc': |
+ env = Environment(tools=['gcc']) |
+ # The gcc version should be available in env['CCVERSION'], |
+ # but when scons detects msvc this value is not set. |
+ version = subprocess.Popen([env['CC'], '-dumpversion'], |
+ stdout=subprocess.PIPE).communicate()[0] |
+ if version.find('4.5') == 0: |
+ return 'off' |
+ return 'default' |
-SIMPLE_OPTIONS = { |
- 'toolchain': { |
- 'values': ['gcc', 'msvc'], |
- 'default': TOOLCHAIN_GUESS, |
- 'help': 'the toolchain to use (%s)' % TOOLCHAIN_GUESS |
+PLATFORM_OPTIONS = { |
+ 'arch': { |
+ 'values': ['arm', 'ia32', 'x64', 'mips'], |
+ 'guess': GuessArch, |
+ 'help': 'the architecture to build for' |
}, |
'os': { |
'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd', 'solaris', 'cygwin'], |
- 'default': OS_GUESS, |
- 'help': 'the os to build for (%s)' % OS_GUESS |
- }, |
- 'arch': { |
- 'values':['arm', 'ia32', 'x64', 'mips'], |
- 'default': ARCH_GUESS, |
- 'help': 'the architecture to build for (%s)' % ARCH_GUESS |
+ 'guess': GuessOS, |
+ 'help': 'the os to build for' |
}, |
+ 'toolchain': { |
+ 'values': ['gcc', 'msvc'], |
+ 'guess': GuessToolchain, |
+ 'help': 'the toolchain to use' |
+ } |
+} |
+ |
+SIMPLE_OPTIONS = { |
'regexp': { |
'values': ['native', 'interpreted'], |
'default': 'native', |
@@ -801,8 +828,13 @@ SIMPLE_OPTIONS = { |
}, |
'visibility': { |
'values': ['default', 'hidden'], |
- 'default': VISIBILITY_GUESS, |
- 'help': 'shared library symbol visibility (%s)' % VISIBILITY_GUESS |
+ 'guess': GuessVisibility, |
+ 'help': 'shared library symbol visibility' |
+ }, |
+ 'strictaliasing': { |
+ 'values': ['default', 'off'], |
+ 'guess': GuessStrictAliasing, |
+ 'help': 'assume strict aliasing while optimizing' |
}, |
'pgo': { |
'values': ['off', 'instrument', 'optimize'], |
@@ -811,6 +843,22 @@ SIMPLE_OPTIONS = { |
} |
} |
+ALL_OPTIONS = dict(PLATFORM_OPTIONS, **SIMPLE_OPTIONS) |
+ |
+ |
+def AddOptions(options, result): |
+ guess_env = Environment(options=result) |
+ for (name, option) in options.iteritems(): |
+ if 'guess' in option: |
+ # Option has a guess function |
+ guess = option.get('guess') |
+ default = guess(guess_env) |
+ else: |
+ # Option has a fixed default |
+ default = option.get('default') |
+ help = '%s (%s)' % (option.get('help'), ", ".join(option['values'])) |
+ result.Add(name, help, default) |
+ |
def GetOptions(): |
result = Options() |
@@ -819,12 +867,23 @@ def GetOptions(): |
result.Add('cache', 'directory to use for scons build cache', '') |
result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,...)', '') |
result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '') |
- for (name, option) in SIMPLE_OPTIONS.iteritems(): |
- help = '%s (%s)' % (name, ", ".join(option['values'])) |
- result.Add(name, help, option.get('default')) |
+ AddOptions(PLATFORM_OPTIONS, result) |
+ AddOptions(SIMPLE_OPTIONS, result) |
return result |
+def GetTools(opts): |
+ env = Environment(options=opts) |
+ os = env['os'] |
+ toolchain = env['toolchain'] |
+ if os == 'win32' and toolchain == 'gcc': |
+ return ['mingw'] |
+ elif os == 'win32' and toolchain == 'msvc': |
+ return ['msvc', 'mslink', 'mslib', 'msvs'] |
+ else: |
+ return ['default'] |
+ |
+ |
def GetVersionComponents(): |
MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)") |
MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)") |
@@ -904,8 +963,8 @@ def VerifyOptions(env): |
print env['arch'] |
print env['simulator'] |
Abort("Option unalignedaccesses only supported for the ARM architecture.") |
- for (name, option) in SIMPLE_OPTIONS.iteritems(): |
- if (not option.get('default')) and (name not in ARGUMENTS): |
+ for (name, option) in ALL_OPTIONS.iteritems(): |
+ if (not name in env): |
message = ("A value for option %s must be specified (%s)." % |
(name, ", ".join(option['values']))) |
Abort(message) |
@@ -1033,9 +1092,9 @@ def ParseEnvOverrides(arg, imports): |
return overrides |
-def BuildSpecific(env, mode, env_overrides): |
+def BuildSpecific(env, mode, env_overrides, tools): |
options = {'mode': mode} |
- for option in SIMPLE_OPTIONS: |
+ for option in ALL_OPTIONS: |
options[option] = env[option] |
PostprocessOptions(options, env['os']) |
@@ -1086,7 +1145,7 @@ def BuildSpecific(env, mode, env_overrides): |
(object_files, shell_files, mksnapshot) = env.SConscript( |
join('src', 'SConscript'), |
build_dir=join('obj', target_id), |
- exports='context', |
+ exports='context tools', |
duplicate=False |
) |
@@ -1106,21 +1165,21 @@ def BuildSpecific(env, mode, env_overrides): |
library = env.SharedLibrary(library_name, object_files, PDB=pdb_name) |
context.library_targets.append(library) |
- d8_env = Environment() |
+ d8_env = Environment(tools=tools) |
d8_env.Replace(**context.flags['d8']) |
context.ApplyEnvOverrides(d8_env) |
shell = d8_env.Program('d8' + suffix, object_files + shell_files) |
context.d8_targets.append(shell) |
for sample in context.samples: |
- sample_env = Environment() |
+ sample_env = Environment(tools=tools) |
sample_env.Replace(**context.flags['sample']) |
sample_env.Prepend(LIBS=[library_name]) |
context.ApplyEnvOverrides(sample_env) |
sample_object = sample_env.SConscript( |
join('samples', 'SConscript'), |
build_dir=join('obj', 'sample', sample, target_id), |
- exports='sample context', |
+ exports='sample context tools', |
duplicate=False |
) |
sample_name = sample + suffix |
@@ -1133,7 +1192,7 @@ def BuildSpecific(env, mode, env_overrides): |
cctest_program = cctest_env.SConscript( |
join('test', 'cctest', 'SConscript'), |
build_dir=join('obj', 'test', target_id), |
- exports='context object_files', |
+ exports='context object_files tools', |
duplicate=False |
) |
context.cctest_targets.append(cctest_program) |
@@ -1143,7 +1202,9 @@ def BuildSpecific(env, mode, env_overrides): |
def Build(): |
opts = GetOptions() |
- env = Environment(options=opts) |
+ tools = GetTools(opts) |
+ env = Environment(options=opts, tools=tools) |
+ |
Help(opts.GenerateHelpText(env)) |
VerifyOptions(env) |
env_overrides = ParseEnvOverrides(env['env'], env['importenv']) |
@@ -1157,7 +1218,7 @@ def Build(): |
d8s = [] |
modes = SplitList(env['mode']) |
for mode in modes: |
- context = BuildSpecific(env.Copy(), mode, env_overrides) |
+ context = BuildSpecific(env.Copy(), mode, env_overrides, tools) |
libraries += context.library_targets |
mksnapshots += context.mksnapshot_targets |
cctests += context.cctest_targets |