Allow rust_binary targets to create a hermetic launcher. BUG=b:291840720 TEST=portage/tools/run_tests.sh Cq-Depend: 5626214 Change-Id: I14a3022a03d9862fdf9519fdde192f5ae3b94bcb
diff --git a/rust/private/rust.bzl b/rust/private/rust.bzl index afe1f12..c842e18 100644 --- a/rust/private/rust.bzl +++ b/rust/private/rust.bzl
@@ -14,6 +14,7 @@ """Rust rule implementations""" +load("@@//bazel/module_extensions/toolchains/hermetic_launcher:hermetic_launcher.bzl", "HERMETIC_ATTRS") load("@bazel_skylib//lib:paths.bzl", "paths") load("//rust/private:common.bzl", "COMMON_PROVIDERS", "rust_common") load("//rust/private:providers.bzl", "BuildInfo") @@ -1061,7 +1062,7 @@ rust_binary = rule( implementation = _rust_binary_impl, provides = COMMON_PROVIDERS, - attrs = dict(_common_attrs.items() + _rust_binary_attrs.items() + { + attrs = dict(_common_attrs.items() + _rust_binary_attrs.items() + HERMETIC_ATTRS.items() + { "platform": attr.label( doc = "Optional platform to transition the binary to.", default = None, @@ -1069,6 +1070,7 @@ "_allowlist_function_transition": attr.label( default = "@bazel_tools//tools/allowlists/function_transition_allowlist", ), + "use_hermetic_launcher": attr.label(default = "@@//bazel/module_extensions/toolchains/rust:use_hermetic_launcher"), }.items()), executable = True, fragments = ["cpp"],
diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl index 98806f1..b025668 100644 --- a/rust/private/rustc.bzl +++ b/rust/private/rustc.bzl
@@ -14,6 +14,7 @@ """Functionality for constructing actions that invoke the Rust compiler""" +load("@@//bazel/module_extensions/toolchains/hermetic_launcher:hermetic_launcher.bzl", "hermetic_defaultinfo") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load( "@bazel_tools//tools/build_defs/cc:action_names.bzl", @@ -1143,6 +1144,18 @@ - (DepInfo): The transitive dependencies of this crate. - (DefaultInfo): The output file for this crate, and its runfiles. """ + use_hermetic_launcher = hasattr(ctx.attr, "use_hermetic_launcher") and \ + ctx.attr.use_hermetic_launcher[BuildSettingInfo].value and \ + crate_info_dict and \ + "output" in crate_info_dict + + if use_hermetic_launcher: + hermetic_wrapper = crate_info_dict["output"] + crate_info_dict["output"] = ctx.actions.declare_file( + "_%s_real" % hermetic_wrapper.basename, + sibling = hermetic_wrapper, + ) + crate_info = rust_common.create_crate_info(**crate_info_dict) build_metadata = crate_info_dict.get("metadata", None) @@ -1469,14 +1482,24 @@ "metadata_files": coverage_runfiles + [executable] if executable else [], }) - providers = [ - DefaultInfo( + if use_hermetic_launcher: + default_info = hermetic_defaultinfo( + ctx, # nb. This field is required for cc_library to depend on our output. files = depset(outputs), runfiles = runfiles, executable = executable, - ), - ] + out = hermetic_wrapper, + ) + else: + default_info = DefaultInfo( + # nb. This field is required for cc_library to depend on our output. + files = depset(outputs), + runfiles = runfiles, + executable = executable, + ) + + providers = [default_info] # When invoked by aspects (and when running `bazel coverage`), the # baseline_coverage.dat created here will conflict with the baseline_coverage.dat of the