Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Unified Diff: site_scons/site_tools/naclsdk.py

Issue 10704036: Clean up toolchain command/option selection (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: site_scons/site_tools/naclsdk.py
diff --git a/site_scons/site_tools/naclsdk.py b/site_scons/site_tools/naclsdk.py
index 6db85882bb694a29db6bd8df288826b435951498..a7a4f8cbe9946e6635a451b9afa354ac6303a2a5 100755
--- a/site_scons/site_tools/naclsdk.py
+++ b/site_scons/site_tools/naclsdk.py
@@ -50,6 +50,33 @@ NACL_PLATFORM_DIR_MAP = {
},
}
+NACL_TOOL_MAP = {
+ 'arm': {
+ '32': {
+ 'tooldir': 'arm-nacl',
+ 'as_flag': '',
+ 'cc_flag': '',
+ 'ld_flag': '',
+ },
+ },
+ 'x86': {
+ '32': {
+ 'tooldir': 'i686-nacl',
+ 'other_libdir': 'lib32',
+ 'as_flag': '--32',
+ 'cc_flag': '-m32',
+ 'ld_flag': ' -melf_nacl',
+ },
+ '64': {
+ 'tooldir': 'x86_64-nacl',
+ 'other_libdir': 'lib64',
+ 'as_flag': '--64',
+ 'cc_flag': '-m64',
+ 'ld_flag': ' -melf64_nacl',
+ },
+ },
+ }
+
def _PlatformSubdirs(env):
if env.Bit('bitcode'):
os = NACL_CANONICAL_PLATFORM_MAP[env['PLATFORM']]
@@ -121,64 +148,64 @@ def _SetEnvForNativeSdk(env, sdk_path):
# absolute path have been futile
env.PrependENVPath('PATH', bin_path)
- if os.path.exists(os.path.join(sdk_path, 'nacl64')):
- arch = 'nacl64'
- default_subarch = '64'
- elif os.path.exists(os.path.join(sdk_path, 'x86_64-nacl')):
- arch = 'x86_64-nacl'
- default_subarch = '64'
- elif os.path.exists(os.path.join(sdk_path, 'arm-nacl')):
- arch = 'arm-nacl'
- default_subarch = env['TARGET_SUBARCH']
- else:
- # This fallback allows the Scons build to work if we have a
- # 32-bit-by-default toolchain that lacks "nacl64" compatibility
- # symlinks.
- arch = 'nacl'
- default_subarch = '32'
-
- # Although "lib32" is symlinked to "lib/32" and "lib64" is symlinked
- # to "lib", we use the actual directories because, on Windows, Scons
- # does not run under Cygwin and does not follow Cygwin symlinks.
- if env['TARGET_SUBARCH'] == default_subarch:
- libsuffix = 'lib'
+ tool_prefix = None
+ tool_map = NACL_TOOL_MAP[env['TARGET_ARCHITECTURE']]
+ subarch_spec = tool_map[env['TARGET_SUBARCH']]
+ tooldir = subarch_spec['tooldir']
+ if os.path.exists(os.path.join(sdk_path, tooldir)):
+ # The tooldir for the build target exists.
+ # The tools there do the right thing without special options.
+ tool_prefix = tooldir
+ libdir = os.path.join(tooldir, 'lib')
as_mode_flag = ''
- ld_mode_flag = ''
- else:
- libsuffix = 'lib%s' % env['TARGET_SUBARCH']
- as_mode_flag = '--%s' % env['TARGET_SUBARCH']
- if env['TARGET_SUBARCH'] == '64':
- ld_mode_flag = ' -melf64_nacl'
- else:
- ld_mode_flag = ' -melf_nacl'
-
- if arch == 'arm-nacl':
cc_mode_flag = ''
+ ld_mode_flag = ''
else:
- cc_mode_flag = '-m%s' % env['TARGET_SUBARCH']
+ # We're building for a target for which there is no matching tooldir.
+ # For example, for x86-32 when only <sdk_path>/x86_64-nacl/ exists.
+ # Find a tooldir for a different subarch that does exist.
+ others_map = tool_map.copy()
+ del others_map[env['TARGET_SUBARCH']]
+ for subarch, tool_spec in others_map.iteritems():
+ tooldir = tool_spec['tooldir']
+ if os.path.exists(os.path.join(sdk_path, tooldir)):
+ # OK, this is the other subarch to use as tooldir.
+ tool_prefix = tooldir
+ # We need to pass it extra options for the subarch we are building.
+ as_mode_flag = subarch_spec['as_flag']
+ cc_mode_flag = subarch_spec['cc_flag']
+ ld_mode_flag = subarch_spec['ld_flag']
+ # The lib directory may have an alternate name, i.e.
+ # 'lib32' in the x86_64-nacl tooldir.
+ libdir = os.path.join(tooldir, subarch_spec.get('other_libdir', 'lib'))
+ break
+
+ if tool_prefix is None:
+ raise Exception("Cannot find a toolchain for %s in %s" %
+ (env['TARGET_FULLARCH'], sdk_path))
env.Replace(# Replace header and lib paths.
# where to put nacl extra sdk headers
# TODO(robertm): switch to using the mechanism that
# passes arguments to scons
- NACL_SDK_INCLUDE='%s/%s/include' % (sdk_path, arch),
+ NACL_SDK_INCLUDE='%s/%s/include' % (sdk_path, tool_prefix),
# where to find/put nacl generic extra sdk libraries
- NACL_SDK_LIB='%s/%s/%s' % (sdk_path, arch, libsuffix),
+ NACL_SDK_LIB='%s/%s' % (sdk_path, libdir),
# Replace the normal unix tools with the NaCl ones.
- CC=os.path.join(bin_path, '%s-gcc' % arch),
- CXX=os.path.join(bin_path, '%s-g++' % arch),
- AR=os.path.join(bin_path, '%s-ar' % arch),
- AS=os.path.join(bin_path, '%s-as' % arch),
- ASPP=os.path.join(bin_path, '%s-gcc' % arch),
- GDB=os.path.join(bin_path, '%s-gdb' % arch),
+ CC=os.path.join(bin_path, '%s-gcc' % tool_prefix),
+ CXX=os.path.join(bin_path, '%s-g++' % tool_prefix),
+ AR=os.path.join(bin_path, '%s-ar' % tool_prefix),
+ AS=os.path.join(bin_path, '%s-as' % tool_prefix),
+ ASPP=os.path.join(bin_path, '%s-gcc' % tool_prefix),
+ GDB=os.path.join(bin_path, '%s-gdb' % tool_prefix),
# NOTE: use g++ for linking so we can handle C AND C++.
- LINK=os.path.join(bin_path, '%s-g++' % arch),
+ LINK=os.path.join(bin_path, '%s-g++' % tool_prefix),
# Grrr... and sometimes we really need ld.
- LD=os.path.join(bin_path, '%s-ld%s' % (arch, ld_mode_flag)),
- RANLIB=os.path.join(bin_path, '%s-ranlib' % arch),
- OBJDUMP=os.path.join(bin_path, '%s-objdump' % arch),
- STRIP=os.path.join(bin_path, '%s-strip' % arch),
- ADDR2LINE=os.path.join(bin_path, '%s-addr2line' % arch),
+ LD=os.path.join(bin_path, '%s-ld' % tool_prefix) + ld_mode_flag,
+ RANLIB=os.path.join(bin_path, '%s-ranlib' % tool_prefix),
+ OBJDUMP=os.path.join(bin_path, '%s-objdump' % tool_prefix),
+ STRIP=os.path.join(bin_path, '%s-strip' % tool_prefix),
+ ADDR2LINE=os.path.join(bin_path, '%s-addr2line' % tool_prefix),
BASE_LINKFLAGS=[cc_mode_flag],
BASE_CFLAGS=[cc_mode_flag],
BASE_CXXFLAGS=[cc_mode_flag],
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698