def _rsc(self): return Rsc.global_instance()
def _runtool_hermetic(self, main, tool_name, distribution, input_digest, ctx): use_youtline = tool_name == "scalac-outliner" tool_classpath_abs = self._scalac_classpath if use_youtline else self._rsc_classpath tool_classpath = fast_relpath_collection(tool_classpath_abs) rsc_jvm_options = Rsc.global_instance().get_options().jvm_options if not use_youtline and self._rsc.use_native_image: if rsc_jvm_options: raise ValueError( "`{}` got non-empty jvm_options when running with a graal native-image, but this is " "unsupported. jvm_options received: {}".format( self.options_scope, safe_shlex_join(rsc_jvm_options))) native_image_path, native_image_snapshot = self._rsc.native_image( self.context) additional_snapshots = [native_image_snapshot] initial_args = [native_image_path] else: additional_snapshots = [] initial_args = ( [distribution.java] + rsc_jvm_options + ["-cp", os.pathsep.join(tool_classpath), main]) (argfile_snapshot, ) = self.context._scheduler.capture_snapshots([ PathGlobsAndRoot( PathGlobs([fast_relpath(ctx.args_file, get_buildroot())]), get_buildroot(), ), ]) cmd = initial_args + [f"@{argfile_snapshot.files[0]}"] pathglobs = list(tool_classpath) if pathglobs: root = PathGlobsAndRoot(PathGlobs(tuple(pathglobs)), get_buildroot()) # dont capture snapshot, if pathglobs is empty path_globs_input_digest = self.context._scheduler.capture_snapshots( (root, ))[0].digest epr_input_files = self.context._scheduler.merge_directories( ((path_globs_input_digest, ) if path_globs_input_digest else ()) + ((input_digest, ) if input_digest else ()) + tuple(s.digest for s in additional_snapshots) + (argfile_snapshot.digest, )) epr = Process( argv=tuple(cmd), input_digest=epr_input_files, output_files=(fast_relpath(ctx.rsc_jar_file.path, get_buildroot()), ), output_directories=tuple(), timeout_seconds=15 * 60, description=f"run {tool_name} for {ctx.target}", # TODO: These should always be unicodes # Since this is always hermetic, we need to use `underlying.home` because # Process requires an existing, local jdk location. jdk_home=distribution.underlying_home, is_nailgunnable=True, ) res = self.context.execute_process_synchronously_without_raising( epr, self.name(), [WorkUnitLabel.COMPILER]) if res.exit_code != 0: raise TaskError(res.stderr, exit_code=res.exit_code) # TODO: parse the output of -Xprint:timings for rsc and write it to self._record_target_stats()! res.output_digest.dump(ctx.rsc_jar_file.path) self.context._scheduler.materialize_directory( DirectoryToMaterialize(res.output_digest), ) ctx.rsc_jar_file.hydrate_missing_directory_digest(res.output_digest) return res