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

Unified Diff: native_client_sdk/src/build_tools/build_sdk.py

Issue 11280256: [NaCl SDK] Add arm gcc toolchain support to the SDK (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years 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 | native_client_sdk/src/build_tools/generate_make.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: native_client_sdk/src/build_tools/build_sdk.py
diff --git a/native_client_sdk/src/build_tools/build_sdk.py b/native_client_sdk/src/build_tools/build_sdk.py
index cdd91a0a094a19f55b17b5472536e6ea3cb002f6..283396930ef175d32467515277c3ea8cdbd6e46e 100755
--- a/native_client_sdk/src/build_tools/build_sdk.py
+++ b/native_client_sdk/src/build_tools/build_sdk.py
@@ -46,7 +46,6 @@ NACL_DIR = os.path.join(SRC_DIR, 'native_client')
OUT_DIR = os.path.join(SRC_DIR, 'out')
PPAPI_DIR = os.path.join(SRC_DIR, 'ppapi')
-
# Add SDK make tools scripts to the python path.
sys.path.append(os.path.join(SDK_SRC_DIR, 'tools'))
sys.path.append(os.path.join(NACL_DIR, 'build'))
@@ -59,7 +58,6 @@ GSTORE = 'https://commondatastorage.googleapis.com/nativeclient-mirror/nacl/'
MAKE = 'nacl_sdk/make_3_81/make.exe'
CYGTAR = os.path.join(NACL_DIR, 'build', 'cygtar.py')
-
options = None
@@ -98,8 +96,10 @@ def GetToolchainNaClInclude(tcname, tcpath, arch, xarch=None):
if tcname == 'pnacl':
return os.path.join(tcpath, 'newlib', 'sdk', 'include')
return os.path.join(tcpath, 'x86_64-nacl', 'include')
+ elif arch == 'arm':
+ return os.path.join(tcpath, 'arm-nacl', 'include')
else:
- buildbot_common.ErrorExit('Unknown architecture.')
+ buildbot_common.ErrorExit('Unknown architecture: %s' % arch)
def GetToolchainNaClLib(tcname, tcpath, arch, xarch):
@@ -110,7 +110,9 @@ def GetToolchainNaClLib(tcname, tcpath, arch, xarch):
return os.path.join(tcpath, 'x86_64-nacl', 'lib32')
if str(xarch) == '64':
return os.path.join(tcpath, 'x86_64-nacl', 'lib')
- buildbot_common.ErrorExit('Unknown architecture.')
+ if str(xarch) == 'arm':
+ return os.path.join(tcpath, 'arm-nacl', 'lib')
+ buildbot_common.ErrorExit('Unknown architecture: %s' % arch)
def GetPNaClNativeLib(tcpath, arch):
@@ -140,9 +142,11 @@ def GetBuildArgs(tcname, tcpath, outdir, arch, xarch=None):
def BuildStepDownloadToolchains(platform):
- buildbot_common.BuildStep('Rerun hooks to get toolchains')
- buildbot_common.Run(['gclient', 'runhooks'],
- cwd=SRC_DIR, shell=(platform == 'win'))
+ buildbot_common.BuildStep('Running download_toolchains.py')
+ download_script = os.path.join('build', 'download_toolchains.py')
+ buildbot_common.Run([sys.executable, download_script,
+ '--no-arm-trusted', '--arm-untrusted', '--keep'],
+ cwd=NACL_DIR)
def BuildStepCleanPepperDirs(pepperdir, pepperdir_old):
@@ -194,6 +198,14 @@ def BuildStepUntarToolchains(pepperdir, platform, arch, toolchains):
newlibdir = os.path.join(pepperdir, 'toolchain', tcname + '_newlib')
buildbot_common.Move(srcdir, newlibdir)
+ if 'arm' in toolchains:
+ # Copy the existing arm toolchain from native_client tree
+ arm_toolchain = os.path.join(NACL_DIR, 'toolchain',
+ platform + '_arm_newlib')
+ arm_toolchain_sdk = os.path.join(pepperdir, 'toolchain',
+ os.path.basename(arm_toolchain))
+ buildbot_common.CopyDir(arm_toolchain, arm_toolchain_sdk)
+
if 'glibc' in toolchains:
# Untar the glibc toolchains
tarfile = GetGlibcToolchain(platform, arch)
@@ -265,6 +277,10 @@ HEADER_MAP = {
def InstallHeaders(tc_dst_inc, pepper_ver, tc_name):
"""Copies NaCl headers to expected locations in the toolchain."""
+ if tc_name == 'arm':
+ # arm toolchain header should be the same as the x86 newlib
+ # ones
+ tc_name = 'newlib'
tc_map = HEADER_MAP[tc_name]
for filename in tc_map:
src = os.path.join(NACL_DIR, tc_map[filename])
@@ -347,11 +363,8 @@ def MakeNinjaRelPath(path):
return os.path.join(os.path.relpath(OUT_DIR, SRC_DIR), path)
-def GypNinjaBuild_X86(pepperdir, platform, toolchains):
+def GypNinjaInstall(pepperdir, platform, toolchains):
build_dir = 'gypbuild'
- GypNinjaBuild_X86_Nacl(platform, build_dir)
- GypNinjaBuild_X86_Chrome(build_dir)
-
ninja_out_dir = os.path.join(OUT_DIR, build_dir, 'Release')
# src_file, dst_file, is_host_exe?
tools_files = [
@@ -383,13 +396,22 @@ def GypNinjaBuild_X86(pepperdir, platform, toolchains):
os.path.join(pepperdir, 'tools', dst))
for tc in set(toolchains) & set(['newlib', 'glibc']):
- for bits in '32', '64':
+ for archname in ('arm', '32', '64'):
+ if tc == 'glibc' and archname == 'arm':
+ continue
tc_dir = 'tc_' + tc
- lib_dir = 'lib' + bits
+ lib_dir = 'lib' + archname
+ if archname == 'arm':
+ build_dir = 'gypbuild-arm'
+ tcdir = '%s_arm_%s' % (platform, tc)
+ else:
+ build_dir = 'gypbuild'
+ tcdir = '%s_x86_%s' % (platform, tc)
+
+ ninja_out_dir = os.path.join(OUT_DIR, build_dir, 'Release')
src_dir = os.path.join(ninja_out_dir, 'gen', tc_dir, lib_dir)
- tcpath = os.path.join(pepperdir, 'toolchain',
- '%s_x86_%s' % (platform, tc))
- dst_dir = GetToolchainNaClLib(tc, tcpath, 'x86', bits)
+ tcpath = os.path.join(pepperdir, 'toolchain', tcdir)
+ dst_dir = GetToolchainNaClLib(tc, tcpath, 'x86', archname)
buildbot_common.MakeDir(dst_dir)
buildbot_common.CopyDir(os.path.join(src_dir, '*.a'), dst_dir)
@@ -399,21 +421,21 @@ def GypNinjaBuild_X86(pepperdir, platform, toolchains):
if tc == 'glibc':
buildbot_common.CopyDir(os.path.join(src_dir, '*.so'), dst_dir)
- # TODO(binji): temporary hack; copy crt1.o from sdk toolchain directory.
- lib_dir = os.path.join(ninja_out_dir, 'gen', 'sdk', 'toolchain',
- '%s_x86_%s' % (platform, tc), 'x86_64-nacl', 'lib')
- if bits == '32':
- lib_dir += '32'
+ ninja_tcpath = os.path.join(ninja_out_dir, 'gen', 'sdk', 'toolchain',
+ tcdir)
+ lib_dir = GetToolchainNaClLib(tc, ninja_tcpath, 'x86', archname)
buildbot_common.CopyFile(os.path.join(lib_dir, 'crt1.o'), dst_dir)
-def GypNinjaBuild_X86_Nacl(platform, rel_out_dir):
+def GypNinjaBuild_Nacl(platform, rel_out_dir):
gyp_py = os.path.join(NACL_DIR, 'build', 'gyp_nacl')
nacl_core_sdk_gyp = os.path.join(NACL_DIR, 'build', 'nacl_core_sdk.gyp')
all_gyp = os.path.join(NACL_DIR, 'build', 'all.gyp')
out_dir = MakeNinjaRelPath(rel_out_dir)
+ out_dir_arm = MakeNinjaRelPath(rel_out_dir + '-arm')
GypNinjaBuild('ia32', gyp_py, nacl_core_sdk_gyp, 'nacl_core_sdk', out_dir)
+ GypNinjaBuild('arm', gyp_py, nacl_core_sdk_gyp, 'nacl_core_sdk', out_dir_arm)
GypNinjaBuild('ia32', gyp_py, all_gyp, 'ncval_x86_32', out_dir)
GypNinjaBuild(None, gyp_py, all_gyp, 'ncval_arm', out_dir)
@@ -421,7 +443,7 @@ def GypNinjaBuild_X86_Nacl(platform, rel_out_dir):
NinjaBuild('sel_ldr64', out_dir)
NinjaBuild('ncval_x86_64', out_dir)
elif platform == 'linux':
- out_dir_64 = MakeNinjaRelPath(rel_out_dir + '_64')
+ out_dir_64 = MakeNinjaRelPath(rel_out_dir + '-64')
GypNinjaBuild('x64', gyp_py, nacl_core_sdk_gyp, 'sel_ldr', out_dir_64)
GypNinjaBuild('x64', gyp_py, all_gyp, 'ncval_x86_64', out_dir_64)
@@ -439,17 +461,17 @@ def GypNinjaBuild_X86_Nacl(platform, rel_out_dir):
os.path.join(SRC_DIR, out_dir, 'Release', dst))
-def GypNinjaBuild_X86_Chrome(rel_out_dir):
+def GypNinjaBuild_Chrome(arch, rel_out_dir):
gyp_py = os.path.join(SRC_DIR, 'build', 'gyp_chromium')
out_dir = MakeNinjaRelPath(rel_out_dir)
gyp_file = os.path.join(SRC_DIR, 'ppapi', 'ppapi_untrusted.gyp')
targets = ['ppapi_cpp_lib', 'ppapi_gles2_lib']
- GypNinjaBuild('ia32', gyp_py, gyp_file, targets, out_dir)
+ GypNinjaBuild(arch, gyp_py, gyp_file, targets, out_dir)
gyp_file = os.path.join(SRC_DIR, 'ppapi', 'native_client',
'native_client.gyp')
- GypNinjaBuild('ia32', gyp_py, gyp_file, 'ppapi_lib', out_dir)
+ GypNinjaBuild(arch, gyp_py, gyp_file, 'ppapi_lib', out_dir)
def GypNinjaBuild_Pnacl(rel_out_dir, target_arch):
@@ -462,10 +484,11 @@ def GypNinjaBuild_Pnacl(rel_out_dir, target_arch):
gyp_file = os.path.join(SRC_DIR, 'ppapi', 'native_client', 'src',
'untrusted', 'pnacl_irt_shim', 'pnacl_irt_shim.gyp')
targets = ['pnacl_irt_shim']
- GypNinjaBuild(target_arch, gyp_py, gyp_file, targets, out_dir)
+ GypNinjaBuild(target_arch, gyp_py, gyp_file, targets, out_dir, False)
-def GypNinjaBuild(arch, gyp_py_script, gyp_file, targets, out_dir):
+def GypNinjaBuild(arch, gyp_py_script, gyp_file, targets,
+ out_dir, force_arm_gcc=True):
gyp_env = copy.copy(os.environ)
gyp_env['GYP_GENERATORS'] = 'ninja'
gyp_defines = []
@@ -473,8 +496,15 @@ def GypNinjaBuild(arch, gyp_py_script, gyp_file, targets, out_dir):
gyp_defines.append('mac_sdk=%s' % options.mac_sdk)
if arch:
gyp_defines.append('target_arch=%s' % arch)
+ if arch == 'arm':
+ gyp_defines += ['armv7=1', 'arm_thumb=0', 'arm_neon=1']
+ if force_arm_gcc:
+ gyp_defines += ['nacl_enable_arm_gcc=1']
gyp_env['GYP_DEFINES'] = ' '.join(gyp_defines)
+ for key in ['GYP_GENERATORS', 'GYP_DEFINES']:
+ value = gyp_env[key]
+ print '%s="%s"' % (key, value)
gyp_generator_flags = ['-G', 'output_dir=%s' % (out_dir,)]
gyp_depth = '--depth=.'
buildbot_common.Run(
@@ -492,55 +522,66 @@ def NinjaBuild(targets, out_dir):
buildbot_common.Run(['ninja', '-C', out_config_dir] + targets, cwd=SRC_DIR)
-def BuildStepBuildToolchains(pepperdir, platform, arch, pepper_ver,
- toolchains):
+def BuildStepBuildToolchains(pepperdir, platform, pepper_ver, toolchains):
buildbot_common.BuildStep('SDK Items')
- tcname = platform + '_' + arch
+ GypNinjaBuild_Nacl(platform, 'gypbuild')
+
+ tcname = platform + '_x86'
newlibdir = os.path.join(pepperdir, 'toolchain', tcname + '_newlib')
glibcdir = os.path.join(pepperdir, 'toolchain', tcname + '_glibc')
pnacldir = os.path.join(pepperdir, 'toolchain', tcname + '_pnacl')
# Run scons TC build steps
- if arch == 'x86':
- if set(toolchains) & set(['newlib', 'glibc']):
- GypNinjaBuild_X86(pepperdir, platform, toolchains)
-
- if 'newlib' in toolchains:
- InstallHeaders(GetToolchainNaClInclude('newlib', newlibdir, 'x86'),
- pepper_ver,
- 'newlib')
-
- if 'glibc' in toolchains:
- InstallHeaders(GetToolchainNaClInclude('glibc', glibcdir, 'x86'),
- pepper_ver,
- 'glibc')
-
- if 'pnacl' in toolchains:
- shell = platform == 'win'
- buildbot_common.Run(
- GetBuildArgs('pnacl', pnacldir, pepperdir, 'x86', '32'),
- cwd=NACL_DIR, shell=shell)
- buildbot_common.Run(
- GetBuildArgs('pnacl', pnacldir, pepperdir, 'x86', '64'),
- cwd=NACL_DIR, shell=shell)
-
- for arch in ('ia32', 'arm'):
- # Fill in the latest native pnacl shim library from the chrome build.
- GypNinjaBuild_Pnacl('gypbuild-' + arch, arch)
- pnacl_libdir_map = { 'ia32': 'x86-64', 'arm': 'arm' }
- release_build_dir = os.path.join(OUT_DIR, 'gypbuild-' + arch,
- 'Release', 'gen', 'tc_pnacl_translate',
- 'lib-' + pnacl_libdir_map[arch])
- buildbot_common.CopyFile(
- os.path.join(release_build_dir, 'libpnacl_irt_shim.a'),
- GetPNaClNativeLib(pnacldir, pnacl_libdir_map[arch]))
-
- InstallHeaders(GetToolchainNaClInclude('pnacl', pnacldir, 'x86'),
- pepper_ver,
- 'newlib')
- else:
- buildbot_common.ErrorExit('Missing arch %s' % arch)
+ if set(toolchains) & set(['glibc', 'newlib']):
+ GypNinjaBuild_Chrome('ia32', 'gypbuild')
+
+ if 'arm' in toolchains:
+ GypNinjaBuild_Chrome('arm', 'gypbuild-arm')
+
+ GypNinjaInstall(pepperdir, platform, toolchains)
+
+ if 'newlib' in toolchains:
+ InstallHeaders(GetToolchainNaClInclude('newlib', newlibdir, 'x86'),
+ pepper_ver,
+ 'newlib')
+
+ if 'glibc' in toolchains:
+ InstallHeaders(GetToolchainNaClInclude('glibc', glibcdir, 'x86'),
+ pepper_ver,
+ 'glibc')
+
+ if 'arm' in toolchains:
+ tcname = platform + '_arm_newlib'
+ armdir = os.path.join(pepperdir, 'toolchain', tcname)
+ InstallHeaders(GetToolchainNaClInclude('newlib', armdir, 'arm'),
+ pepper_ver, 'arm')
+
+ if 'pnacl' in toolchains:
+ shell = platform == 'win'
+ buildbot_common.Run(
+ GetBuildArgs('pnacl', pnacldir, pepperdir, 'x86', '32'),
+ cwd=NACL_DIR, shell=shell)
+ buildbot_common.Run(
+ GetBuildArgs('pnacl', pnacldir, pepperdir, 'x86', '64'),
+ cwd=NACL_DIR, shell=shell)
+
+ for arch in ('ia32', 'arm'):
+ # Fill in the latest native pnacl shim library from the chrome build.
+ build_dir = 'gypbuild-pnacl-' + arch
+ GypNinjaBuild_Pnacl(build_dir, arch)
+ pnacl_libdir_map = { 'ia32': 'x86-64', 'arm': 'arm' }
+ release_build_dir = os.path.join(OUT_DIR, build_dir, 'Release',
+ 'gen', 'tc_pnacl_translate',
+ 'lib-' + pnacl_libdir_map[arch])
+
+ buildbot_common.CopyFile(
+ os.path.join(release_build_dir, 'libpnacl_irt_shim.a'),
+ GetPNaClNativeLib(pnacldir, pnacl_libdir_map[arch]))
+
+ InstallHeaders(GetToolchainNaClInclude('pnacl', pnacldir, 'x86'),
+ pepper_ver,
+ 'newlib')
def BuildStepCopyBuildHelpers(pepperdir, platform):
@@ -629,7 +670,8 @@ def BuildStepCopyExamples(pepperdir, toolchains, build_experimental, clobber):
args = ['--dstroot=%s' % pepperdir, '--master']
for toolchain in toolchains:
- args.append('--' + toolchain)
+ if toolchain != 'arm':
+ args.append('--' + toolchain)
for example in EXAMPLE_LIST:
dsc = os.path.join(SDK_EXAMPLE_DIR, example, 'example.dsc')
@@ -642,6 +684,7 @@ def BuildStepCopyExamples(pepperdir, toolchains, build_experimental, clobber):
if build_experimental:
args.append('--experimental')
+ print "Generting Makefiles: %s" % str(args)
if generate_make.main(args):
buildbot_common.ErrorExit('Failed to build examples.')
@@ -823,7 +866,7 @@ def main(args):
parser.add_option('--experimental',
help='build experimental examples and libraries', action='store_true',
dest='build_experimental')
- parser.add_option('--skip-toolchain', help='Skip toolchain download/untar',
+ parser.add_option('--skip-toolchain', help='Skip toolchain untar',
action='store_true')
parser.add_option('--mac_sdk',
help='Set the mac_sdk (e.g. 10.6) to use when building with ninja.',
@@ -846,7 +889,7 @@ def main(args):
if buildbot_common.IsSDKTrybot():
options.run_tests = True
- toolchains = ['newlib', 'glibc', 'pnacl', 'host']
+ toolchains = ['newlib', 'glibc', 'arm', 'pnacl', 'host']
print 'Building: ' + ' '.join(toolchains)
if options.archive and options.skip_tar:
@@ -869,14 +912,15 @@ def main(args):
# of the build.
del os.environ['NACL_SDK_ROOT']
- if not options.skip_toolchain:
- BuildStepDownloadToolchains(platform)
BuildStepCleanPepperDirs(pepperdir, pepperdir_old)
BuildStepMakePepperDirs(pepperdir, ['include', 'toolchain', 'tools'])
- BuildStepCopyTextFiles(pepperdir, pepper_ver, clnumber)
+
if not options.skip_toolchain:
+ BuildStepDownloadToolchains(platform)
BuildStepUntarToolchains(pepperdir, platform, arch, toolchains)
- BuildStepBuildToolchains(pepperdir, platform, arch, pepper_ver, toolchains)
+
+ BuildStepCopyTextFiles(pepperdir, pepper_ver, clnumber)
+ BuildStepBuildToolchains(pepperdir, platform, pepper_ver, toolchains)
InstallHeaders(os.path.join(pepperdir, 'include'), None, 'libs')
BuildStepCopyBuildHelpers(pepperdir, platform)
BuildStepCopyExamples(pepperdir, toolchains, options.build_experimental, True)
« no previous file with comments | « no previous file | native_client_sdk/src/build_tools/generate_make.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698