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 subprocess | 9 import subprocess |
10 import sys | 10 import sys |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 gn_args['dart_host_pub_exe'] = "" | 83 gn_args['dart_host_pub_exe'] = "" |
84 | 84 |
85 # We only want the fallback root certs in the standalone VM on | 85 # We only want the fallback root certs in the standalone VM on |
86 # Linux and Windows. | 86 # Linux and Windows. |
87 if gn_args['target_os'] in ['linux', 'win']: | 87 if gn_args['target_os'] in ['linux', 'win']: |
88 gn_args['dart_use_fallback_root_certificates'] = True | 88 gn_args['dart_use_fallback_root_certificates'] = True |
89 | 89 |
90 gn_args['dart_zlib_path'] = "//runtime/bin/zlib" | 90 gn_args['dart_zlib_path'] = "//runtime/bin/zlib" |
91 | 91 |
92 # Use tcmalloc only when targeting Linux and when not using ASAN. | 92 # Use tcmalloc only when targeting Linux and when not using ASAN. |
93 gn_args['dart_use_tcmalloc'] = (gn_args['target_os'] == 'linux' | 93 gn_args['dart_use_tcmalloc'] = ((gn_args['target_os'] == 'linux') |
94 and not args.asan) | 94 and not args.asan |
| 95 and not args.msan |
| 96 and not args.tsan) |
95 | 97 |
96 # Force -mfloat-abi=hard and -mfpu=neon on Linux as we're specifying | 98 # Force -mfloat-abi=hard and -mfpu=neon on Linux as we're specifying |
97 # a gnueabihf compiler in //build/toolchain/linux BUILD.gn. | 99 # a gnueabihf compiler in //build/toolchain/linux BUILD.gn. |
98 # TODO(zra): This will likely need some adjustment to build for armv6 etc. | 100 # TODO(zra): This will likely need some adjustment to build for armv6 etc. |
99 hard_float = (gn_args['target_cpu'].startswith('arm') and | 101 hard_float = (gn_args['target_cpu'].startswith('arm') and |
100 gn_args['target_os'] == 'linux') | 102 (gn_args['target_os'] == 'linux')) |
101 if hard_float: | 103 if hard_float: |
102 gn_args['arm_float_abi'] = 'hard' | 104 gn_args['arm_float_abi'] = 'hard' |
103 gn_args['arm_use_neon'] = True | 105 gn_args['arm_use_neon'] = True |
104 | 106 |
105 gn_args['is_debug'] = mode == 'debug' | 107 gn_args['is_debug'] = mode == 'debug' |
106 gn_args['is_release'] = mode == 'release' | 108 gn_args['is_release'] = mode == 'release' |
107 gn_args['is_product'] = mode == 'product' | 109 gn_args['is_product'] = mode == 'product' |
108 gn_args['dart_debug'] = mode == 'debug' | 110 gn_args['dart_debug'] = mode == 'debug' |
109 | 111 |
110 # This setting is only meaningful for Flutter. Standalone builds of the VM | 112 # This setting is only meaningful for Flutter. Standalone builds of the VM |
111 # should leave this set to 'develop', which causes the build to defer to | 113 # should leave this set to 'develop', which causes the build to defer to |
112 # 'is_debug', 'is_release' and 'is_product'. | 114 # 'is_debug', 'is_release' and 'is_product'. |
113 gn_args['dart_runtime_mode'] = 'develop' | 115 gn_args['dart_runtime_mode'] = 'develop' |
114 | 116 |
115 # TODO(zra): Investigate using clang with these configurations. | 117 # TODO(zra): Investigate using clang with these configurations. |
116 # Clang compiles tcmalloc's inline assembly for ia32 on Linux wrong, so we | 118 # Clang compiles tcmalloc's inline assembly for ia32 on Linux wrong, so we |
117 # don't use clang in that configuration. | 119 # don't use clang in that configuration. Thus, we use gcc for ia32 *unless* |
| 120 # asan or tsan is specified. |
118 has_clang = (host_os != 'win' | 121 has_clang = (host_os != 'win' |
119 and args.os not in ['android'] | 122 and args.os not in ['android'] |
120 and not (gn_args['target_os'] == 'linux' and | |
121 gn_args['host_cpu'] == 'x86' and | |
122 not args.asan) # Use clang for asan builds. | |
123 and not gn_args['target_cpu'].startswith('arm') | 123 and not gn_args['target_cpu'].startswith('arm') |
124 and not gn_args['target_cpu'].startswith('mips')) | 124 and not gn_args['target_cpu'].startswith('mips') |
| 125 and not ((gn_args['target_os'] == 'linux') |
| 126 and (gn_args['host_cpu'] == 'x86') |
| 127 and not args.asan |
| 128 and not args.msan |
| 129 and not args.tsan)) # Use clang for sanitizer builds. |
125 gn_args['is_clang'] = args.clang and has_clang | 130 gn_args['is_clang'] = args.clang and has_clang |
126 | 131 |
127 gn_args['is_asan'] = args.asan and gn_args['is_clang'] | 132 gn_args['is_asan'] = args.asan and gn_args['is_clang'] |
| 133 gn_args['is_msan'] = args.msan and gn_args['is_clang'] |
| 134 gn_args['is_tsan'] = args.tsan and gn_args['is_clang'] |
128 | 135 |
129 # Setup the user-defined sysroot. | 136 # Setup the user-defined sysroot. |
130 if gn_args['target_os'] == 'linux' and args.wheezy: | 137 if gn_args['target_os'] == 'linux' and args.wheezy: |
131 gn_args['dart_use_wheezy_sysroot'] = True | 138 gn_args['dart_use_wheezy_sysroot'] = True |
132 else: | 139 else: |
133 if args.target_sysroot: | 140 if args.target_sysroot: |
134 gn_args['target_sysroot'] = args.target_sysroot | 141 gn_args['target_sysroot'] = args.target_sysroot |
135 | 142 |
136 if args.toolchain_prefix: | 143 if args.toolchain_prefix: |
137 gn_args['toolchain_prefix'] = args.toolchain_prefix | 144 gn_args['toolchain_prefix'] = args.toolchain_prefix |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 if host_os.startswith('win'): | 214 if host_os.startswith('win'): |
208 return '--ide=vs' | 215 return '--ide=vs' |
209 elif host_os.startswith('mac'): | 216 elif host_os.startswith('mac'): |
210 return '--ide=xcode' | 217 return '--ide=xcode' |
211 else: | 218 else: |
212 return '--ide=json' | 219 return '--ide=json' |
213 | 220 |
214 | 221 |
215 # Environment variables for default settings. | 222 # Environment variables for default settings. |
216 DART_USE_ASAN = "DART_USE_ASAN" | 223 DART_USE_ASAN = "DART_USE_ASAN" |
| 224 DART_USE_MSAN = "DART_USE_MSAN" |
| 225 DART_USE_TSAN = "DART_USE_TSAN" |
217 DART_USE_WHEEZY = "DART_USE_WHEEZY" | 226 DART_USE_WHEEZY = "DART_USE_WHEEZY" |
218 | 227 |
219 def use_asan(): | 228 def use_asan(): |
220 return DART_USE_ASAN in os.environ | 229 return DART_USE_ASAN in os.environ |
221 | 230 |
| 231 def use_msan(): |
| 232 return DART_USE_MSAN in os.environ |
| 233 |
| 234 def use_tsan(): |
| 235 return DART_USE_TSAN in os.environ |
222 | 236 |
223 def use_wheezy(): | 237 def use_wheezy(): |
224 return DART_USE_WHEEZY in os.environ | 238 return DART_USE_WHEEZY in os.environ |
225 | 239 |
226 | 240 |
227 def parse_args(args): | 241 def parse_args(args): |
228 args = args[1:] | 242 args = args[1:] |
229 parser = argparse.ArgumentParser(description='A script to run `gn gen`.') | 243 parser = argparse.ArgumentParser( |
| 244 description='A script to run `gn gen`.', |
| 245 formatter_class=argparse.ArgumentDefaultsHelpFormatter) |
| 246 common_group = parser.add_argument_group('Common Arguments') |
| 247 other_group = parser.add_argument_group('Other Arguments') |
230 | 248 |
231 parser.add_argument("-v", "--verbose", | 249 common_group.add_argument('--arch', '-a', |
232 help='Verbose output.', | |
233 default=False, action="store_true") | |
234 parser.add_argument('--mode', '-m', | |
235 type=str, | |
236 help='Build variants (comma-separated).', | |
237 metavar='[all,debug,release,product]', | |
238 default='debug') | |
239 parser.add_argument('--os', | |
240 type=str, | |
241 help='Target OSs (comma-separated).', | |
242 metavar='[all,host,android]', | |
243 default='host') | |
244 parser.add_argument('--arch', '-a', | |
245 type=str, | 250 type=str, |
246 help='Target architectures (comma-separated).', | 251 help='Target architectures (comma-separated).', |
247 metavar='[all,ia32,x64,simarm,arm,simarmv6,armv6,simarmv5te,armv5te,' | 252 metavar='[all,ia32,x64,simarm,arm,simarmv6,armv6,simarmv5te,armv5te,' |
248 'simmips,mips,simarm64,arm64,simdbc,armsimdbc]', | 253 'simmips,mips,simarm64,arm64,simdbc,armsimdbc]', |
249 default='x64') | 254 default='x64') |
250 parser.add_argument('--asan', | 255 common_group.add_argument('--mode', '-m', |
| 256 type=str, |
| 257 help='Build variants (comma-separated).', |
| 258 metavar='[all,debug,release,product]', |
| 259 default='debug') |
| 260 common_group.add_argument('--os', |
| 261 type=str, |
| 262 help='Target OSs (comma-separated).', |
| 263 metavar='[all,host,android]', |
| 264 default='host') |
| 265 common_group.add_argument("-v", "--verbose", |
| 266 help='Verbose output.', |
| 267 default=False, action="store_true") |
| 268 |
| 269 other_group.add_argument('--asan', |
251 help='Build with ASAN', | 270 help='Build with ASAN', |
252 default=use_asan(), | 271 default=use_asan(), |
253 action='store_true') | 272 action='store_true') |
254 parser.add_argument('--no-asan', | 273 other_group.add_argument('--no-asan', |
255 help='Disable ASAN', | 274 help='Disable ASAN', |
256 dest='asan', | 275 dest='asan', |
257 action='store_false') | 276 action='store_false') |
258 parser.add_argument('--wheezy', | 277 other_group.add_argument('--clang', |
| 278 help='Use Clang', |
| 279 default=True, |
| 280 action='store_true') |
| 281 other_group.add_argument('--no-clang', |
| 282 help='Disable Clang', |
| 283 dest='clang', |
| 284 action='store_false') |
| 285 other_group.add_argument('--goma', |
| 286 help='Use goma', |
| 287 default=True, |
| 288 action='store_true') |
| 289 other_group.add_argument('--no-goma', |
| 290 help='Disable goma', |
| 291 dest='goma', |
| 292 action='store_false') |
| 293 other_group.add_argument('--ide', |
| 294 help='Generate an IDE file.', |
| 295 default=os_has_ide(HOST_OS), |
| 296 action='store_true') |
| 297 other_group.add_argument('--msan', |
| 298 help='Build with MSAN', |
| 299 default=use_msan(), |
| 300 action='store_true') |
| 301 other_group.add_argument('--no-msan', |
| 302 help='Disable MSAN', |
| 303 dest='msan', |
| 304 action='store_false') |
| 305 other_group.add_argument('--target-sysroot', '-s', |
| 306 type=str, |
| 307 help='Path to the toolchain sysroot') |
| 308 other_group.add_argument('--toolchain-prefix', '-t', |
| 309 type=str, |
| 310 help='Path to the toolchain prefix') |
| 311 other_group.add_argument('--tsan', |
| 312 help='Build with TSAN', |
| 313 default=use_tsan(), |
| 314 action='store_true') |
| 315 other_group.add_argument('--no-tsan', |
| 316 help='Disable TSAN', |
| 317 dest='tsan', |
| 318 action='store_false') |
| 319 other_group.add_argument('--wheezy', |
259 help='Use the Debian wheezy sysroot on Linux', | 320 help='Use the Debian wheezy sysroot on Linux', |
260 default=use_wheezy(), | 321 default=use_wheezy(), |
261 action='store_true') | 322 action='store_true') |
262 parser.add_argument('--no-wheezy', | 323 other_group.add_argument('--no-wheezy', |
263 help='Disable the Debian wheezy sysroot on Linux', | 324 help='Disable the Debian wheezy sysroot on Linux', |
264 dest='wheezy', | 325 dest='wheezy', |
265 action='store_false') | 326 action='store_false') |
266 parser.add_argument('--goma', | 327 other_group.add_argument('--workers', '-w', |
267 help='Use goma', | |
268 default=True, | |
269 action='store_true') | |
270 parser.add_argument('--no-goma', | |
271 help='Disable goma', | |
272 dest='goma', | |
273 action='store_false') | |
274 parser.add_argument('--clang', | |
275 help='Use Clang', | |
276 default=True, | |
277 action='store_true') | |
278 parser.add_argument('--no-clang', | |
279 help='Disable Clang', | |
280 dest='clang', | |
281 action='store_false') | |
282 parser.add_argument('--ide', | |
283 help='Generate an IDE file.', | |
284 default=os_has_ide(HOST_OS), | |
285 action='store_true') | |
286 parser.add_argument('--target-sysroot', '-s', | |
287 type=str, | |
288 help='Path to the toolchain sysroot') | |
289 parser.add_argument('--toolchain-prefix', '-t', | |
290 type=str, | |
291 help='Path to the toolchain prefix') | |
292 parser.add_argument('--workers', '-w', | |
293 type=int, | 328 type=int, |
294 help='Number of simultaneous GN invocations', | 329 help='Number of simultaneous GN invocations', |
295 dest='workers', | 330 dest='workers', |
296 default=multiprocessing.cpu_count()) | 331 default=multiprocessing.cpu_count()) |
297 | 332 |
298 options = parser.parse_args(args) | 333 options = parser.parse_args(args) |
299 if not process_options(options): | 334 if not process_options(options): |
300 parser.print_help() | 335 parser.print_help() |
301 return None | 336 return None |
302 return options | 337 return options |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 return 1 | 388 return 1 |
354 | 389 |
355 endtime = time.time() | 390 endtime = time.time() |
356 if args.verbose: | 391 if args.verbose: |
357 print ("GN Time: %.3f seconds" % (endtime - starttime)) | 392 print ("GN Time: %.3f seconds" % (endtime - starttime)) |
358 return 0 | 393 return 0 |
359 | 394 |
360 | 395 |
361 if __name__ == '__main__': | 396 if __name__ == '__main__': |
362 sys.exit(main(sys.argv)) | 397 sys.exit(main(sys.argv)) |
OLD | NEW |