Autodetect no-strict-aliasing, propagate toolchain option to SCons
BUG=v8:884
This commit is contained in:
parent
7f78e5857f
commit
a5e67ad9e7
121
deps/v8/SConstruct
vendored
121
deps/v8/SConstruct
vendored
@ -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'],
|
||||
@ -651,8 +655,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:
|
||||
@ -661,7 +673,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'
|
||||
@ -671,27 +685,35 @@ 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'])
|
||||
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
|
||||
'guess': GuessToolchain,
|
||||
'help': 'the toolchain to use'
|
||||
},
|
||||
'os': {
|
||||
'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd', 'solaris', 'cygwin'],
|
||||
'default': OS_GUESS,
|
||||
'help': 'the os to build for (%s)' % OS_GUESS
|
||||
'guess': GuessOS,
|
||||
'help': 'the os to build for'
|
||||
},
|
||||
'arch': {
|
||||
'values':['arm', 'ia32', 'x64', 'mips'],
|
||||
'default': ARCH_GUESS,
|
||||
'help': 'the architecture to build for (%s)' % ARCH_GUESS
|
||||
'guess': GuessArch,
|
||||
'help': 'the architecture to build for'
|
||||
},
|
||||
'regexp': {
|
||||
'values': ['native', 'interpreted'],
|
||||
@ -800,8 +822,15 @@ SIMPLE_OPTIONS = {
|
||||
},
|
||||
'visibility': {
|
||||
'values': ['default', 'hidden'],
|
||||
'default': VISIBILITY_GUESS,
|
||||
'help': 'shared library symbol visibility (%s)' % VISIBILITY_GUESS
|
||||
'guess': GuessVisibility,
|
||||
'depends': ['os', 'toolchain'],
|
||||
'help': 'shared library symbol visibility'
|
||||
},
|
||||
'strictaliasing': {
|
||||
'values': ['default', 'off'],
|
||||
'guess': GuessStrictAliasing,
|
||||
'depends': ['toolchain'],
|
||||
'help': 'assume strict aliasing while optimizing'
|
||||
},
|
||||
'pgo': {
|
||||
'values': ['off', 'instrument', 'optimize'],
|
||||
@ -811,6 +840,26 @@ SIMPLE_OPTIONS = {
|
||||
}
|
||||
|
||||
|
||||
def AddOption(result, name, option):
|
||||
if 'guess' in option:
|
||||
# Option has a guess function
|
||||
guess = option.get('guess')
|
||||
guess_env = Environment(options=result)
|
||||
# Check if all options that the guess function depends on are set
|
||||
if 'depends' in option:
|
||||
for dependency in option.get('depends'):
|
||||
if not dependency in guess_env:
|
||||
return False
|
||||
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)
|
||||
return True
|
||||
|
||||
|
||||
def GetOptions():
|
||||
result = Options()
|
||||
result.Add('mode', 'compilation mode (debug, release)', 'release')
|
||||
@ -818,12 +867,28 @@ 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'))
|
||||
options = SIMPLE_OPTIONS
|
||||
while len(options):
|
||||
postpone = {}
|
||||
for (name, option) in options.iteritems():
|
||||
if not AddOption(result, name, option):
|
||||
postpone[name] = option
|
||||
options = postpone
|
||||
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,7 +969,7 @@ def VerifyOptions(env):
|
||||
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):
|
||||
if (not name in env):
|
||||
message = ("A value for option %s must be specified (%s)." %
|
||||
(name, ", ".join(option['values'])))
|
||||
Abort(message)
|
||||
@ -1032,7 +1097,7 @@ 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:
|
||||
options[option] = env[option]
|
||||
@ -1085,7 +1150,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
|
||||
)
|
||||
|
||||
@ -1105,21 +1170,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
|
||||
@ -1132,7 +1197,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)
|
||||
@ -1142,7 +1207,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'])
|
||||
@ -1156,7 +1223,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
|
||||
|
3
deps/v8/src/SConscript
vendored
3
deps/v8/src/SConscript
vendored
@ -31,6 +31,7 @@ root_dir = dirname(File('SConstruct').rfile().abspath)
|
||||
sys.path.append(join(root_dir, 'tools'))
|
||||
import js2c
|
||||
Import('context')
|
||||
Import('tools')
|
||||
|
||||
|
||||
SOURCES = {
|
||||
@ -304,7 +305,7 @@ def Abort(message):
|
||||
|
||||
|
||||
def ConfigureObjectFiles():
|
||||
env = Environment()
|
||||
env = Environment(tools=tools)
|
||||
env.Replace(**context.flags['v8'])
|
||||
context.ApplyEnvOverrides(env)
|
||||
env['BUILDERS']['JS2C'] = Builder(action=js2c.JS2C)
|
||||
|
5
wscript
5
wscript
@ -518,6 +518,8 @@ def v8_cmd(bld, variant):
|
||||
if bld.env['DEST_CPU']:
|
||||
arch = "arch="+bld.env['DEST_CPU']
|
||||
|
||||
toolchain = "gcc"
|
||||
|
||||
if variant == "default":
|
||||
mode = "release"
|
||||
else:
|
||||
@ -533,7 +535,7 @@ def v8_cmd(bld, variant):
|
||||
else:
|
||||
profile = ""
|
||||
|
||||
cmd_R = sys.executable + ' "%s" -j %d -C "%s" -Y "%s" visibility=default mode=%s %s library=static %s %s'
|
||||
cmd_R = sys.executable + ' "%s" -j %d -C "%s" -Y "%s" visibility=default mode=%s %s toolchain=%s library=static %s %s'
|
||||
|
||||
cmd = cmd_R % ( scons
|
||||
, Options.options.jobs
|
||||
@ -541,6 +543,7 @@ def v8_cmd(bld, variant):
|
||||
, safe_path(v8dir_src)
|
||||
, mode
|
||||
, arch
|
||||
, toolchain
|
||||
, snapshot
|
||||
, profile
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user