Commit ed36cde5 authored by vegorov@chromium.org's avatar vegorov@chromium.org

Autodetect no-strict-aliasing, propagate toolchain option to SCons

Patch by Bert Belder.

BUG=v8:884

Review URL: http://codereview.chromium.org/6539006

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7449 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent c52de3ac
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
import platform import platform
import re import re
import subprocess
import sys import sys
import os import os
from os.path import join, dirname, abspath from os.path import join, dirname, abspath
...@@ -145,6 +146,9 @@ LIBRARY_FLAGS = { ...@@ -145,6 +146,9 @@ LIBRARY_FLAGS = {
# Use visibility=default to disable this. # Use visibility=default to disable this.
'CXXFLAGS': ['-fvisibility=hidden'] 'CXXFLAGS': ['-fvisibility=hidden']
}, },
'strictaliasing:off': {
'CCFLAGS': ['-fno-strict-aliasing']
},
'mode:debug': { 'mode:debug': {
'CCFLAGS': ['-g', '-O0'], 'CCFLAGS': ['-g', '-O0'],
'CPPDEFINES': ['ENABLE_DISASSEMBLER', 'DEBUG'], 'CPPDEFINES': ['ENABLE_DISASSEMBLER', 'DEBUG'],
...@@ -826,8 +830,16 @@ def Abort(message): ...@@ -826,8 +830,16 @@ def Abort(message):
sys.exit(1) sys.exit(1)
def GuessToolchain(os): def GuessOS(env):
tools = Environment()['TOOLS'] return utils.GuessOS()
def GuessArch(env):
return utils.GuessArchitecture()
def GuessToolchain(env):
tools = env['TOOLS']
if 'gcc' in tools: if 'gcc' in tools:
return 'gcc' return 'gcc'
elif 'msvc' in tools: elif 'msvc' in tools:
...@@ -836,7 +848,9 @@ def GuessToolchain(os): ...@@ -836,7 +848,9 @@ def GuessToolchain(os):
return None return None
def GuessVisibility(os, toolchain): def GuessVisibility(env):
os = env['os']
toolchain = env['toolchain'];
if (os == 'win32' or os == 'cygwin') and toolchain == 'gcc': if (os == 'win32' or os == 'cygwin') and toolchain == 'gcc':
# MinGW / Cygwin can't do it. # MinGW / Cygwin can't do it.
return 'default' return 'default'
...@@ -846,28 +860,41 @@ def GuessVisibility(os, toolchain): ...@@ -846,28 +860,41 @@ def GuessVisibility(os, toolchain):
return 'hidden' return 'hidden'
OS_GUESS = utils.GuessOS() def GuessStrictAliasing(env):
TOOLCHAIN_GUESS = GuessToolchain(OS_GUESS) # There seems to be a problem with gcc 4.5.x.
ARCH_GUESS = utils.GuessArchitecture() # See http://code.google.com/p/v8/issues/detail?id=884
VISIBILITY_GUESS = GuessVisibility(OS_GUESS, TOOLCHAIN_GUESS) # 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 = { PLATFORM_OPTIONS = {
'toolchain': { 'arch': {
'values': ['gcc', 'msvc'], 'values': ['arm', 'ia32', 'x64', 'mips'],
'default': TOOLCHAIN_GUESS, 'guess': GuessArch,
'help': 'the toolchain to use (%s)' % TOOLCHAIN_GUESS 'help': 'the architecture to build for'
}, },
'os': { 'os': {
'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd', 'solaris', 'cygwin'], 'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd', 'solaris', 'cygwin'],
'default': OS_GUESS, 'guess': GuessOS,
'help': 'the os to build for (%s)' % OS_GUESS 'help': 'the os to build for'
},
'arch': {
'values':['arm', 'ia32', 'x64', 'mips'],
'default': ARCH_GUESS,
'help': 'the architecture to build for (%s)' % ARCH_GUESS
}, },
'toolchain': {
'values': ['gcc', 'msvc'],
'guess': GuessToolchain,
'help': 'the toolchain to use'
}
}
SIMPLE_OPTIONS = {
'regexp': { 'regexp': {
'values': ['native', 'interpreted'], 'values': ['native', 'interpreted'],
'default': 'native', 'default': 'native',
...@@ -981,8 +1008,13 @@ SIMPLE_OPTIONS = { ...@@ -981,8 +1008,13 @@ SIMPLE_OPTIONS = {
}, },
'visibility': { 'visibility': {
'values': ['default', 'hidden'], 'values': ['default', 'hidden'],
'default': VISIBILITY_GUESS, 'guess': GuessVisibility,
'help': 'shared library symbol visibility (%s)' % VISIBILITY_GUESS 'help': 'shared library symbol visibility'
},
'strictaliasing': {
'values': ['default', 'off'],
'guess': GuessStrictAliasing,
'help': 'assume strict aliasing while optimizing'
}, },
'pgo': { 'pgo': {
'values': ['off', 'instrument', 'optimize'], 'values': ['off', 'instrument', 'optimize'],
...@@ -1001,6 +1033,22 @@ SIMPLE_OPTIONS = { ...@@ -1001,6 +1033,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(): def GetOptions():
result = Options() result = Options()
...@@ -1009,12 +1057,23 @@ def GetOptions(): ...@@ -1009,12 +1057,23 @@ def GetOptions():
result.Add('cache', 'directory to use for scons build cache', '') result.Add('cache', 'directory to use for scons build cache', '')
result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,...)', '') result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,...)', '')
result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '') result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '')
for (name, option) in SIMPLE_OPTIONS.iteritems(): AddOptions(PLATFORM_OPTIONS, result)
help = '%s (%s)' % (name, ", ".join(option['values'])) AddOptions(SIMPLE_OPTIONS, result)
result.Add(name, help, option.get('default'))
return 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(): def GetVersionComponents():
MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)") MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)")
MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)") MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)")
...@@ -1094,8 +1153,8 @@ def VerifyOptions(env): ...@@ -1094,8 +1153,8 @@ def VerifyOptions(env):
print env['arch'] print env['arch']
print env['simulator'] print env['simulator']
Abort("Option unalignedaccesses only supported for the ARM architecture.") Abort("Option unalignedaccesses only supported for the ARM architecture.")
for (name, option) in SIMPLE_OPTIONS.iteritems(): for (name, option) in ALL_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)." % message = ("A value for option %s must be specified (%s)." %
(name, ", ".join(option['values']))) (name, ", ".join(option['values'])))
Abort(message) Abort(message)
...@@ -1225,9 +1284,9 @@ def ParseEnvOverrides(arg, imports): ...@@ -1225,9 +1284,9 @@ def ParseEnvOverrides(arg, imports):
return overrides return overrides
def BuildSpecific(env, mode, env_overrides): def BuildSpecific(env, mode, env_overrides, tools):
options = {'mode': mode} options = {'mode': mode}
for option in SIMPLE_OPTIONS: for option in ALL_OPTIONS:
options[option] = env[option] options[option] = env[option]
PostprocessOptions(options, env['os']) PostprocessOptions(options, env['os'])
...@@ -1281,7 +1340,7 @@ def BuildSpecific(env, mode, env_overrides): ...@@ -1281,7 +1340,7 @@ def BuildSpecific(env, mode, env_overrides):
(object_files, shell_files, mksnapshot, preparser_files) = env.SConscript( (object_files, shell_files, mksnapshot, preparser_files) = env.SConscript(
join('src', 'SConscript'), join('src', 'SConscript'),
build_dir=join('obj', target_id), build_dir=join('obj', target_id),
exports='context', exports='context tools',
duplicate=False duplicate=False
) )
...@@ -1308,21 +1367,21 @@ def BuildSpecific(env, mode, env_overrides): ...@@ -1308,21 +1367,21 @@ def BuildSpecific(env, mode, env_overrides):
context.library_targets.append(library) context.library_targets.append(library)
context.library_targets.append(preparser_library) context.library_targets.append(preparser_library)
d8_env = Environment() d8_env = Environment(tools=tools)
d8_env.Replace(**context.flags['d8']) d8_env.Replace(**context.flags['d8'])
context.ApplyEnvOverrides(d8_env) context.ApplyEnvOverrides(d8_env)
shell = d8_env.Program('d8' + suffix, object_files + shell_files) shell = d8_env.Program('d8' + suffix, object_files + shell_files)
context.d8_targets.append(shell) context.d8_targets.append(shell)
for sample in context.samples: for sample in context.samples:
sample_env = Environment() sample_env = Environment(tools=tools)
sample_env.Replace(**context.flags['sample']) sample_env.Replace(**context.flags['sample'])
sample_env.Prepend(LIBS=[library_name]) sample_env.Prepend(LIBS=[library_name])
context.ApplyEnvOverrides(sample_env) context.ApplyEnvOverrides(sample_env)
sample_object = sample_env.SConscript( sample_object = sample_env.SConscript(
join('samples', 'SConscript'), join('samples', 'SConscript'),
build_dir=join('obj', 'sample', sample, target_id), build_dir=join('obj', 'sample', sample, target_id),
exports='sample context', exports='sample context tools',
duplicate=False duplicate=False
) )
sample_name = sample + suffix sample_name = sample + suffix
...@@ -1335,7 +1394,7 @@ def BuildSpecific(env, mode, env_overrides): ...@@ -1335,7 +1394,7 @@ def BuildSpecific(env, mode, env_overrides):
cctest_program = cctest_env.SConscript( cctest_program = cctest_env.SConscript(
join('test', 'cctest', 'SConscript'), join('test', 'cctest', 'SConscript'),
build_dir=join('obj', 'test', target_id), build_dir=join('obj', 'test', target_id),
exports='context object_files', exports='context object_files tools',
duplicate=False duplicate=False
) )
context.cctest_targets.append(cctest_program) context.cctest_targets.append(cctest_program)
...@@ -1360,7 +1419,9 @@ def BuildSpecific(env, mode, env_overrides): ...@@ -1360,7 +1419,9 @@ def BuildSpecific(env, mode, env_overrides):
def Build(): def Build():
opts = GetOptions() opts = GetOptions()
env = Environment(options=opts) tools = GetTools(opts)
env = Environment(options=opts, tools=tools)
Help(opts.GenerateHelpText(env)) Help(opts.GenerateHelpText(env))
VerifyOptions(env) VerifyOptions(env)
env_overrides = ParseEnvOverrides(env['env'], env['importenv']) env_overrides = ParseEnvOverrides(env['env'], env['importenv'])
...@@ -1375,7 +1436,7 @@ def Build(): ...@@ -1375,7 +1436,7 @@ def Build():
d8s = [] d8s = []
modes = SplitList(env['mode']) modes = SplitList(env['mode'])
for mode in modes: for mode in modes:
context = BuildSpecific(env.Copy(), mode, env_overrides) context = BuildSpecific(env.Copy(), mode, env_overrides, tools)
libraries += context.library_targets libraries += context.library_targets
mksnapshots += context.mksnapshot_targets mksnapshots += context.mksnapshot_targets
cctests += context.cctest_targets cctests += context.cctest_targets
......
...@@ -31,6 +31,7 @@ root_dir = dirname(File('SConstruct').rfile().abspath) ...@@ -31,6 +31,7 @@ root_dir = dirname(File('SConstruct').rfile().abspath)
sys.path.append(join(root_dir, 'tools')) sys.path.append(join(root_dir, 'tools'))
import js2c import js2c
Import('context') Import('context')
Import('tools')
SOURCES = { SOURCES = {
...@@ -325,7 +326,7 @@ def Abort(message): ...@@ -325,7 +326,7 @@ def Abort(message):
def ConfigureObjectFiles(): def ConfigureObjectFiles():
env = Environment() env = Environment(tools=tools)
env.Replace(**context.flags['v8']) env.Replace(**context.flags['v8'])
context.ApplyEnvOverrides(env) context.ApplyEnvOverrides(env)
env['BUILDERS']['JS2C'] = Builder(action=js2c.JS2C) env['BUILDERS']['JS2C'] = Builder(action=js2c.JS2C)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment