23 subprocess.check_output(command, stderr=subprocess.STDOUT)
25 except subprocess.CalledProcessError
as e:
26 print(e.output.decode(
"utf-8"))
27 if strategy ==
'remote':
28 joined =
' '.join(command)
29 print(f
'''Failed to run command remotely: {joined}
31If you're seeing this error on a bot and it doesn't happen locally, then you may
32need to teach the script build/rbe/rewrapper_dart.py what the appropriate input
33and outputs files of the command are. You can see the list of used inputs and
34outputs in the rewrapper invocation above. To reproduce this error locally, try
35forcing a remote build by setting the RBE_exec_strategy=remote environment
46 path = os.path.join(exec_root,
'.dart_tool',
'package_config.json')
47 with open(path,
'r')
as file:
48 return json.load(file)
52def resolve_uri(uri, exec_root, package_config, whole_dir=False):
53 if uri.startswith(
'package:'):
54 match = re.search(
r'package:([^/]*)/(.*)', uri)
55 package_name = match.groups()[0]
56 relative = match.groups()[1]
57 package_data =
next(pkg
for pkg
in package_config[
'packages']
58 if pkg[
'name'] == package_name)
59 package_root = package_data[
'rootUri']
60 package_root = package_root[3:]
61 package_uri = package_data[
'packageUri']
63 uri = package_root +
'/' + package_uri
65 uri = package_root +
'/' + package_uri + relative
73 if uri.startswith(
'dart:'):
75 path = os.path.join(exec_root,
resolve_uri(uri, exec_root, package_config))
76 file = open(path,
'r')
78 for line
in file.readlines():
79 tokens = [token
for token
in re.split(
r'\s+', line)
if token !=
'']
80 if not tokens
or tokens[0]
in [
81 '//',
'///',
'/*',
'*/',
'#!',
'library',
'show'
85 if tokens[0]
in [
'const',
'class',
'enum']:
88 )
and tokens[0] ==
'if' and tokens[1] ==
'(dart.library.io)':
89 tokens = [
'import'] + tokens[2:]
90 if tokens[0]
not in [
'import',
'export',
'part']:
93 raise Exception(f
'Bad import statement: {path}: {line}')
94 if tokens[0] ==
'part' and tokens[1] ==
'of':
96 token = tokens[1].replace(
'"',
'').replace(
"'",
'').replace(
';',
'')
97 if token.startswith(
'dart:'):
100 dirname = os.path.dirname(uri)
101 while token.startswith(
'..'):
103 dirname = os.path.dirname(dirname)
104 token = dirname +
'/' + token
114 unexplored = set(uris)
116 uri = unexplored.pop()
119 if not uri
in inputs:
129 arg = arg.replace(
'file:///' + exec_root,
'../../')
130 arg = arg.replace(
'file://' + exec_root,
'../../')
132 arg = arg.replace(exec_root,
'../../')
135 if arg.endswith(f
'../../{working_directory}/'):
136 arg = arg.replace(f
'../../{working_directory}/',
'.')
138 arg = arg.replace(f
'../../{working_directory}/',
'')
194 for option
in options:
199 elif option.startswith(
'--')
and arg.startswith(f
'{option}='):
200 self.
optarg = arg[len(f
'{option}='):]
202 elif option[0] ==
'-' and option[1] !=
'-' and arg.startswith(
204 self.
optarg = arg[len(option):]
209 raise Exception(f
'''Unsupported operand in state {state}: {arg}
211You need to recognize the argument/option in the build/rbe/rewrapper_dart.py
212script in order to execute this command remotely on RBE. Read the big comments
213in the file explaining what this script is and how it works. Follow this stack
214trace to find the place to insert the appropriate support.
218 if path.startswith(
'package:'):
221 if path.startswith(
'org-dartlang-kernel-service:///'):
223 path[len(
'org-dartlang-kernel-service:///'):])
224 if path.startswith(
'org-dartlang-kernel-service://'):
226 path[len(
'org-dartlang-kernel-service://'):])
228 if path.startswith(
'file:////'):
229 path = path[len(
'file:///'):]
230 elif path.startswith(
'file://'):
231 path = path[len(
'file://'):]
232 path = os.path.abspath(path)
234 raise Exception(f
"Path isn't inside exec_root: {path}")
240 if arg ==
'rewrapper' or arg.endswith(
'/rewrapper'):
249 with open(self.
optarg,
'r')
as fp:
250 for line
in fp.readlines():
251 key, value = fp.split(
'=')
252 if key ==
'exec_root':
254 elif key ==
'exec_strategy':
264 env_exec_strategy = os.environ.get(
'RBE_exec_strategy')
267 elif arg.startswith(
'-'):
269 elif arg.endswith(
'/dart'):
272 elif arg.endswith(
'/gen_snapshot')
or arg.endswith(
273 '/gen_snapshot_product'):
290 '--packages',
'-D',
'--snapshot-kind',
291 '--depfile_output_filename'
294 elif arg
in [
'--deterministic',
'--sound-null-safety']:
296 elif arg ==
'compile':
300 'snapshots/dartdev.dart.snapshot')))
304 elif arg ==
'../../pkg/compiler/lib/src/dart2js.dart':
307 elif arg ==
'gen/utils/compiler/dart2js.dart.dill':
310 elif arg ==
'../../pkg/dev_compiler/bin/dartdevc.dart':
313 elif arg ==
'gen/utils/ddc/dartdevc.dart.dill':
316 elif arg ==
'gen/utils/dartanalyzer/dartanalyzer.dart.dill':
319 elif arg ==
'gen/utils/analysis_server/analysis_server.dart.dill':
322 elif arg ==
'../../pkg/front_end/tool/_fasta/compile_platform.dart':
325 elif arg ==
'../../utils/compiler/create_snapshot_entry.dart':
331 elif arg ==
'../../utils/bazel/kernel_worker.dart':
334 elif arg ==
'../../pkg/vm/bin/gen_kernel.dart':
337 elif arg ==
'gen/utils/kernel-service/frontend_server.dart.dill':
340 elif arg ==
'gen/utils/dtd/generate_dtd_snapshot.dart.dill':
343 elif arg ==
'gen/utils/dds/generate_dds_snapshot.dart.dill':
346 elif arg ==
'gen/utils/bazel/kernel_worker.dart.dill':
349 elif arg ==
'gen/utils/dartdev/generate_dartdev_snapshot.dart.dill':
352 elif arg ==
'gen/utils/gen_kernel/bootstrap_gen_kernel.dill':
355 elif arg ==
'gen/utils/kernel-service/kernel-service_snapshot.dart.dill':
360 'vm_platform_strong.dill')))
372 'snapshots/dart2js.dart.snapshot')))
384 elif self.
get_option([
'--platform-binaries']):
387 os.path.join(self.
optarg,
'dart2js_platform.dill')))
389 '--invoker',
'--packages',
'--libraries-spec',
390 '--snapshot-kind',
'--depfile_output_filename'
401 elif not arg.startswith(
'-'):
418 '--multi-root-scheme',
'--multi-root-output-path',
423 '--canary',
'--no-summarize',
'--sound-null-safety',
424 '--no-sound-null-safety'
427 elif not arg.startswith(
'-'):
428 if arg.endswith(
'.dart'):
438 if arg
in [
'--help']:
451 self.
rebase(os.path.join(self.
optarg,
'compiler_api.dart')))
455 os.path.join(self.
optarg,
'src/io/mapped_file.dart')))
460 compile_platform_args = []
461 single_root_scheme =
None
462 single_root_base =
None
466 single_root_scheme = self.
optarg
468 single_root_base = self.
optarg
470 if 1 < len(single_root_base)
and single_root_base[-1] ==
'/':
471 single_root_base = single_root_base[:-1]
482 elif not arg.startswith(
'-'):
483 if len(compile_platform_args) == 0:
485 elif len(compile_platform_args) == 1:
487 if sdk.startswith(f
'{single_root_scheme}:///'):
488 sdk = sdk[len(f
'{single_root_scheme}:///'):]
489 sdk = os.path.join(single_root_base, sdk)
490 if sdk.endswith(
'libraries.json'):
491 sdk = os.path.dirname(sdk)
493 elif len(compile_platform_args) == 2:
495 elif len(compile_platform_args) == 3:
498 elif len(compile_platform_args) == 4:
501 if arg != compile_platform_args[2]:
505 compile_platform_args.append(arg)
514 elif arg
in [
'--no-git-hash']:
529 [
'--packages-file',
'--target',
'--dart-sdk-summary']):
533 '--sound-null-safety',
534 '--no-sound-null-safety',
548 '--packages',
'-D',
'--filesystem-root',
549 '--filesystem-scheme'
552 elif arg
in [
'--no-aot',
'--no-embed-sources']:
554 elif not arg.startswith(
'-'):
571 '--no-embed-sources',
572 '--no-link-platform',
578 elif not arg.startswith(
'-'):
598 elif arg
in [
'--train']:
600 elif not arg.startswith(
'-'):
608 if arg
in [
'--train']:
616 if arg
in [
'--help']:
624 if arg
in [
'--help']:
637 '--sound-null-safety',
'--no-sound-null-safety',
647 if arg
in [
'--help']:
658 '--vm_snapshot_data',
659 '--vm_snapshot_instructions',
660 '--isolate_snapshot_data',
661 '--isolate_snapshot_instructions',
665 elif self.
get_option([
'--snapshot_kind',
'--snapshot-kind']):
668 '--sound-null-safety',
673 elif not arg.startswith(
'-'):
684 for i
in range(len(argv)):
685 if argv[i] ==
'--' and rewrapper_end == 0:
686 rewrapper_end = i + 1
687 if not '/' in argv[i + 1]:
688 argv[i + 1] =
'./' + argv[i + 1]
693 if rewrapper.exec_root ==
None:
694 raise Exception(
'No rewrapper --exec_root was specified')
696 if not rewrapper.outputs:
697 raise Exception(
'No output files were recognized')
700 if rewrapper.no_remote:
706 if not rewrapper.depfiles:
707 rewrapper.depfiles = [output +
'.d' for output
in rewrapper.outputs]
708 output_files = rewrapper.outputs + rewrapper.depfiles
709 inputs =
find_inputs(rewrapper.entry_points, rewrapper.exec_root,
712 resolve_uri(uri, rewrapper.exec_root, package_config, whole_dir=
True)
714 paths.add(os.path.join(
'.dart_tool',
'package_config.json'))
715 for path
in rewrapper.extra_paths:
718 working_directory = rewrapper.rebase(
'.')
719 if not any([path.startswith(working_directory)
for path
in paths]):
720 paths.add(rewrapper.rebase(
'build.ninja.stamp'))
726 command.append(
'--labels=type=tool')
727 command.append(
'--inputs=' +
','.join(paths))
728 command.append(
'--output_files=' +
','.join(output_files))
734 command += argv[2:rewrapper_end] + [
736 for arg
in argv[rewrapper_end:]
744 for depfile
in rewrapper.depfiles:
747 with open(os.path.join(rewrapper.exec_root, depfile),
'r')
as file:
748 lines = file.readlines()
750 line.replace(
'/b/f/w', rewrapper.exec_root)
for line
in lines
752 with open(os.path.join(rewrapper.exec_root, depfile),
'w')
as file:
753 file.writelines(lines)
754 except FileNotFoundError:
760if __name__ ==
'__main__':
761 sys.exit(
main(sys.argv))
static float next(float f)
parse_bootstrap_gen_kernel(self)
parse_frontend_server(self)
parse_create_snapshot_entry(self)
get_option(self, options)
parse_compile_platform(self)
parse_generate_dtd_snapshot(self)
parse_generate_dartdev_snapshot(self)
parse_kernel_service_snapshot(self)
parse_analysis_server(self)
parse_kernel_worker(self)
unsupported(self, state, arg)
parse_generate_dds_snapshot(self)
static void append(char **dst, size_t *count, const char *src, size_t n)
load_package_config(exec_root)
list_imports(uri, exec_root, package_config)
run_command(command, strategy)
resolve_uri(uri, exec_root, package_config, whole_dir=False)
rewrite_absolute(arg, exec_root, working_directory)
find_inputs(uris, exec_root, package_config)