| Index: build/test_build.py
|
| diff --git a/build/test_build.py b/build/test_build.py
|
| deleted file mode 100644
|
| index fdc5b18c81832ca14ac27f394dae8fe6896262ea..0000000000000000000000000000000000000000
|
| --- a/build/test_build.py
|
| +++ /dev/null
|
| @@ -1,282 +0,0 @@
|
| -#!/usr/bin/python
|
| -# Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -
|
| -from optparse import OptionParser
|
| -import os
|
| -import subprocess
|
| -import sys
|
| -
|
| -sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
|
| -import pynacl.platform
|
| -
|
| -NATIVE_CLIENT_DIR = os.path.dirname(os.path.dirname(__file__))
|
| -TOOLCHAIN_DIR = os.path.join(NATIVE_CLIENT_DIR, 'toolchain')
|
| -
|
| -"""Building verification script
|
| -
|
| -This module will take the output directory path, base nexe name and
|
| -architecture and combine them to generate a sel_ldr execution command
|
| -line using irt_core of the appropriate architecture.
|
| -"""
|
| -
|
| -
|
| -def RelativePath(filepath):
|
| - """Return a POSIX style relative path."""
|
| - cwdpath = os.path.abspath(os.getcwd())
|
| - cwdparts = cwdpath.split(os.path.sep)
|
| -
|
| - filepath = os.path.abspath(filepath)
|
| -
|
| - # For Windows, convert to POSIX style path
|
| - if sys.platform == 'win32':
|
| - filepath = filepath.replace('\\', '/')
|
| - fileparts = filepath.split('/')
|
| - for index in range(len(fileparts)):
|
| - if index >= len(cwdparts):
|
| - break
|
| - if cwdparts[index] != fileparts[index]:
|
| - break
|
| -
|
| - # Add 'cd ..' the rest of cwd that doesn't match
|
| - out = '../' * (len(cwdparts) - index)
|
| - out += '/'.join(fileparts[index:])
|
| - return out
|
| -
|
| -
|
| -def UseWin64():
|
| - """Check if we are on 64 bit windows."""
|
| - if sys.platform != 'win32':
|
| - return False
|
| - arch32 = os.environ.get('PROCESSOR_ARCHITECTURE', 'unk')
|
| - arch64 = os.environ.get('PROCESSOR_ARCHITEW6432', 'unk')
|
| -
|
| - if arch32 == 'AMD64' or arch64 == 'AMD64':
|
| - return True
|
| - return False
|
| -
|
| -
|
| -def ErrOut(text):
|
| - """ErrOut prints an error message and the command-line that caused it.
|
| -
|
| - Prints to standard err, both the command-line normally, and separated by
|
| - >>...<< to make it easier to copy and paste the command, or to
|
| - find command formating issues.
|
| - """
|
| - sys.stderr.write('\n\n')
|
| - sys.stderr.write( '>>>' + '>> <<'.join(sys.argv) + '<<\n\n')
|
| - sys.stderr.write(' '.join(sys.argv) + '<<\n\n')
|
| - sys.stderr.write(text + '\n')
|
| - sys.exit(1)
|
| -
|
| -def Run(cmd_line):
|
| - """Run the provided command-line returning the error code.
|
| -
|
| - Uses supbrocess to execute the command line, printing debugging information
|
| - as well as error messages as appropriate.
|
| - """
|
| - sys.stdout.write('Run: %s\n' % ' '.join(cmd_line))
|
| - sys.stdout.flush()
|
| - try:
|
| - ecode = subprocess.call(cmd_line)
|
| - except Exception, err:
|
| - ErrOut('\nFAILED: %s\n' % str(err))
|
| -
|
| - if ecode:
|
| - ErrOut('FAILED with return value: %d\n' % ecode)
|
| - else:
|
| - sys.stdout.write('Success\n')
|
| - sys.stdout.flush()
|
| - return ecode
|
| -
|
| -
|
| -def GetToolchainPath(tool):
|
| - """Given the requested tool, compute the path to that toolchain."""
|
| - os_name = pynacl.platform.GetOS()
|
| -
|
| - if tool == 'newlib':
|
| - lib_name = 'newlib'
|
| - else:
|
| - lib_name = 'glibc'
|
| -
|
| - return os.path.join(
|
| - TOOLCHAIN_DIR,
|
| - '%s_x86' % (os_name),
|
| - 'nacl_x86_%s_raw' % lib_name
|
| - )
|
| -
|
| -
|
| -def GetLibPath(tool, arch):
|
| - """For a given tool and architecture, determine the library path."""
|
| - arch_map = {
|
| - 'ia32': 'lib32',
|
| - 'x64': 'lib',
|
| - }
|
| - lib = arch_map[arch]
|
| -
|
| - # For 64bit win, the arch is incorrectly reported as 32bit, so override it.
|
| - if UseWin64():
|
| - lib = 'lib'
|
| - return os.path.join(GetToolchainPath(tool), 'x86_64-nacl', lib)
|
| -
|
| -
|
| -def GetNexe(path, name, arch, tool):
|
| - """For a given nexe name, architecture, and tool generate a path to it."""
|
| - arch_map = {
|
| - 'ia32': 'x32',
|
| - 'x64': 'x64',
|
| - }
|
| - # For 64bit win, the arch is incorrectly reported as 32bit, so override it.
|
| - if UseWin64():
|
| - arch = 'x64'
|
| - return os.path.join(path, '%s_%s_%s.nexe' % (name, tool, arch_map[arch]))
|
| -
|
| -
|
| -def GetLdrIrtNexe(path, nexe, arch, tool):
|
| - sel_ldr = os.path.join(path, 'sel_ldr')
|
| - # If incorrectly reported use sel_ldr64 otherwise assume sel_ldr is already
|
| - # the correct architecture.
|
| - if UseWin64() and arch == 'ia32':
|
| - sel_ldr = os.path.join(path, 'sel_ldr64')
|
| -
|
| - # Get IRT_CORE which is built with newlib
|
| - irt_core = GetNexe(path, 'irt_core', arch, 'newlib')
|
| - nexe = GetNexe(path, nexe, arch, tool)
|
| - return (sel_ldr, irt_core, nexe)
|
| -
|
| -
|
| -def BuildCmdLine(path, nexe, arch, tool):
|
| - (sel_ldr, irt_core, nexe) = GetLdrIrtNexe(path, nexe, arch, tool)
|
| - if tool in ('newlib', 'pnacl_newlib'):
|
| - return [sel_ldr, '-B', irt_core, '--', nexe]
|
| -
|
| - # For GLIBC we need to add 'runnable-ld.so' and allow sel_ldr access to
|
| - # the file system.
|
| - libpath = GetLibPath(tool, arch)
|
| - ldso = os.path.join(libpath, 'runnable-ld.so')
|
| - # Force POSIX style paths required by runnable-ld
|
| - nexe = nexe.replace('\\', '/')
|
| - return [sel_ldr, '-a', '-B', irt_core, '--', ldso, '--library-path',
|
| - libpath, nexe]
|
| -
|
| -
|
| -def RunLoader(path, nexe, arch, tools, out):
|
| - fail = 0
|
| - for tool in tools:
|
| - print '\n\nRunning: %s %s %s' % (nexe, arch, tool)
|
| - cmd_line = BuildCmdLine(path, nexe, arch, tool)
|
| - err = Run(cmd_line)
|
| - if err:
|
| - fail = fail + 1
|
| - if out:
|
| - out.write('%s on %s built with %s, failed returning %s.\n' %
|
| - (nexe, arch, tool, err))
|
| - else:
|
| - if out:
|
| - out.write('SUCCESS: %s on %s built with %s.\n' % (nexe, arch, tool))
|
| - return fail
|
| -
|
| -
|
| -def LogLoader(path, nexe, arch, tools):
|
| - for tool in tools:
|
| - cmd_line = BuildCmdLine(path, nexe, arch, tool)
|
| - print ' '.join(cmd_line)
|
| - return 0
|
| -
|
| -
|
| -def LogDeps(path, nexe, arch, tools):
|
| - out_set = set()
|
| - out_set.add(RelativePath(__file__))
|
| -
|
| - for tool in tools:
|
| - out_set |= set(GetLdrIrtNexe(path, nexe, arch, tool))
|
| - for out in out_set:
|
| - # Emit forward slashes here as that's what gyp expects.
|
| - print out.replace('\\', '/')
|
| -
|
| -
|
| -def Main(argv):
|
| - parser = OptionParser()
|
| -
|
| - # Test build modes
|
| - parser.add_option('-i', '--input', help='Generate input list.',
|
| - action='store_const', const='i', dest='mode', default='')
|
| - parser.add_option('-r', '--run', help='Run the nexe.',
|
| - action='store_const', const='r', dest='mode', default='')
|
| - parser.add_option('-l', '--log', help='Log the command-lines to run.',
|
| - action='store_const', const='l', dest='mode', default='')
|
| -
|
| - # Options
|
| - parser.add_option('-v', '--verbose', dest='verbose', default=False,
|
| - help='Enable verbosity', action='store_true')
|
| - parser.add_option('-o', '--output', dest='output', default='',
|
| - help='Set output file name.', action='store')
|
| - parser.add_option('-p', '--path', dest='path', default='.',
|
| - help='Set path to sel_ldr and NEXEs.', action='store')
|
| - parser.add_option('-n', '--name', dest='name', action='store', default='',
|
| - help='Base name of the NEXE.')
|
| - parser.add_option('-x', '--arch', dest='arch', action='store', default='',
|
| - help='Run architecture.')
|
| - parser.add_option('-t', '--tools', dest='tools', action='append', default=[],
|
| - help='Select which toolchains versions to run.')
|
| - parser.add_option('-s', '--stamp', dest='stamp',
|
| - help='Select path to write a stamp file to on success.')
|
| -
|
| - options, nexe_args = parser.parse_args(argv[1:])
|
| - if not options.name:
|
| - parser.error('Missing NEXE name.')
|
| - if not options.mode or options.mode not in ['i', 'r', 'l']:
|
| - parser.error('Missing run mode.')
|
| - if not options.arch:
|
| - parser.error('Missing run architecture.')
|
| - if not options.tools:
|
| - parser.error('Missing toolchains.')
|
| -
|
| - # TODO(bradnelson): Hack to prevent gyp generated path ending with \" from
|
| - # being interpreted as escaped quote. Here we strip the extra
|
| - # '/hack' we added in the gyp file.
|
| - # http://code.google.com/p/chromium/issues/detail?id=141463
|
| - if options.mode is 'r':
|
| - options.path = os.path.dirname(options.path)
|
| -
|
| - if options.output:
|
| - try:
|
| - out = open(options.output, 'w')
|
| - except EnvironmentError:
|
| - print 'Failed to open %s.\n' % options.output
|
| - return 1
|
| - else:
|
| - out = None
|
| -
|
| - tools = ','.join(options.tools)
|
| - tools = tools.split(',')
|
| - fail = 0
|
| - for tool in tools:
|
| - if tool not in ['newlib', 'glibc', 'pnacl_newlib']:
|
| - parser.error('Unknown tool: %s\n' % tool)
|
| -
|
| - path = options.path
|
| - nexe = options.name
|
| - arch = options.arch
|
| -
|
| - if options.mode == 'r':
|
| - fail = RunLoader(path, nexe, arch, tools, out)
|
| - if options.mode == 'l':
|
| - fail = LogLoader(path, nexe, arch, tools)
|
| - if options.mode == 'i':
|
| - fail = LogDeps('<(PRODUCT_DIR)', nexe, arch, tools)
|
| -
|
| - if out:
|
| - out.close()
|
| -
|
| - if fail == 0 and options.stamp is not None:
|
| - with open(options.stamp, 'w') as fh:
|
| - fh.write('ok')
|
| -
|
| - return fail
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - sys.exit(Main(sys.argv))
|
|
|