summaryrefslogtreecommitdiffstats
path: root/native_client_sdk/src/build_tools
diff options
context:
space:
mode:
authornoelallen@google.com <noelallen@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-14 00:18:52 +0000
committernoelallen@google.com <noelallen@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-14 00:18:52 +0000
commita200f1e9c119833c24480b7fe9dcaa43f299d613 (patch)
treedd388cdd41fc384911cc6680182f600f94756a87 /native_client_sdk/src/build_tools
parent9d0f4582efaed0de45710754df54c92830fe661e (diff)
downloadchromium_src-a200f1e9c119833c24480b7fe9dcaa43f299d613.zip
chromium_src-a200f1e9c119833c24480b7fe9dcaa43f299d613.tar.gz
chromium_src-a200f1e9c119833c24480b7fe9dcaa43f299d613.tar.bz2
Refactor to support PNaCl
This CL refactors the build script to support PNaCl. It also contains a fix for the missing (shell=True) which causes Windows to fail. Windows uses scons.bat which does not get interpreted unless the command is run through the shell. Review URL: https://chromiumcodereview.appspot.com/9388021 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121775 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'native_client_sdk/src/build_tools')
-rwxr-xr-xnative_client_sdk/src/build_tools/buildbot_run.py146
1 files changed, 95 insertions, 51 deletions
diff --git a/native_client_sdk/src/build_tools/buildbot_run.py b/native_client_sdk/src/build_tools/buildbot_run.py
index 6816b4d..44c5e39 100755
--- a/native_client_sdk/src/build_tools/buildbot_run.py
+++ b/native_client_sdk/src/build_tools/buildbot_run.py
@@ -152,6 +152,14 @@ def GetNewlibToolchain(platform, arch):
return os.path.join(tcdir, tcname)
+def GetPNaClToolchain(platform, arch):
+ tcdir = os.path.join(NACL_DIR, 'toolchain', '.tars')
+ if arch == 'x86':
+ tcname = 'naclsdk_pnacl_%s_%s_64.tgz' % (platform, arch)
+ else:
+ ErrorExit('Unknown architecture.')
+ return os.path.join(tcdir, tcname)
+
def GetScons():
if sys.platform in ['cygwin', 'win32']:
return 'scons.bat'
@@ -164,15 +172,19 @@ def GetArchName(arch, xarch=None):
return arch
-def GetToolchainNaClInclude(tcpath, arch, xarch=None):
+def GetToolchainNaClInclude(tcname, tcpath, arch, xarch=None):
if arch == 'x86':
+ if tcname == 'pnacl':
+ return os.path.join(tcpath, 'newlib', 'sdk', 'include')
return os.path.join(tcpath, 'x86_64-nacl', 'include')
else:
ErrorExit('Unknown architecture.')
-def GetToolchainNaClLib(tcpath, arch, xarch):
+def GetToolchainNaClLib(tcname, tcpath, arch, xarch):
if arch == 'x86':
+ if tcname == 'pnacl':
+ return os.path.join(tcpath, 'newlib', 'sdk', 'lib')
if str(xarch) == '32':
return os.path.join(tcpath, 'x86_64-nacl', 'lib32')
if str(xarch) == '64':
@@ -180,23 +192,27 @@ def GetToolchainNaClLib(tcpath, arch, xarch):
ErrorExit('Unknown architecture.')
-def GetBuildArgs(tcname, tcpath, arch, xarch=None):
+def GetBuildArgs(tcname, tcpath, outdir, arch, xarch=None):
"""Return list of scons build arguments to generate user libraries."""
scons = GetScons()
mode = '--mode=opt-host,nacl'
arch_name = GetArchName(arch, xarch)
plat = 'platform=' + arch_name
- bin = ('bindir=' +
- BuildOutputDir('pepper_' + build_utils.ChromeMajorVersion(), 'tools'))
- lib = 'libdir=' + GetToolchainNaClLib(tcpath, arch, xarch)
+ bin = 'bindir=' + os.path.join(outdir, 'tools')
+ lib = 'libdir=' + GetToolchainNaClLib(tcname, tcpath, arch, xarch)
args = [scons, mode, plat, bin, lib, '-j10',
'install_bin', 'install_lib']
if tcname == 'glibc':
args.append('--nacl_glibc')
+
+ if arch == 'pnacl':
+ args.append('bitcode=1')
+
+ print "Building %s (%s): %s" % (tcname, arch, ' '.join(args))
return args
-header_map = {
+HEADER_MAP = {
'newlib': {
'pthread.h': 'src/untrusted/pthread/pthread.h',
'semaphore.h': 'src/untrusted/pthread/semaphore.h',
@@ -224,7 +240,7 @@ header_map = {
def InstallHeaders(tc_dst_inc, pepper_ver, tc_name):
"""Copies NaCl headers to expected locations in the toolchain."""
- tc_map = header_map[tc_name]
+ tc_map = HEADER_MAP[tc_name]
for filename in tc_map:
src = os.path.join(NACL_DIR, tc_map[filename])
dst = os.path.join(tc_dst_inc, filename)
@@ -284,70 +300,94 @@ def InstallHeaders(tc_dst_inc, pepper_ver, tc_name):
os.path.join(tc_dst_inc, 'KHR'))
-def UntarToolchains(pepperdir, platform, arch):
+def UntarToolchains(pepperdir, platform, arch, toolchains):
BuildStep('Untar Toolchains')
tcname = platform + '_' + arch
tmpdir = os.path.join(SRC_DIR, 'out', 'tc_temp')
RemoveDir(tmpdir)
MakeDir(tmpdir)
- # Untar the newlib toolchains
- tarfile = GetNewlibToolchain(platform, arch)
- Run([sys.executable, CYGTAR, '-C', tmpdir, '-xf', tarfile], cwd=NACL_DIR)
+ if 'newlib' in toolchains:
+ # Untar the newlib toolchains
+ tarfile = GetNewlibToolchain(platform, arch)
+ Run([sys.executable, CYGTAR, '-C', tmpdir, '-xf', tarfile], cwd=NACL_DIR)
+
+ # Then rename/move it to the pepper toolchain directory
+ srcdir = os.path.join(tmpdir, 'sdk', 'nacl-sdk')
+ newlibdir = os.path.join(pepperdir, 'toolchain', tcname + '_newlib')
+ MoveDir(srcdir, newlibdir)
+
+ if 'glibc' in toolchains:
+ # Untar the glibc toolchains
+ tarfile = GetGlibcToolchain(platform, arch)
+ Run([sys.executable, CYGTAR, '-C', tmpdir, '-xf', tarfile], cwd=NACL_DIR)
+
+ # Then rename/move it to the pepper toolchain directory
+ srcdir = os.path.join(tmpdir, 'toolchain', tcname)
+ glibcdir = os.path.join(pepperdir, 'toolchain', tcname + '_glibc')
+ MoveDir(srcdir, glibcdir)
- # Then rename/move it to the pepper toolchain directory
- srcdir = os.path.join(tmpdir, 'sdk', 'nacl-sdk')
- newlibdir = os.path.join(pepperdir, 'toolchain', tcname + '_newlib')
- print "Buildbot mv %s to %s" % (srcdir, newlibdir)
- MoveDir(srcdir, newlibdir)
- print "Done with buildbot move"
- # Untar the glibc toolchains
- tarfile = GetGlibcToolchain(platform, arch)
- Run([sys.executable, CYGTAR, '-C', tmpdir, '-xf', tarfile], cwd=NACL_DIR)
-
- # Then rename/move it to the pepper toolchain directory
- srcdir = os.path.join(tmpdir, 'toolchain', tcname)
- glibcdir = os.path.join(pepperdir, 'toolchain', tcname + '_glibc')
- MoveDir(srcdir, glibcdir)
+ # Untar the pnacl toolchains
+ if 'pnacl' in toolchains:
+ tmpdir = os.path.join(tmpdir, 'pnacl')
+ RemoveDir(tmpdir)
+ MakeDir(tmpdir)
+ tarfile = GetPNaClToolchain(platform, arch)
+ Run([sys.executable, CYGTAR, '-C', tmpdir, '-xf', tarfile], cwd=NACL_DIR)
+ # Then rename/move it to the pepper toolchain directory
+ pnacldir = os.path.join(pepperdir, 'toolchain', tcname + '_pnacl')
+ MoveDir(tmpdir, pnacldir)
-def BuildToolchains(pepperdir, platform, arch, pepper_ver):
+
+def BuildToolchains(pepperdir, platform, arch, pepper_ver, toolchains):
BuildStep('SDK Items')
tcname = platform + '_' + arch
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':
- Run(GetBuildArgs('newlib', newlibdir, 'x86', '32'), cwd=NACL_DIR)
- Run(GetBuildArgs('newlib', newlibdir, 'x86', '64'), cwd=NACL_DIR)
-
- Run(GetBuildArgs('glibc', glibcdir, 'x86', '32'), cwd=NACL_DIR)
- Run(GetBuildArgs('glibc', glibcdir, 'x86', '64'), cwd=NACL_DIR)
- else:
- ErrorExit('Missing arch %s' % arch)
-
- # Copy headers
- if arch == 'x86':
- InstallHeaders(GetToolchainNaClInclude(newlibdir, 'x86'),
- pepper_ver,
- 'newlib')
- InstallHeaders(GetToolchainNaClInclude(glibcdir, 'x86'),
- pepper_ver,
- 'glibc')
+ if 'newlib' in toolchains:
+ Run(GetBuildArgs('newlib', newlibdir, pepperdir, 'x86', '32'),
+ cwd=NACL_DIR, shell=(platform=='win'))
+ Run(GetBuildArgs('newlib', newlibdir, pepperdir, 'x86', '64'),
+ cwd=NACL_DIR, shell=(platform=='win'))
+ InstallHeaders(GetToolchainNaClInclude('newlib', newlibdir, 'x86'),
+ pepper_ver,
+ 'newlib')
+
+ if 'glibc' in toolchains:
+ Run(GetBuildArgs('glibc', glibcdir, pepperdir, 'x86', '32'),
+ cwd=NACL_DIR, shell=(platform=='win'))
+ Run(GetBuildArgs('glibc', glibcdir, pepperdir, 'x86', '64'),
+ cwd=NACL_DIR, shell=(platform=='win'))
+ InstallHeaders(GetToolchainNaClInclude('glibc', glibcdir, 'x86'),
+ pepper_ver,
+ 'glibc')
+
+ if 'pnacl' in toolchains:
+ Run(GetBuildArgs('pnacl', pnacldir, pepperdir, 'x86', '32'),
+ cwd=NACL_DIR, shell=(platform=='win'))
+ Run(GetBuildArgs('pnacl', pnacldir, pepperdir, 'x86', '64'),
+ cwd=NACL_DIR, shell=(platform=='win'))
+ InstallHeaders(GetToolchainNaClInclude('pnacl', pnacldir, 'x86'),
+ pepper_ver,
+ 'newlib')
else:
ErrorExit('Missing arch %s' % arch)
-def CopyExamples(pepperdir, extras = []):
+def CopyExamples(pepperdir, toolchains):
BuildStep('Copy examples')
examples = [
'dlopen', 'fullscreen_tumbler', 'gamepad', 'geturl',
'hello_world_glibc', 'hello_world_interactive', 'hello_world_newlib',
'input_events', 'load_progress', 'mouselock',
'multithreaded_input_events', 'pi_generator', 'pong', 'sine_synth',
- 'tumbler'] + extras
+ 'tumbler']
files = ['favicon.ico', 'httpd.cmd', 'httpd.py', 'index.html', 'Makefile']
if not os.path.exists(os.path.join(pepperdir, 'tools')):
ErrorExit('Examples depend on missing tools.')
@@ -381,7 +421,8 @@ def BuildUpdater():
def main(args):
parser = optparse.OptionParser()
-
+ parser.add_option('--pnacl', help='Enable pnacl build.',
+ action='store_true', dest='pnacl', default=False)
parser.add_option('--examples', help='Rebuild the examples.',
action='store_true', dest='examples', default=False)
parser.add_option('--update', help='Rebuild the updater.',
@@ -392,12 +433,15 @@ def main(args):
action='store_true', dest='archive', default=False)
parser.add_option('--release', help='PPAPI release version.',
dest='release', default=None)
-
+
options, args = parser.parse_args(args[1:])
-
platform = getos.GetPlatform()
arch = 'x86'
+ toolchains = ['newlib', 'glibc']
+ if options.pnacl:
+ toolchains.append('pnacl')
+
skip = options.examples or options.update
skip_examples = skip
@@ -435,10 +479,10 @@ def main(args):
# Clean out the temporary toolchain untar directory
if not skip_untar:
- UntarToolchains(pepperdir, platform, arch)
+ UntarToolchains(pepperdir, platform, arch, toolchains)
if not skip_build:
- BuildToolchains(pepperdir, platform, arch, pepper_ver)
+ BuildToolchains(pepperdir, platform, arch, pepper_ver, toolchains)
BuildStep('Copy make OS helpers')
CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.py'),
@@ -449,7 +493,7 @@ def main(args):
os.path.join(pepperdir, 'tools' ,'make.exe'))
if not skip_examples:
- CopyExamples(pepperdir)
+ CopyExamples(pepperdir, toolchains)
if not skip_tar:
BuildStep('Tar Pepper Bundle')