diff options
author | sbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-11 07:27:55 +0000 |
---|---|---|
committer | sbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-11 07:27:55 +0000 |
commit | af206c113e16256610122d567ac043ec26652cc7 (patch) | |
tree | 4070b7966a28390522add4f5bfa87f9fa393657d /native_client_sdk | |
parent | ad46f2227ee9686a321797db425dd24fa8a44780 (diff) | |
download | chromium_src-af206c113e16256610122d567ac043ec26652cc7.zip chromium_src-af206c113e16256610122d567ac043ec26652cc7.tar.gz chromium_src-af206c113e16256610122d567ac043ec26652cc7.tar.bz2 |
[NaCl SDK] Add arm gcc toolchain support to the SDK
arm toolchain is now included in the SDK.
All examples and libraries are compiled with arm toolchain.
build_sdk now calls download_toolchains directly rather
than running all of run_hooks.
BUG=
Review URL: https://chromiumcodereview.appspot.com/11280256
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172272 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'native_client_sdk')
6 files changed, 200 insertions, 118 deletions
diff --git a/native_client_sdk/src/build_tools/build_sdk.py b/native_client_sdk/src/build_tools/build_sdk.py index cdd91a0..283396930 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) diff --git a/native_client_sdk/src/build_tools/generate_make.py b/native_client_sdk/src/build_tools/generate_make.py index 9be8e02..786a1e7 100755 --- a/native_client_sdk/src/build_tools/generate_make.py +++ b/native_client_sdk/src/build_tools/generate_make.py @@ -93,7 +93,7 @@ def GenerateToolDefaults(tools): def GenerateSettings(desc, tools): settings = SetVar('VALID_TOOLCHAINS', tools) - settings += 'TOOLCHAIN?=%s\n\n' % tools[0] + settings += 'TOOLCHAIN?=%s\n\n' % desc['TOOLS'][0] for target in desc['TARGETS']: project = target['NAME'] macro = project.upper() @@ -138,10 +138,17 @@ def GenerateRules(desc, tools): rules += SetVar('GLIBC_REMAP', glibc_rename) configs = desc.get('CONFIGS', ['Debug', 'Release']) - for tc in tools: + for tc, enabled_arches in tools.iteritems(): + print tc makeobj = MakeRules(tc) arches = makeobj.GetArches() rules += makeobj.BuildDirectoryRules(configs) + + if enabled_arches: + # filter out all arches that don't match the list + # of enabled arches + arches = [a for a in arches if a.get('<arch>') in enabled_arches] + for cfg in configs: makeobj.SetConfig(cfg) for target in desc['TARGETS']: @@ -172,7 +179,6 @@ def GenerateRules(desc, tools): return '', rules - def GenerateReplacements(desc, tools): # Generate target settings settings = GenerateSettings(desc, tools) @@ -198,7 +204,8 @@ def GenerateReplacements(desc, tools): # 'KEY' : ( <TYPE>, [Accepted Values], <Required?>) DSC_FORMAT = { - 'TOOLS' : (list, ['newlib', 'glibc', 'pnacl', 'win', 'linux'], True), + 'TOOLS' : (list, ['newlib:arm', 'newlib:x64', 'newlib:x86', 'newlib', + 'glibc', 'pnacl', 'win', 'linux'], True), 'CONFIGS' : (list, ['Debug', 'Release'], False), 'PREREQ' : (list, '', False), 'TARGETS' : (list, { @@ -276,7 +283,7 @@ def ValidateFormat(src, dsc_format, ErrorMsg=ErrorMsgFunc): if exp_type is str: if type(exp_value) is list and exp_value: if value not in exp_value: - ErrorMsg('Value %s not expected for %s.' % (value, key)) + ErrorMsg("Value '%s' not expected for %s." % (value, key)) failed = True continue @@ -394,7 +401,7 @@ def LoadProject(filename, toolchains): if it matches the set of requested toolchains. Return None if the project is filtered out.""" - print '\n\nProcessing %s...' % filename + print 'Processing %s...' % filename # Default src directory is the directory the description was found in desc = open(filename, 'r').read() desc = eval(desc, {}, {}) @@ -473,11 +480,23 @@ def ProcessProject(srcroot, dstroot, desc, toolchains): else: template = os.path.join(SCRIPT_DIR, 'library.mk') - tools = [] + tools = {} + tool_list = [] for tool in desc['TOOLS']: - if tool in toolchains: - tools.append(tool) + if ':' in tool: + tool, arch = tool.split(':') + else: + arch = None + # Ignore tools that are not enabled in this SDK build + if tool not in toolchains: + continue + tools.setdefault(tool, []) + if tool not in tool_list: + tool_list.append(tool) + if arch: + tools[tool].append(arch) + desc['TOOLS'] = tool_list # Add Makefile and make.bat repdict = GenerateReplacements(desc, tools) @@ -527,21 +546,22 @@ def GenerateMasterMakefile(in_path, out_path, projects): def main(argv): - parser = optparse.OptionParser() + usage = "usage: generate_make [options] <dsc_file ..>" + parser = optparse.OptionParser(usage=usage) parser.add_option('--dstroot', help='Set root for destination.', - dest='dstroot', default=os.path.join(OUT_DIR, 'pepper_canary')) + default=os.path.join(OUT_DIR, 'pepper_canary')) parser.add_option('--master', help='Create master Makefile.', - action='store_true', dest='master', default=False) + action='store_true', default=False) parser.add_option('--newlib', help='Create newlib examples.', - action='store_true', dest='newlib', default=False) + action='store_true', default=False) parser.add_option('--glibc', help='Create glibc examples.', - action='store_true', dest='glibc', default=False) + action='store_true', default=False) parser.add_option('--pnacl', help='Create pnacl examples.', - action='store_true', dest='pnacl', default=False) + action='store_true', default=False) parser.add_option('--host', help='Create host examples.', - action='store_true', dest='host', default=False) + action='store_true', default=False) parser.add_option('--experimental', help='Create experimental examples.', - action='store_true', dest='experimental', default=False) + action='store_true', default=False) toolchains = [] platform = getos.GetPlatform() @@ -561,13 +581,15 @@ def main(argv): # By default support newlib and glibc if not toolchains: - toolchains = ['newlib', 'glibc'] - print 'Using default toolchains: ' + ' '.join(toolchains) + toolchains = ['newlib', 'glibc', 'pnacl'] master_projects = {} landing_page = LandingPage() - for filename in args: + for i, filename in enumerate(args): + if i: + # Print two newlines between each dsc file we process + print '\n' desc = LoadProject(filename, toolchains) if not desc: print 'Skipping %s, not in [%s].' % (filename, ', '.join(toolchains)) diff --git a/native_client_sdk/src/build_tools/make_rules.py b/native_client_sdk/src/build_tools/make_rules.py index 213fa9f..117a4d9 100755 --- a/native_client_sdk/src/build_tools/make_rules.py +++ b/native_client_sdk/src/build_tools/make_rules.py @@ -20,6 +20,13 @@ NEWLIB_CCFLAGS?=-MMD -pthread $(NACL_WARNINGS) -idirafter $(NACL_SDK_ROOT)/inclu NEWLIB_LDFLAGS?=-pthread """ +ARM_DEFAULTS = """ +ARM_CC?=$(TC_PATH)/$(OSNAME)_arm_newlib/bin/arm-nacl-gcc -c +ARM_CXX?=$(TC_PATH)/$(OSNAME)_arm_newlib/bin/arm-nacl-g++ -c +ARM_LINK?=$(TC_PATH)/$(OSNAME)_arm_newlib/bin/arm-nacl-g++ -Wl,-as-needed +ARM_LIB?=$(TC_PATH)/$(OSNAME)_arm_newlib/bin/arm-nacl-ar r +""" + GLIBC_DEFAULTS = """ GLIBC_CC?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-gcc -c GLIBC_CXX?=$(TC_PATH)/$(OSNAME)_x86_glibc/bin/i686-nacl-g++ -c @@ -205,17 +212,17 @@ PNACL_TOOL = { # Various Architectures # LINUX = { - '<arch>': '', + '<arch>': 'linux', '<ARCH>': '', '<MACH>': '', } NACL_X86_32 = { - '<arch>': '32', + '<arch>': 'x86', '<ARCH>': 'x86_32', '<MACH>': '-m32', } NACL_X86_64 = { - '<arch>': '64', + '<arch>': 'x64', '<ARCH>': 'x86_64', '<MACH>': '-m64', } @@ -223,6 +230,13 @@ NACL_PNACL = { '<arch>': 'pnacl', '<MACH>': '', } +NACL_ARM = { + '<arch>': 'arm', + '<ARCH>': 'arm', + '<MACH>': '', + # override the default NACL toolchain + '<TOOLSET>': 'ARM', +} WIN_32 = { '<arch>': '', '<ARCH>': 'x86_32', @@ -232,8 +246,8 @@ WIN_32 = { BUILD_RULES = { 'newlib' : { - 'ARCHES': [NACL_X86_32, NACL_X86_64], - 'DEFS': NEWLIB_DEFAULTS, + 'ARCHES': [NACL_X86_32, NACL_X86_64, NACL_ARM], + 'DEFS': NEWLIB_DEFAULTS + ARM_DEFAULTS, 'CC' : NACL_CC_RULES, 'CXX' : NACL_CC_RULES, 'NMF' : NMF_RULE, @@ -297,11 +311,10 @@ class MakeRules(object): to the appropriate format whenever the toolchain changes. """ - def __init__(self, tc, cfg=None, arch=None): + def __init__(self, tc): self.tc = tc self.project = '' self.cfg = '' - self.arch = '' self.ptype = '' self.arch_ext = '' self.defines = [] @@ -311,10 +324,6 @@ class MakeRules(object): '<TAB>': '\t', } self.SetToolchain(tc) - if cfg: - self.SetConfig(cfg) - if arch: - self.SetArch(arch) def _BuildList(self, key, items): pattern = BUILD_RULES[self.tc]['TOOL'][key] @@ -371,24 +380,24 @@ class MakeRules(object): def GetObjectList(self): return '%s_%s_%s%s_O' % (self.project.upper(), self.tc.upper(), self.cfg.upper(), self.arch_ext) - def GetPepperPlugin(self): plugin = self.Replace(BUILD_RULES[self.tc]['TOOL']['MAIN']) text = 'PPAPI_<CONFIG>:=$(abspath %s)' % plugin text += ';application/x-ppapi-%s\n' % self.vars['<config>'].lower() return self.Replace(text) - def SetArch(self, arch): - self.arch = arch for key in arch: self.vars[key] = arch[key] if '<ARCH>' in self.vars: - self.arch_ext = "_" + self.arch['<ARCH>'] + self.arch_ext = "_" + arch['<ARCH>'] self.vars['<libdir>'] = "%s_%s" % (self.tc, self.vars['<ARCH>']) else: self.vars['<libdir>'] = self.tc + toolset = arch.get('<TOOLSET>', self.tc.upper()) + self.SetTools(toolset) + def SetConfig(self, config): self.cfg = config self.vars['<config>'] = config @@ -424,10 +433,6 @@ class MakeRules(object): tcname = 'host' else: tcname = tc - self.vars['<CC>'] = '%s_CC' % TC - self.vars['<CXX>'] = '%s_CXX' % TC - self.vars['<LIB>'] = '%s_LIB' % TC - self.vars['<LINK>'] = '%s_LINK' % TC self.vars['<tc>'] = tc self.vars['<tcname>'] = tcname self.vars['<TC>'] = TC @@ -435,6 +440,12 @@ class MakeRules(object): self.SetIncludes(self.includes) self.SetLibraries(self.libraries) + def SetTools(self, toolname): + self.vars['<CC>'] = '%s_CC' % toolname + self.vars['<CXX>'] = '%s_CXX' % toolname + self.vars['<LIB>'] = '%s_LIB' % toolname + self.vars['<LINK>'] = '%s_LINK' % toolname + def SetVars(self, **kwargs): # Add other passed in replacements for key in kwargs: diff --git a/native_client_sdk/src/libraries/gtest/library.dsc b/native_client_sdk/src/libraries/gtest/library.dsc index 0660b7c..429f0e9 100644 --- a/native_client_sdk/src/libraries/gtest/library.dsc +++ b/native_client_sdk/src/libraries/gtest/library.dsc @@ -7,7 +7,7 @@ # We can fix this by passing -Wno-unused-private-field to clang, but gcc # doesn't support this flag so we'll have to support splitting CXXFLAGS based # on TOOL first. - 'TOOLS': ['newlib', 'glibc', 'win', 'linux'], + 'TOOLS': ['newlib:x86', 'newlib:x64', 'glibc', 'win', 'linux'], 'SEARCH': [ '.', '../../../../testing/gtest/include/gtest', diff --git a/native_client_sdk/src/libraries/nacl_mounts/kernel_handle.cc b/native_client_sdk/src/libraries/nacl_mounts/kernel_handle.cc index 7eaac84..5103542 100644 --- a/native_client_sdk/src/libraries/nacl_mounts/kernel_handle.cc +++ b/native_client_sdk/src/libraries/nacl_mounts/kernel_handle.cc @@ -8,6 +8,11 @@ #include <fcntl.h> #include <pthread.h> +#ifndef WIN32 +// Needed for SEEK_SET/SEEK_CUR/SEEK_END. +#include <unistd.h> +#endif + #include "nacl_mounts/mount.h" #include "nacl_mounts/mount_node.h" diff --git a/native_client_sdk/src/libraries/nacl_mounts_test/example.dsc b/native_client_sdk/src/libraries/nacl_mounts_test/example.dsc index 03cfa48..894f329 100644 --- a/native_client_sdk/src/libraries/nacl_mounts_test/example.dsc +++ b/native_client_sdk/src/libraries/nacl_mounts_test/example.dsc @@ -1,6 +1,6 @@ { # TODO(binji): pnacl doesn't build right now because gtest doesn't build yet. - 'TOOLS': ['newlib', 'glibc', 'win'], + 'TOOLS': ['newlib:x86', 'newlib:x64', 'glibc', 'win'], # Need to add ../../examples for common.js 'SEARCH': ['.', '../../examples'], |