Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Unified Diff: tools/gn.py

Issue 2392603005: Improvements to tools/gn.py (Closed)
Patch Set: Better script description Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/build.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn.py
diff --git a/tools/gn.py b/tools/gn.py
index 2cef91cd982dd52e4e4afa8fd0f3f303b566fb6f..9ebe0f0f733e263652619c4ce2f67d685379871c 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -4,19 +4,22 @@
# found in the LICENSE file.
import argparse
+import multiprocessing
+import os
import subprocess
import sys
-import os
+import time
import utils
HOST_OS = utils.GuessOS()
HOST_ARCH = utils.GuessArchitecture()
-HOST_CPUS = utils.GuessCpus()
SCRIPT_DIR = os.path.dirname(sys.argv[0])
DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
-def get_out_dir(args):
- return utils.GetBuildRoot(HOST_OS, args.mode, args.arch, args.os)
+
+def get_out_dir(mode, arch, target_os):
+ return utils.GetBuildRoot(HOST_OS, mode, arch, target_os)
+
def to_command_line(gn_args):
def merge(key, value):
@@ -25,6 +28,7 @@ def to_command_line(gn_args):
return '%s="%s"' % (key, value)
return [merge(x, y) for x, y in gn_args.iteritems()]
+
def host_cpu_for_arch(arch):
if arch in ['ia32', 'arm', 'armv6', 'armv5te', 'mips',
'simarm', 'simarmv6', 'simarmv5te', 'simmips', 'simdbc']:
@@ -32,7 +36,8 @@ def host_cpu_for_arch(arch):
if arch in ['x64', 'arm64', 'simarm64', 'simdbc64']:
return 'x64'
-def target_cpu_for_arch(arch, os):
+
+def target_cpu_for_arch(arch, target_os):
if arch in ['ia32', 'simarm', 'simarmv6', 'simarmv5te', 'simmips']:
return 'x86'
if arch in ['simarm64']:
@@ -40,30 +45,32 @@ def target_cpu_for_arch(arch, os):
if arch == 'mips':
return 'mipsel'
if arch == 'simdbc':
- return 'arm' if os == 'android' else 'x86'
+ return 'arm' if target_os == 'android' else 'x86'
if arch == 'simdbc64':
- return 'arm64' if os == 'android' else 'x64'
+ return 'arm64' if target_os == 'android' else 'x64'
return arch
-def host_os_for_gn(os):
- if os.startswith('macos'):
+
+def host_os_for_gn(host_os):
+ if host_os.startswith('macos'):
return 'mac'
- if os.startswith('win'):
+ if host_os.startswith('win'):
return 'win'
- return os
+ return host_os
+
-def to_gn_args(args):
+def to_gn_args(args, mode, arch, target_os):
gn_args = {}
host_os = host_os_for_gn(HOST_OS)
- if args.os == 'host':
+ if target_os == 'host':
gn_args['target_os'] = host_os
else:
- gn_args['target_os'] = args.os
+ gn_args['target_os'] = target_os
- gn_args['dart_target_arch'] = args.arch
- gn_args['target_cpu'] = target_cpu_for_arch(args.arch, args.os)
- gn_args['host_cpu'] = host_cpu_for_arch(args.arch)
+ 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)
# TODO(zra): This is for the observatory, which currently builds using the
# checked-in sdk. If/when the observatory no longer builds with the
@@ -82,10 +89,10 @@ def to_gn_args(args):
gn_args['dart_use_tcmalloc'] = gn_args['target_os'] == 'linux'
- gn_args['is_debug'] = args.mode == 'debug'
- gn_args['is_release'] = args.mode == 'release'
- gn_args['is_product'] = args.mode == 'product'
- gn_args['dart_debug'] = args.mode == 'debug'
+ gn_args['is_debug'] = mode == 'debug'
+ gn_args['is_release'] = mode == 'release'
+ gn_args['is_product'] = mode == 'product'
+ gn_args['dart_debug'] = mode == 'debug'
# This setting is only meaningful for Flutter. Standalone builds of the VM
# should leave this set to 'develop', which causes the build to defer to
@@ -117,37 +124,125 @@ def to_gn_args(args):
return gn_args
+
+def process_os_option(os_name):
+ if os_name == 'host':
+ return HOST_OS
+ return os_name
+
+
+def process_options(args):
+ if args.arch == 'all':
+ args.arch = 'ia32,x64,simarm,simarm64,simmips,simdbc64'
+ if args.mode == 'all':
+ args.mode = 'debug,release,product'
+ if args.os == 'all':
+ args.os = 'host,android'
+ args.mode = args.mode.split(',')
+ args.arch = args.arch.split(',')
+ args.os = args.os.split(',')
+ for mode in args.mode:
+ if not mode in ['debug', 'release', 'product']:
+ print "Unknown mode %s" % mode
+ return False
+ for arch in args.arch:
+ archs = ['ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6',
+ 'simarmv5te', 'armv5te', 'simmips', 'mips', 'simarm64', 'arm64',
+ 'simdbc', 'simdbc64', 'armsimdbc']
+ if not arch in archs:
+ print "Unknown arch %s" % arch
+ return False
+ oses = [process_os_option(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
+ return False
+ if os_name != HOST_OS:
+ if os_name != 'android':
+ print "Unsupported target os %s" % os_name
+ return False
+ if not HOST_OS in ['linux']:
+ print ("Cross-compilation to %s is not supported on host os %s."
+ % (os_name, HOST_OS))
+ return False
+ if not arch in ['ia32', 'x64', 'arm', 'armv6', 'armv5te', 'arm64', 'mips',
+ 'simdbc', 'simdbc64']:
+ print ("Cross-compilation to %s is not supported for architecture %s."
+ % (os_name, arch))
+ return False
+ return True
+
+
def parse_args(args):
args = args[1:]
- parser = argparse.ArgumentParser(description='A script run` gn gen`.')
+ parser = argparse.ArgumentParser(description='A script to run `gn gen`.')
+ parser.add_argument("-v", "--verbose",
+ help='Verbose output.',
+ default=False, action="store_true")
parser.add_argument('--mode', '-m',
type=str,
- choices=['debug', 'release', 'product'],
+ help='Build variants (comma-separated).',
+ metavar='[all,debug,release,product]',
default='debug')
parser.add_argument('--os',
type=str,
- choices=['host', 'android'],
+ help='Target OSs (comma-separated).',
+ metavar='[all,host,android]',
default='host')
parser.add_argument('--arch', '-a',
type=str,
- choices=['ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6',
- 'simarmv5te', 'armv5te', 'simmips', 'mips', 'simarm64', 'arm64',
- 'simdbc', 'simdbc64'],
+ help='Target architectures (comma-separated).',
+ metavar='[all,ia32,x64,simarm,arm,simarmv6,armv6,simarmv5te,armv5te,'
+ 'simmips,mips,simarm64,arm64,simdbc,armsimdbc]',
default='x64')
+ parser.add_argument('--goma',
+ help='Use goma',
+ default=True,
+ action='store_true')
+ parser.add_argument('--no-goma',
+ help='Disable goma',
+ dest='goma',
+ action='store_false')
+ parser.add_argument('--clang',
+ help='Use Clang',
+ default=True,
+ action='store_true')
+ parser.add_argument('--no-clang',
+ help='Disable Clang',
+ dest='clang',
+ action='store_false')
+ parser.add_argument('--target-sysroot', '-s',
+ type=str,
+ help='Path to the toolchain sysroot')
+ parser.add_argument('--toolchain-prefix', '-t',
+ type=str,
+ help='Path to the toolchain prefix')
+ parser.add_argument('--workers', '-w',
+ type=int,
+ help='Number of simultaneous GN invocations',
+ dest='workers',
+ default=multiprocessing.cpu_count())
- parser.add_argument('--goma', default=True, action='store_true')
- parser.add_argument('--no-goma', dest='goma', action='store_false')
+ options = parser.parse_args(args)
+ if not process_options(options):
+ parser.print_help()
+ return None
+ return options
- parser.add_argument('--clang', default=True, action='store_true')
- parser.add_argument('--no-clang', dest='clang', action='store_false')
- parser.add_argument('--target-sysroot', '-s', type=str)
- parser.add_argument('--toolchain-prefix', '-t', type=str)
+def run_command(command):
+ try:
+ subprocess.check_output(
+ command, cwd=DART_ROOT, stderr=subprocess.STDOUT)
+ return 0
+ except subprocess.CalledProcessError as e:
+ return ("Command failed: " + ' '.join(command) + "\n" +
+ "output: " + e.output)
- return parser.parse_args(args)
def main(argv):
+ starttime = time.time()
args = parse_args(argv)
if sys.platform.startswith(('cygwin', 'win')):
@@ -157,19 +252,38 @@ def main(argv):
elif sys.platform.startswith('linux'):
subdir = 'linux64'
else:
- raise Error('Unknown platform: ' + sys.platform)
-
- command = [
- '%s/buildtools/%s/gn' % (DART_ROOT, subdir),
- 'gen',
- '--check'
- ]
- gn_args = to_command_line(to_gn_args(args))
- out_dir = get_out_dir(args)
- print "gn gen --check in %s" % out_dir
- command.append(out_dir)
- command.append('--args=%s' % ' '.join(gn_args))
- return subprocess.call(command, cwd=DART_ROOT)
+ print 'Unknown platform: ' + sys.platform
+ return 1
+
+ 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)
+ if args.verbose:
+ print "gn gen --check in %s" % out_dir
+ 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)
+ for r in results:
+ if r != 0:
+ print r.strip()
+ return 1
+
+ endtime = time.time()
+ if args.verbose:
+ print "GN Time: " + str(endtime - starttime) + " seconds"
+ return 0
+
if __name__ == '__main__':
sys.exit(main(sys.argv))
« no previous file with comments | « tools/build.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698