OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2016 The Dart project authors. All rights reserved. | 2 # Copyright 2016 The Dart project authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 import argparse | 6 import argparse |
7 import multiprocessing | 7 import multiprocessing |
8 import os | 8 import os |
| 9 import shutil |
9 import subprocess | 10 import subprocess |
10 import sys | 11 import sys |
11 import time | 12 import time |
12 import utils | 13 import utils |
13 | 14 |
14 HOST_OS = utils.GuessOS() | 15 HOST_OS = utils.GuessOS() |
15 HOST_ARCH = utils.GuessArchitecture() | 16 HOST_ARCH = utils.GuessArchitecture() |
16 SCRIPT_DIR = os.path.dirname(sys.argv[0]) | 17 SCRIPT_DIR = os.path.dirname(sys.argv[0]) |
17 DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..')) | 18 DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..')) |
| 19 GN = os.path.join(DART_ROOT, 'buildtools', 'gn') |
18 | 20 |
19 # Environment variables for default settings. | 21 # Environment variables for default settings. |
20 DART_USE_ASAN = "DART_USE_ASAN" # Use instead of --asan | 22 DART_USE_ASAN = "DART_USE_ASAN" # Use instead of --asan |
21 DART_USE_MSAN = "DART_USE_MSAN" # Use instead of --msan | 23 DART_USE_MSAN = "DART_USE_MSAN" # Use instead of --msan |
22 DART_USE_TSAN = "DART_USE_TSAN" # Use instead of --tsan | 24 DART_USE_TSAN = "DART_USE_TSAN" # Use instead of --tsan |
23 DART_USE_WHEEZY = "DART_USE_WHEEZY" # Use instread of --wheezy | 25 DART_USE_WHEEZY = "DART_USE_WHEEZY" # Use instread of --wheezy |
24 DART_USE_TOOLCHAIN = "DART_USE_TOOLCHAIN" # Use instread of --toolchain-prefix | 26 DART_USE_TOOLCHAIN = "DART_USE_TOOLCHAIN" # Use instread of --toolchain-prefix |
25 DART_USE_SYSROOT = "DART_USE_SYSROOT" # Use instead of --target-sysroot | 27 DART_USE_SYSROOT = "DART_USE_SYSROOT" # Use instead of --target-sysroot |
26 | 28 |
27 def use_asan(): | 29 def UseASAN(): |
28 return DART_USE_ASAN in os.environ | 30 return DART_USE_ASAN in os.environ |
29 | 31 |
30 | 32 |
31 def use_msan(): | 33 def UseMSAN(): |
32 return DART_USE_MSAN in os.environ | 34 return DART_USE_MSAN in os.environ |
33 | 35 |
34 | 36 |
35 def use_tsan(): | 37 def UseTSAN(): |
36 return DART_USE_TSAN in os.environ | 38 return DART_USE_TSAN in os.environ |
37 | 39 |
38 | 40 |
39 def use_wheezy(): | 41 def UseWheezy(): |
40 return DART_USE_WHEEZY in os.environ | 42 return DART_USE_WHEEZY in os.environ |
41 | 43 |
42 | 44 |
43 def toolchain_prefix(args): | 45 def ToolchainPrefix(args): |
44 if args.toolchain_prefix: | 46 if args.toolchain_prefix: |
45 return args.toolchain_prefix | 47 return args.toolchain_prefix |
46 return os.environ.get(DART_USE_TOOLCHAIN) | 48 return os.environ.get(DART_USE_TOOLCHAIN) |
47 | 49 |
48 | 50 |
49 def target_sysroot(args): | 51 def TargetSysroot(args): |
50 if args.target_sysroot: | 52 if args.target_sysroot: |
51 return args.target_sysroot | 53 return args.target_sysroot |
52 return os.environ.get(DART_USE_SYSROOT) | 54 return os.environ.get(DART_USE_SYSROOT) |
53 | 55 |
54 | 56 |
55 def get_out_dir(mode, arch, target_os): | 57 def GetOutDir(mode, arch, target_os): |
56 return utils.GetBuildRoot(HOST_OS, mode, arch, target_os) | 58 return utils.GetBuildRoot(HOST_OS, mode, arch, target_os) |
57 | 59 |
58 | 60 |
59 def to_command_line(gn_args): | 61 def ToCommandLine(gn_args): |
60 def merge(key, value): | 62 def merge(key, value): |
61 if type(value) is bool: | 63 if type(value) is bool: |
62 return '%s=%s' % (key, 'true' if value else 'false') | 64 return '%s=%s' % (key, 'true' if value else 'false') |
63 return '%s="%s"' % (key, value) | 65 return '%s="%s"' % (key, value) |
64 return [merge(x, y) for x, y in gn_args.iteritems()] | 66 return [merge(x, y) for x, y in gn_args.iteritems()] |
65 | 67 |
66 | 68 |
67 def host_cpu_for_arch(arch): | 69 def HostCpuForArch(arch): |
68 if arch in ['ia32', 'arm', 'armv6', 'armv5te', 'mips', | 70 if arch in ['ia32', 'arm', 'armv6', 'armv5te', 'mips', |
69 'simarm', 'simarmv6', 'simarmv5te', 'simmips', 'simdbc', | 71 'simarm', 'simarmv6', 'simarmv5te', 'simmips', 'simdbc', |
70 'armsimdbc']: | 72 'armsimdbc']: |
71 return 'x86' | 73 return 'x86' |
72 if arch in ['x64', 'arm64', 'simarm64', 'simdbc64', 'armsimdbc64']: | 74 if arch in ['x64', 'arm64', 'simarm64', 'simdbc64', 'armsimdbc64']: |
73 return 'x64' | 75 return 'x64' |
74 | 76 |
75 | 77 |
76 def target_cpu_for_arch(arch, target_os): | 78 def TargetCpuForArch(arch, target_os): |
77 if arch in ['ia32', 'simarm', 'simarmv6', 'simarmv5te', 'simmips']: | 79 if arch in ['ia32', 'simarm', 'simarmv6', 'simarmv5te', 'simmips']: |
78 return 'x86' | 80 return 'x86' |
79 if arch in ['simarm64']: | 81 if arch in ['simarm64']: |
80 return 'x64' | 82 return 'x64' |
81 if arch == 'mips': | 83 if arch == 'mips': |
82 return 'mipsel' | 84 return 'mipsel' |
83 if arch == 'simdbc': | 85 if arch == 'simdbc': |
84 return 'arm' if target_os == 'android' else 'x86' | 86 return 'arm' if target_os == 'android' else 'x86' |
85 if arch == 'simdbc64': | 87 if arch == 'simdbc64': |
86 return 'arm64' if target_os == 'android' else 'x64' | 88 return 'arm64' if target_os == 'android' else 'x64' |
87 if arch == 'armsimdbc': | 89 if arch == 'armsimdbc': |
88 return 'arm' | 90 return 'arm' |
89 if arch == 'armsimdbc64': | 91 if arch == 'armsimdbc64': |
90 return 'arm64' | 92 return 'arm64' |
91 return arch | 93 return arch |
92 | 94 |
93 | 95 |
94 def host_os_for_gn(host_os): | 96 def HostOsForGn(host_os): |
95 if host_os.startswith('macos'): | 97 if host_os.startswith('macos'): |
96 return 'mac' | 98 return 'mac' |
97 if host_os.startswith('win'): | 99 if host_os.startswith('win'): |
98 return 'win' | 100 return 'win' |
99 return host_os | 101 return host_os |
100 | 102 |
101 | 103 |
102 # Where string_map is formatted as X1=Y1,X2=Y2 etc. | 104 # Where string_map is formatted as X1=Y1,X2=Y2 etc. |
103 # If key is X1, returns Y1. | 105 # If key is X1, returns Y1. |
104 def parse_string_map(key, string_map): | 106 def ParseStringMap(key, string_map): |
105 for m in string_map.split(','): | 107 for m in string_map.split(','): |
106 l = m.split('=') | 108 l = m.split('=') |
107 if l[0] == key: | 109 if l[0] == key: |
108 return l[1] | 110 return l[1] |
109 return None | 111 return None |
110 | 112 |
111 | 113 |
112 def to_gn_args(args, mode, arch, target_os): | 114 def ToGnArgs(args, mode, arch, target_os): |
113 gn_args = {} | 115 gn_args = {} |
114 | 116 |
115 host_os = host_os_for_gn(HOST_OS) | 117 host_os = HostOsForGn(HOST_OS) |
116 if target_os == 'host': | 118 if target_os == 'host': |
117 gn_args['target_os'] = host_os | 119 gn_args['target_os'] = host_os |
118 else: | 120 else: |
119 gn_args['target_os'] = target_os | 121 gn_args['target_os'] = target_os |
120 | 122 |
121 gn_args['dart_target_arch'] = arch | 123 gn_args['dart_target_arch'] = arch |
122 gn_args['target_cpu'] = target_cpu_for_arch(arch, target_os) | 124 gn_args['target_cpu'] = TargetCpuForArch(arch, target_os) |
123 gn_args['host_cpu'] = host_cpu_for_arch(arch) | 125 gn_args['host_cpu'] = HostCpuForArch(arch) |
124 | 126 |
125 # See: runtime/observatory/BUILD.gn. | 127 # See: runtime/observatory/BUILD.gn. |
126 # This allows the standalone build of the observatory to fall back on | 128 # This allows the standalone build of the observatory to fall back on |
127 # dart_bootstrap if the prebuilt SDK doesn't work. | 129 # dart_bootstrap if the prebuilt SDK doesn't work. |
128 gn_args['dart_host_pub_exe'] = "" | 130 gn_args['dart_host_pub_exe'] = "" |
129 | 131 |
130 # We only want the fallback root certs in the standalone VM on | 132 # We only want the fallback root certs in the standalone VM on |
131 # Linux and Windows. | 133 # Linux and Windows. |
132 if gn_args['target_os'] in ['linux', 'win']: | 134 if gn_args['target_os'] in ['linux', 'win']: |
133 gn_args['dart_use_fallback_root_certificates'] = True | 135 gn_args['dart_use_fallback_root_certificates'] = True |
(...skipping 24 matching lines...) Expand all Loading... |
158 gn_args['dart_debug'] = mode == 'debug' | 160 gn_args['dart_debug'] = mode == 'debug' |
159 | 161 |
160 # This setting is only meaningful for Flutter. Standalone builds of the VM | 162 # This setting is only meaningful for Flutter. Standalone builds of the VM |
161 # should leave this set to 'develop', which causes the build to defer to | 163 # should leave this set to 'develop', which causes the build to defer to |
162 # 'is_debug', 'is_release' and 'is_product'. | 164 # 'is_debug', 'is_release' and 'is_product'. |
163 gn_args['dart_runtime_mode'] = 'develop' | 165 gn_args['dart_runtime_mode'] = 'develop' |
164 | 166 |
165 # TODO(zra): Investigate using clang with these configurations. | 167 # TODO(zra): Investigate using clang with these configurations. |
166 # Clang compiles tcmalloc's inline assembly for ia32 on Linux wrong, so we | 168 # Clang compiles tcmalloc's inline assembly for ia32 on Linux wrong, so we |
167 # don't use clang in that configuration. Thus, we use gcc for ia32 *unless* | 169 # don't use clang in that configuration. Thus, we use gcc for ia32 *unless* |
168 # asan or tsan is specified. | 170 # a clang-based sanitizer is specified. |
169 has_clang = (host_os != 'win' | 171 has_clang = (host_os != 'win' |
170 and args.os not in ['android'] | |
171 and not gn_args['target_cpu'].startswith('arm') | |
172 and not gn_args['target_cpu'].startswith('mips') | 172 and not gn_args['target_cpu'].startswith('mips') |
173 and not ((gn_args['target_os'] == 'linux') | 173 and not ((gn_args['target_os'] == 'linux') |
174 and (gn_args['host_cpu'] == 'x86') | 174 and (gn_args['host_cpu'] == 'x86') |
175 and not args.asan | 175 and not args.asan |
176 and not args.msan | 176 and not args.msan |
177 and not args.tsan)) # Use clang for sanitizer builds. | 177 and not args.tsan)) # Use clang for sanitizer builds. |
178 gn_args['is_clang'] = args.clang and has_clang | 178 gn_args['is_clang'] = args.clang and has_clang |
179 | 179 |
180 gn_args['is_asan'] = args.asan and gn_args['is_clang'] | 180 gn_args['is_asan'] = args.asan and gn_args['is_clang'] |
181 gn_args['is_msan'] = args.msan and gn_args['is_clang'] | 181 gn_args['is_msan'] = args.msan and gn_args['is_clang'] |
182 gn_args['is_tsan'] = args.tsan and gn_args['is_clang'] | 182 gn_args['is_tsan'] = args.tsan and gn_args['is_clang'] |
183 | 183 |
184 # Setup the user-defined sysroot. | 184 # Setup the user-defined sysroot. |
185 if gn_args['target_os'] == 'linux' and args.wheezy: | 185 if gn_args['target_os'] == 'linux' and args.wheezy: |
186 gn_args['dart_use_wheezy_sysroot'] = True | 186 gn_args['dart_use_wheezy_sysroot'] = True |
187 else: | 187 else: |
188 sysroot = target_sysroot(args) | 188 sysroot = TargetSysroot(args) |
189 if sysroot: | 189 if sysroot: |
190 gn_args['target_sysroot'] = parse_string_map(arch, sysroot) | 190 gn_args['target_sysroot'] = ParseStringMap(arch, sysroot) |
191 | 191 |
192 toolchain = toolchain_prefix(args) | 192 toolchain = ToolchainPrefix(args) |
193 if toolchain: | 193 if toolchain: |
194 gn_args['toolchain_prefix'] = parse_string_map(arch, toolchain) | 194 gn_args['toolchain_prefix'] = ParseStringMap(arch, toolchain) |
195 | 195 |
196 goma_dir = os.environ.get('GOMA_DIR') | 196 goma_dir = os.environ.get('GOMA_DIR') |
197 goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma') | 197 goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma') |
198 if args.goma and goma_dir: | 198 if args.goma and goma_dir: |
199 gn_args['use_goma'] = True | 199 gn_args['use_goma'] = True |
200 gn_args['goma_dir'] = goma_dir | 200 gn_args['goma_dir'] = goma_dir |
201 elif args.goma and os.path.exists(goma_home_dir): | 201 elif args.goma and os.path.exists(goma_home_dir): |
202 gn_args['use_goma'] = True | 202 gn_args['use_goma'] = True |
203 gn_args['goma_dir'] = goma_home_dir | 203 gn_args['goma_dir'] = goma_home_dir |
204 else: | 204 else: |
205 gn_args['use_goma'] = False | 205 gn_args['use_goma'] = False |
206 gn_args['goma_dir'] = None | 206 gn_args['goma_dir'] = None |
207 | 207 |
208 if args.debug_opt_level: | 208 if args.debug_opt_level: |
209 gn_args['dart_debug_optimization_level'] = args.debug_opt_level | 209 gn_args['dart_debug_optimization_level'] = args.debug_opt_level |
210 gn_args['debug_optimization_level'] = args.debug_opt_level | 210 gn_args['debug_optimization_level'] = args.debug_opt_level |
211 | 211 |
212 return gn_args | 212 return gn_args |
213 | 213 |
214 | 214 |
215 def process_os_option(os_name): | 215 def ProcessOsOption(os_name): |
216 if os_name == 'host': | 216 if os_name == 'host': |
217 return HOST_OS | 217 return HOST_OS |
218 return os_name | 218 return os_name |
219 | 219 |
220 | 220 |
221 def process_options(args): | 221 def ProcessOptions(args): |
222 if args.arch == 'all': | 222 if args.arch == 'all': |
223 args.arch = 'ia32,x64,simarm,simarm64,simmips,simdbc64' | 223 args.arch = 'ia32,x64,simarm,simarm64,simmips,simdbc64' |
224 if args.mode == 'all': | 224 if args.mode == 'all': |
225 args.mode = 'debug,release,product' | 225 args.mode = 'debug,release,product' |
226 if args.os == 'all': | 226 if args.os == 'all': |
227 args.os = 'host,android' | 227 args.os = 'host,android' |
228 args.mode = args.mode.split(',') | 228 args.mode = args.mode.split(',') |
229 args.arch = args.arch.split(',') | 229 args.arch = args.arch.split(',') |
230 args.os = args.os.split(',') | 230 args.os = args.os.split(',') |
231 for mode in args.mode: | 231 for mode in args.mode: |
232 if not mode in ['debug', 'release', 'product']: | 232 if not mode in ['debug', 'release', 'product']: |
233 print "Unknown mode %s" % mode | 233 print "Unknown mode %s" % mode |
234 return False | 234 return False |
235 for arch in args.arch: | 235 for arch in args.arch: |
236 archs = ['ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6', | 236 archs = ['ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6', |
237 'simarmv5te', 'armv5te', 'simmips', 'mips', 'simarm64', 'arm64', | 237 'simarmv5te', 'armv5te', 'simmips', 'mips', 'simarm64', 'arm64', |
238 'simdbc', 'simdbc64', 'armsimdbc', 'armsimdbc64'] | 238 'simdbc', 'simdbc64', 'armsimdbc', 'armsimdbc64'] |
239 if not arch in archs: | 239 if not arch in archs: |
240 print "Unknown arch %s" % arch | 240 print "Unknown arch %s" % arch |
241 return False | 241 return False |
242 oses = [process_os_option(os_name) for os_name in args.os] | 242 oses = [ProcessOsOption(os_name) for os_name in args.os] |
243 for os_name in oses: | 243 for os_name in oses: |
244 if not os_name in ['android', 'freebsd', 'linux', 'macos', 'win32']: | 244 if not os_name in ['android', 'freebsd', 'linux', 'macos', 'win32']: |
245 print "Unknown os %s" % os_name | 245 print "Unknown os %s" % os_name |
246 return False | 246 return False |
247 if os_name != HOST_OS: | 247 if os_name != HOST_OS: |
248 if os_name != 'android': | 248 if os_name != 'android': |
249 print "Unsupported target os %s" % os_name | 249 print "Unsupported target os %s" % os_name |
250 return False | 250 return False |
251 if not HOST_OS in ['linux']: | 251 if not HOST_OS in ['linux', 'macos']: |
252 print ("Cross-compilation to %s is not supported on host os %s." | 252 print ("Cross-compilation to %s is not supported on host os %s." |
253 % (os_name, HOST_OS)) | 253 % (os_name, HOST_OS)) |
254 return False | 254 return False |
255 if not arch in ['ia32', 'x64', 'arm', 'armv6', 'armv5te', 'arm64', 'mips', | 255 if not arch in ['ia32', 'x64', 'arm', 'armv6', 'armv5te', 'arm64', 'mips', |
256 'simdbc', 'simdbc64']: | 256 'simdbc', 'simdbc64']: |
257 print ("Cross-compilation to %s is not supported for architecture %s." | 257 print ("Cross-compilation to %s is not supported for architecture %s." |
258 % (os_name, arch)) | 258 % (os_name, arch)) |
259 return False | 259 return False |
260 return True | 260 return True |
261 | 261 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 type=str, | 296 type=str, |
297 help='Target OSs (comma-separated).', | 297 help='Target OSs (comma-separated).', |
298 metavar='[all,host,android]', | 298 metavar='[all,host,android]', |
299 default='host') | 299 default='host') |
300 common_group.add_argument("-v", "--verbose", | 300 common_group.add_argument("-v", "--verbose", |
301 help='Verbose output.', | 301 help='Verbose output.', |
302 default=False, action="store_true") | 302 default=False, action="store_true") |
303 | 303 |
304 other_group.add_argument('--asan', | 304 other_group.add_argument('--asan', |
305 help='Build with ASAN', | 305 help='Build with ASAN', |
306 default=use_asan(), | 306 default=UseASAN(), |
307 action='store_true') | 307 action='store_true') |
308 other_group.add_argument('--no-asan', | 308 other_group.add_argument('--no-asan', |
309 help='Disable ASAN', | 309 help='Disable ASAN', |
310 dest='asan', | 310 dest='asan', |
311 action='store_false') | 311 action='store_false') |
312 other_group.add_argument('--clang', | 312 other_group.add_argument('--clang', |
313 help='Use Clang', | 313 help='Use Clang', |
314 default=True, | 314 default=True, |
315 action='store_true') | 315 action='store_true') |
316 other_group.add_argument('--no-clang', | 316 other_group.add_argument('--no-clang', |
(...skipping 11 matching lines...) Expand all Loading... |
328 other_group.add_argument('--no-goma', | 328 other_group.add_argument('--no-goma', |
329 help='Disable goma', | 329 help='Disable goma', |
330 dest='goma', | 330 dest='goma', |
331 action='store_false') | 331 action='store_false') |
332 other_group.add_argument('--ide', | 332 other_group.add_argument('--ide', |
333 help='Generate an IDE file.', | 333 help='Generate an IDE file.', |
334 default=os_has_ide(HOST_OS), | 334 default=os_has_ide(HOST_OS), |
335 action='store_true') | 335 action='store_true') |
336 other_group.add_argument('--msan', | 336 other_group.add_argument('--msan', |
337 help='Build with MSAN', | 337 help='Build with MSAN', |
338 default=use_msan(), | 338 default=UseMSAN(), |
339 action='store_true') | 339 action='store_true') |
340 other_group.add_argument('--no-msan', | 340 other_group.add_argument('--no-msan', |
341 help='Disable MSAN', | 341 help='Disable MSAN', |
342 dest='msan', | 342 dest='msan', |
343 action='store_false') | 343 action='store_false') |
344 other_group.add_argument('--target-sysroot', '-s', | 344 other_group.add_argument('--target-sysroot', '-s', |
345 type=str, | 345 type=str, |
346 help='Comma-separated list of arch=/path/to/sysroot mappings') | 346 help='Comma-separated list of arch=/path/to/sysroot mappings') |
347 other_group.add_argument('--toolchain-prefix', '-t', | 347 other_group.add_argument('--toolchain-prefix', '-t', |
348 type=str, | 348 type=str, |
349 help='Comma-separated list of arch=/path/to/toolchain-prefix mappings') | 349 help='Comma-separated list of arch=/path/to/toolchain-prefix mappings') |
350 other_group.add_argument('--tsan', | 350 other_group.add_argument('--tsan', |
351 help='Build with TSAN', | 351 help='Build with TSAN', |
352 default=use_tsan(), | 352 default=UseTSAN(), |
353 action='store_true') | 353 action='store_true') |
354 other_group.add_argument('--no-tsan', | 354 other_group.add_argument('--no-tsan', |
355 help='Disable TSAN', | 355 help='Disable TSAN', |
356 dest='tsan', | 356 dest='tsan', |
357 action='store_false') | 357 action='store_false') |
358 other_group.add_argument('--wheezy', | 358 other_group.add_argument('--wheezy', |
359 help='Use the Debian wheezy sysroot on Linux', | 359 help='Use the Debian wheezy sysroot on Linux', |
360 default=use_wheezy(), | 360 default=UseWheezy(), |
361 action='store_true') | 361 action='store_true') |
362 other_group.add_argument('--no-wheezy', | 362 other_group.add_argument('--no-wheezy', |
363 help='Disable the Debian wheezy sysroot on Linux', | 363 help='Disable the Debian wheezy sysroot on Linux', |
364 dest='wheezy', | 364 dest='wheezy', |
365 action='store_false') | 365 action='store_false') |
366 other_group.add_argument('--workers', '-w', | 366 other_group.add_argument('--workers', '-w', |
367 type=int, | 367 type=int, |
368 help='Number of simultaneous GN invocations', | 368 help='Number of simultaneous GN invocations', |
369 dest='workers', | 369 dest='workers', |
370 # Set to multiprocessing.cpu_count() when GN can be run in parallel. | 370 default=multiprocessing.cpu_count()) |
371 default=1) | |
372 | 371 |
373 options = parser.parse_args(args) | 372 options = parser.parse_args(args) |
374 if not process_options(options): | 373 if not ProcessOptions(options): |
375 parser.print_help() | 374 parser.print_help() |
376 return None | 375 return None |
377 return options | 376 return options |
378 | 377 |
379 | 378 |
380 def run_command(command): | 379 # Run the command, if it succeeds returns 0, if it fails, returns the commands |
| 380 # output as a string. |
| 381 def RunCommand(command): |
381 try: | 382 try: |
382 subprocess.check_output( | 383 subprocess.check_output( |
383 command, cwd=DART_ROOT, stderr=subprocess.STDOUT) | 384 command, cwd=DART_ROOT, stderr=subprocess.STDOUT) |
384 return 0 | 385 return 0 |
385 except subprocess.CalledProcessError as e: | 386 except subprocess.CalledProcessError as e: |
386 return ("Command failed: " + ' '.join(command) + "\n" + | 387 return ("Command failed: " + ' '.join(command) + "\n" + |
387 "output: " + e.output) | 388 "output: " + e.output) |
388 | 389 |
389 | 390 |
390 def main(argv): | 391 def Main(argv): |
391 starttime = time.time() | 392 starttime = time.time() |
392 args = parse_args(argv) | 393 args = parse_args(argv) |
393 | 394 |
394 if sys.platform.startswith(('cygwin', 'win')): | 395 if sys.platform.startswith(('cygwin', 'win')): |
395 subdir = 'win' | 396 subdir = 'win' |
396 elif sys.platform == 'darwin': | 397 elif sys.platform == 'darwin': |
397 subdir = 'mac' | 398 subdir = 'mac' |
398 elif sys.platform.startswith('linux'): | 399 elif sys.platform.startswith('linux'): |
399 subdir = 'linux64' | 400 subdir = 'linux64' |
400 else: | 401 else: |
401 print 'Unknown platform: ' + sys.platform | 402 print 'Unknown platform: ' + sys.platform |
402 return 1 | 403 return 1 |
| 404 gn = os.path.join(DART_ROOT, 'buildtools', subdir, 'gn') |
403 | 405 |
404 commands = [] | 406 commands = [] |
405 for target_os in args.os: | 407 for target_os in args.os: |
406 for mode in args.mode: | 408 for mode in args.mode: |
407 for arch in args.arch: | 409 for arch in args.arch: |
408 command = [ | 410 out_dir = GetOutDir(mode, arch, target_os) |
409 '%s/buildtools/%s/gn' % (DART_ROOT, subdir), | 411 command = [gn, 'gen', out_dir, '--check'] |
410 'gen', | 412 gn_args = ToCommandLine(ToGnArgs(args, mode, arch, target_os)) |
411 '--check' | |
412 ] | |
413 gn_args = to_command_line(to_gn_args(args, mode, arch, target_os)) | |
414 out_dir = get_out_dir(mode, arch, target_os) | |
415 if args.verbose: | 413 if args.verbose: |
416 print "gn gen --check in %s" % out_dir | 414 print "gn gen --check in %s" % out_dir |
417 if args.ide: | 415 if args.ide: |
418 command.append(ide_switch(HOST_OS)) | 416 command.append(ide_switch(HOST_OS)) |
419 command.append(out_dir) | |
420 command.append('--args=%s' % ' '.join(gn_args)) | 417 command.append('--args=%s' % ' '.join(gn_args)) |
421 commands.append(command) | 418 commands.append(command) |
422 | 419 |
423 pool = multiprocessing.Pool(args.workers) | 420 pool = multiprocessing.Pool(args.workers) |
424 results = pool.map(run_command, commands, chunksize=1) | 421 results = pool.map(RunCommand, commands, chunksize=1) |
425 for r in results: | 422 for r in results: |
426 if r != 0: | 423 if r != 0: |
427 print r.strip() | 424 print r.strip() |
428 return 1 | 425 return 1 |
429 | 426 |
430 endtime = time.time() | 427 endtime = time.time() |
431 if args.verbose: | 428 if args.verbose: |
432 print ("GN Time: %.3f seconds" % (endtime - starttime)) | 429 print ("GN Time: %.3f seconds" % (endtime - starttime)) |
433 return 0 | 430 return 0 |
434 | 431 |
435 | 432 |
436 if __name__ == '__main__': | 433 if __name__ == '__main__': |
437 sys.exit(main(sys.argv)) | 434 sys.exit(Main(sys.argv)) |
OLD | NEW |