summaryrefslogtreecommitdiffstats
path: root/native_client_sdk
diff options
context:
space:
mode:
authorsbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-11 07:27:55 +0000
committersbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-11 07:27:55 +0000
commitaf206c113e16256610122d567ac043ec26652cc7 (patch)
tree4070b7966a28390522add4f5bfa87f9fa393657d /native_client_sdk
parentad46f2227ee9686a321797db425dd24fa8a44780 (diff)
downloadchromium_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')
-rwxr-xr-xnative_client_sdk/src/build_tools/build_sdk.py198
-rwxr-xr-xnative_client_sdk/src/build_tools/generate_make.py62
-rwxr-xr-xnative_client_sdk/src/build_tools/make_rules.py49
-rw-r--r--native_client_sdk/src/libraries/gtest/library.dsc2
-rw-r--r--native_client_sdk/src/libraries/nacl_mounts/kernel_handle.cc5
-rw-r--r--native_client_sdk/src/libraries/nacl_mounts_test/example.dsc2
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'],