| Index: tools/gn.py
|
| diff --git a/tools/gn.py b/tools/gn.py
|
| index 3f4345ef1729d8275547ae7383e34f120c2ffb63..32884b072f9b151685e5a5da622fb4f02f13608f 100755
|
| --- a/tools/gn.py
|
| +++ b/tools/gn.py
|
| @@ -6,6 +6,7 @@
|
| import argparse
|
| import multiprocessing
|
| import os
|
| +import shutil
|
| import subprocess
|
| import sys
|
| import time
|
| @@ -15,6 +16,7 @@ HOST_OS = utils.GuessOS()
|
| HOST_ARCH = utils.GuessArchitecture()
|
| SCRIPT_DIR = os.path.dirname(sys.argv[0])
|
| DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
|
| +GN = os.path.join(DART_ROOT, 'buildtools', 'gn')
|
|
|
| # Environment variables for default settings.
|
| DART_USE_ASAN = "DART_USE_ASAN" # Use instead of --asan
|
| @@ -24,39 +26,39 @@ DART_USE_WHEEZY = "DART_USE_WHEEZY" # Use instread of --wheezy
|
| DART_USE_TOOLCHAIN = "DART_USE_TOOLCHAIN" # Use instread of --toolchain-prefix
|
| DART_USE_SYSROOT = "DART_USE_SYSROOT" # Use instead of --target-sysroot
|
|
|
| -def use_asan():
|
| +def UseASAN():
|
| return DART_USE_ASAN in os.environ
|
|
|
|
|
| -def use_msan():
|
| +def UseMSAN():
|
| return DART_USE_MSAN in os.environ
|
|
|
|
|
| -def use_tsan():
|
| +def UseTSAN():
|
| return DART_USE_TSAN in os.environ
|
|
|
|
|
| -def use_wheezy():
|
| +def UseWheezy():
|
| return DART_USE_WHEEZY in os.environ
|
|
|
|
|
| -def toolchain_prefix(args):
|
| +def ToolchainPrefix(args):
|
| if args.toolchain_prefix:
|
| return args.toolchain_prefix
|
| return os.environ.get(DART_USE_TOOLCHAIN)
|
|
|
|
|
| -def target_sysroot(args):
|
| +def TargetSysroot(args):
|
| if args.target_sysroot:
|
| return args.target_sysroot
|
| return os.environ.get(DART_USE_SYSROOT)
|
|
|
|
|
| -def get_out_dir(mode, arch, target_os):
|
| +def GetOutDir(mode, arch, target_os):
|
| return utils.GetBuildRoot(HOST_OS, mode, arch, target_os)
|
|
|
|
|
| -def to_command_line(gn_args):
|
| +def ToCommandLine(gn_args):
|
| def merge(key, value):
|
| if type(value) is bool:
|
| return '%s=%s' % (key, 'true' if value else 'false')
|
| @@ -64,7 +66,7 @@ def to_command_line(gn_args):
|
| return [merge(x, y) for x, y in gn_args.iteritems()]
|
|
|
|
|
| -def host_cpu_for_arch(arch):
|
| +def HostCpuForArch(arch):
|
| if arch in ['ia32', 'arm', 'armv6', 'armv5te', 'mips',
|
| 'simarm', 'simarmv6', 'simarmv5te', 'simmips', 'simdbc',
|
| 'armsimdbc']:
|
| @@ -73,7 +75,7 @@ def host_cpu_for_arch(arch):
|
| return 'x64'
|
|
|
|
|
| -def target_cpu_for_arch(arch, target_os):
|
| +def TargetCpuForArch(arch, target_os):
|
| if arch in ['ia32', 'simarm', 'simarmv6', 'simarmv5te', 'simmips']:
|
| return 'x86'
|
| if arch in ['simarm64']:
|
| @@ -91,7 +93,7 @@ def target_cpu_for_arch(arch, target_os):
|
| return arch
|
|
|
|
|
| -def host_os_for_gn(host_os):
|
| +def HostOsForGn(host_os):
|
| if host_os.startswith('macos'):
|
| return 'mac'
|
| if host_os.startswith('win'):
|
| @@ -101,7 +103,7 @@ def host_os_for_gn(host_os):
|
|
|
| # Where string_map is formatted as X1=Y1,X2=Y2 etc.
|
| # If key is X1, returns Y1.
|
| -def parse_string_map(key, string_map):
|
| +def ParseStringMap(key, string_map):
|
| for m in string_map.split(','):
|
| l = m.split('=')
|
| if l[0] == key:
|
| @@ -109,18 +111,18 @@ def parse_string_map(key, string_map):
|
| return None
|
|
|
|
|
| -def to_gn_args(args, mode, arch, target_os):
|
| +def ToGnArgs(args, mode, arch, target_os):
|
| gn_args = {}
|
|
|
| - host_os = host_os_for_gn(HOST_OS)
|
| + host_os = HostOsForGn(HOST_OS)
|
| if target_os == 'host':
|
| gn_args['target_os'] = host_os
|
| else:
|
| gn_args['target_os'] = target_os
|
|
|
| gn_args['dart_target_arch'] = arch
|
| - gn_args['target_cpu'] = target_cpu_for_arch(arch, target_os)
|
| - gn_args['host_cpu'] = host_cpu_for_arch(arch)
|
| + gn_args['target_cpu'] = TargetCpuForArch(arch, target_os)
|
| + gn_args['host_cpu'] = HostCpuForArch(arch)
|
|
|
| # See: runtime/observatory/BUILD.gn.
|
| # This allows the standalone build of the observatory to fall back on
|
| @@ -165,10 +167,8 @@ def to_gn_args(args, mode, arch, target_os):
|
| # TODO(zra): Investigate using clang with these configurations.
|
| # Clang compiles tcmalloc's inline assembly for ia32 on Linux wrong, so we
|
| # don't use clang in that configuration. Thus, we use gcc for ia32 *unless*
|
| - # asan or tsan is specified.
|
| + # a clang-based sanitizer is specified.
|
| has_clang = (host_os != 'win'
|
| - and args.os not in ['android']
|
| - and not gn_args['target_cpu'].startswith('arm')
|
| and not gn_args['target_cpu'].startswith('mips')
|
| and not ((gn_args['target_os'] == 'linux')
|
| and (gn_args['host_cpu'] == 'x86')
|
| @@ -185,13 +185,13 @@ def to_gn_args(args, mode, arch, target_os):
|
| if gn_args['target_os'] == 'linux' and args.wheezy:
|
| gn_args['dart_use_wheezy_sysroot'] = True
|
| else:
|
| - sysroot = target_sysroot(args)
|
| + sysroot = TargetSysroot(args)
|
| if sysroot:
|
| - gn_args['target_sysroot'] = parse_string_map(arch, sysroot)
|
| + gn_args['target_sysroot'] = ParseStringMap(arch, sysroot)
|
|
|
| - toolchain = toolchain_prefix(args)
|
| + toolchain = ToolchainPrefix(args)
|
| if toolchain:
|
| - gn_args['toolchain_prefix'] = parse_string_map(arch, toolchain)
|
| + gn_args['toolchain_prefix'] = ParseStringMap(arch, toolchain)
|
|
|
| goma_dir = os.environ.get('GOMA_DIR')
|
| goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma')
|
| @@ -212,13 +212,13 @@ def to_gn_args(args, mode, arch, target_os):
|
| return gn_args
|
|
|
|
|
| -def process_os_option(os_name):
|
| +def ProcessOsOption(os_name):
|
| if os_name == 'host':
|
| return HOST_OS
|
| return os_name
|
|
|
|
|
| -def process_options(args):
|
| +def ProcessOptions(args):
|
| if args.arch == 'all':
|
| args.arch = 'ia32,x64,simarm,simarm64,simmips,simdbc64'
|
| if args.mode == 'all':
|
| @@ -239,7 +239,7 @@ def process_options(args):
|
| if not arch in archs:
|
| print "Unknown arch %s" % arch
|
| return False
|
| - oses = [process_os_option(os_name) for os_name in args.os]
|
| + oses = [ProcessOsOption(os_name) for os_name in args.os]
|
| for os_name in oses:
|
| if not os_name in ['android', 'freebsd', 'linux', 'macos', 'win32']:
|
| print "Unknown os %s" % os_name
|
| @@ -248,7 +248,7 @@ def process_options(args):
|
| if os_name != 'android':
|
| print "Unsupported target os %s" % os_name
|
| return False
|
| - if not HOST_OS in ['linux']:
|
| + if not HOST_OS in ['linux', 'macos']:
|
| print ("Cross-compilation to %s is not supported on host os %s."
|
| % (os_name, HOST_OS))
|
| return False
|
| @@ -303,7 +303,7 @@ def parse_args(args):
|
|
|
| other_group.add_argument('--asan',
|
| help='Build with ASAN',
|
| - default=use_asan(),
|
| + default=UseASAN(),
|
| action='store_true')
|
| other_group.add_argument('--no-asan',
|
| help='Disable ASAN',
|
| @@ -335,7 +335,7 @@ def parse_args(args):
|
| action='store_true')
|
| other_group.add_argument('--msan',
|
| help='Build with MSAN',
|
| - default=use_msan(),
|
| + default=UseMSAN(),
|
| action='store_true')
|
| other_group.add_argument('--no-msan',
|
| help='Disable MSAN',
|
| @@ -349,7 +349,7 @@ def parse_args(args):
|
| help='Comma-separated list of arch=/path/to/toolchain-prefix mappings')
|
| other_group.add_argument('--tsan',
|
| help='Build with TSAN',
|
| - default=use_tsan(),
|
| + default=UseTSAN(),
|
| action='store_true')
|
| other_group.add_argument('--no-tsan',
|
| help='Disable TSAN',
|
| @@ -357,7 +357,7 @@ def parse_args(args):
|
| action='store_false')
|
| other_group.add_argument('--wheezy',
|
| help='Use the Debian wheezy sysroot on Linux',
|
| - default=use_wheezy(),
|
| + default=UseWheezy(),
|
| action='store_true')
|
| other_group.add_argument('--no-wheezy',
|
| help='Disable the Debian wheezy sysroot on Linux',
|
| @@ -367,17 +367,18 @@ def parse_args(args):
|
| type=int,
|
| help='Number of simultaneous GN invocations',
|
| dest='workers',
|
| - # Set to multiprocessing.cpu_count() when GN can be run in parallel.
|
| - default=1)
|
| + default=multiprocessing.cpu_count())
|
|
|
| options = parser.parse_args(args)
|
| - if not process_options(options):
|
| + if not ProcessOptions(options):
|
| parser.print_help()
|
| return None
|
| return options
|
|
|
|
|
| -def run_command(command):
|
| +# Run the command, if it succeeds returns 0, if it fails, returns the commands
|
| +# output as a string.
|
| +def RunCommand(command):
|
| try:
|
| subprocess.check_output(
|
| command, cwd=DART_ROOT, stderr=subprocess.STDOUT)
|
| @@ -387,7 +388,7 @@ def run_command(command):
|
| "output: " + e.output)
|
|
|
|
|
| -def main(argv):
|
| +def Main(argv):
|
| starttime = time.time()
|
| args = parse_args(argv)
|
|
|
| @@ -396,32 +397,28 @@ def main(argv):
|
| elif sys.platform == 'darwin':
|
| subdir = 'mac'
|
| elif sys.platform.startswith('linux'):
|
| - subdir = 'linux64'
|
| + subdir = 'linux64'
|
| else:
|
| print 'Unknown platform: ' + sys.platform
|
| return 1
|
| + gn = os.path.join(DART_ROOT, 'buildtools', subdir, 'gn')
|
|
|
| commands = []
|
| for target_os in args.os:
|
| for mode in args.mode:
|
| for arch in args.arch:
|
| - command = [
|
| - '%s/buildtools/%s/gn' % (DART_ROOT, subdir),
|
| - 'gen',
|
| - '--check'
|
| - ]
|
| - gn_args = to_command_line(to_gn_args(args, mode, arch, target_os))
|
| - out_dir = get_out_dir(mode, arch, target_os)
|
| + out_dir = GetOutDir(mode, arch, target_os)
|
| + command = [gn, 'gen', out_dir, '--check']
|
| + gn_args = ToCommandLine(ToGnArgs(args, mode, arch, target_os))
|
| if args.verbose:
|
| print "gn gen --check in %s" % out_dir
|
| if args.ide:
|
| command.append(ide_switch(HOST_OS))
|
| - command.append(out_dir)
|
| command.append('--args=%s' % ' '.join(gn_args))
|
| commands.append(command)
|
|
|
| pool = multiprocessing.Pool(args.workers)
|
| - results = pool.map(run_command, commands, chunksize=1)
|
| + results = pool.map(RunCommand, commands, chunksize=1)
|
| for r in results:
|
| if r != 0:
|
| print r.strip()
|
| @@ -434,4 +431,4 @@ def main(argv):
|
|
|
|
|
| if __name__ == '__main__':
|
| - sys.exit(main(sys.argv))
|
| + sys.exit(Main(sys.argv))
|
|
|