Index: tools/gn.py |
diff --git a/tools/gn.py b/tools/gn.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..32335f09b99beefcb38412cadc27457bdff51bdd |
--- /dev/null |
+++ b/tools/gn.py |
@@ -0,0 +1,159 @@ |
+#!/usr/bin/env python |
+# Copyright 2016 The Dart project authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import argparse |
+import subprocess |
+import sys |
+import os |
+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 to_command_line(gn_args): |
+ def merge(key, value): |
+ if type(value) is bool: |
+ return '%s=%s' % (key, 'true' if value else 'false') |
+ 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']: |
+ return 'x86' |
+ if arch in ['x64', 'arm64', 'simarm64', 'simdbc64']: |
+ return 'x64' |
+ |
+def target_cpu_for_arch(arch, os): |
+ if arch in ['ia32', 'simarm', 'simarmv6', 'simarmv5te', 'simmips']: |
+ return 'x86' |
+ if arch in ['simarm64']: |
+ return 'x64' |
+ if arch == 'mips': |
+ return 'mipsel' |
+ if arch == 'simdbc': |
+ return 'arm' if os == 'android' else 'x86' |
+ if arch == 'simdbc64': |
+ return 'arm64' if os == 'android' else 'x64' |
+ return arch |
+ |
+def to_gn_args(args): |
+ gn_args = {} |
+ |
+ if args.os == 'host': |
+ gn_args['target_os'] = HOST_OS |
+ else: |
+ gn_args['target_os'] = args.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) |
+ |
+ # TODO(zra): This is for the observatory, which currently builds using the |
+ # checked-in sdk. If/when the observatory no longer builds with the |
+ # checked-in sdk, this can be removed. |
+ gn_args['dart_host_pub_exe'] = os.path.join( |
+ DART_ROOT, 'tools', 'sdks', HOST_OS, 'dart-sdk', 'bin', 'pub') |
+ |
+ # For Fuchsia support, the default is to not compile in the root |
+ # certificates. |
+ gn_args['dart_use_fallback_root_certificates'] = True |
+ |
+ gn_args['dart_zlib_path'] = "//runtime/bin/zlib" |
+ |
+ 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' |
+ |
+ # 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 |
+ # 'is_debug', 'is_release' and 'is_product'. |
+ gn_args['dart_runtime_mode'] = 'develop' |
+ |
+ gn_args['is_clang'] = args.clang and args.os not in ['android'] |
+ |
+ if args.target_sysroot: |
+ gn_args['target_sysroot'] = args.target_sysroot |
+ |
+ if args.toolchain_prefix: |
+ gn_args['toolchain_prefix'] = args.toolchain_prefix |
+ |
+ goma_dir = os.environ.get('GOMA_DIR') |
+ goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma') |
+ if args.goma and goma_dir: |
+ gn_args['use_goma'] = True |
+ gn_args['goma_dir'] = goma_dir |
+ elif args.goma and os.path.exists(goma_home_dir): |
+ gn_args['use_goma'] = True |
+ gn_args['goma_dir'] = goma_home_dir |
+ else: |
+ gn_args['use_goma'] = False |
+ gn_args['goma_dir'] = None |
+ |
+ return gn_args |
+ |
+def parse_args(args): |
+ args = args[1:] |
+ parser = argparse.ArgumentParser(description='A script run` gn gen`.') |
+ |
+ parser.add_argument('--mode', '-m', |
+ type=str, |
+ choices=['debug', 'release', 'product'], |
+ default='debug') |
+ parser.add_argument('--os', |
+ type=str, |
+ choices=['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'], |
+ default='x64') |
+ |
+ parser.add_argument('--goma', default=True, action='store_true') |
+ parser.add_argument('--no-goma', dest='goma', action='store_false') |
+ |
+ 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) |
+ |
+ return parser.parse_args(args) |
+ |
+def main(argv): |
+ args = parse_args(argv) |
+ |
+ if sys.platform.startswith(('cygwin', 'win')): |
+ subdir = 'win' |
+ elif sys.platform == 'darwin': |
+ subdir = 'mac' |
+ 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) |
+ |
+if __name__ == '__main__': |
+ sys.exit(main(sys.argv)) |