Skip to content

Commit

Permalink
Depend on a copy of rustfmt for the target (#2685)
Browse files Browse the repository at this point in the history
The toolchain_files() and current_rust_toolchain() rules return files
for the current 'exec' platform. This is perfecly reasonable if you want
to use these tools as part of ctx.actions.run(). But if you want to use
these as part of 'data = []' (runfiles), they must be built for the
target.

Fixes: #2684
  • Loading branch information
EdSchouten authored Jun 7, 2024
1 parent 33f93ac commit 837b7f8
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 14 deletions.
31 changes: 30 additions & 1 deletion rust/private/toolchain_utils.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def _toolchain_files_impl(ctx):
)]

toolchain_files = rule(
doc = "A rule for fetching files from a rust toolchain.",
doc = "A rule for fetching files from a rust toolchain for the exec platform.",
implementation = _toolchain_files_impl,
attrs = {
"tool": attr.string(
Expand Down Expand Up @@ -95,3 +95,32 @@ current_rust_toolchain = rule(
str(Label("@rules_rust//rust:toolchain_type")),
],
)

def _transition_to_target_impl(settings, _attr):
return {
# String conversion is needed to prevent a crash with Bazel 6.x.
"//command_line_option:extra_execution_platforms": [
str(platform)
for platform in settings["//command_line_option:platforms"]
],
}

_transition_to_target = transition(
implementation = _transition_to_target_impl,
inputs = ["//command_line_option:platforms"],
outputs = ["//command_line_option:extra_execution_platforms"],
)

def _toolchain_files_for_target_impl(ctx):
return [ctx.attr.toolchain_files[0][DefaultInfo]]

toolchain_files_for_target = rule(
doc = "A rule for fetching files from a rust toolchain for the target platform.",
implementation = _toolchain_files_for_target_impl,
attrs = {
"toolchain_files": attr.label(cfg = _transition_to_target, mandatory = True),
"_allowlist_function_transition": attr.label(
default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
),
},
)
8 changes: 7 additions & 1 deletion rust/toolchain/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
load("//rust/private:rustfmt.bzl", "current_rustfmt_toolchain")
load("//rust/private:toolchain_utils.bzl", "current_rust_toolchain", "toolchain_files")
load("//rust/private:toolchain_utils.bzl", "current_rust_toolchain", "toolchain_files", "toolchain_files_for_target")

package(default_visibility = ["//visibility:public"])

Expand Down Expand Up @@ -41,6 +41,12 @@ current_rustfmt_toolchain(
name = "current_rustfmt_toolchain",
)

toolchain_files_for_target(
name = "current_rustfmt_toolchain_for_target",
toolchain_files = ":current_rustfmt_toolchain",
visibility = ["//:__subpackages__"],
)

alias(
name = "current_rustfmt_files",
actual = "current_rustfmt_toolchain",
Expand Down
18 changes: 6 additions & 12 deletions tools/rustfmt/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ rust_library(
),
data = [
"//:rustfmt.toml",
"//rust/toolchain:current_rustfmt_toolchain",
"//rust/toolchain:current_rustfmt_toolchain_for_target",
],
edition = "2018",
rustc_env = {
"RUSTFMT": "$(rlocationpath //rust/toolchain:current_rustfmt_toolchain)",
"RUSTFMT": "$(rlocationpath //rust/toolchain:current_rustfmt_toolchain_for_target)",
"RUSTFMT_CONFIG": "$(rlocationpath //:rustfmt.toml)",
},
deps = [
Expand Down Expand Up @@ -55,10 +55,7 @@ rust_binary(
"ASPECT_REPOSITORY": aspect_repository(),
"RUST_DEFAULT_EDITION": "$(RUST_DEFAULT_EDITION)",
},
toolchains = [
"@rules_rust//rust/toolchain:current_rust_toolchain",
"@rules_rust//rust/toolchain:current_rustfmt_toolchain",
],
toolchains = ["@rules_rust//rust/toolchain:current_rust_toolchain"],
visibility = ["//visibility:public"],
deps = [
":rustfmt_lib",
Expand Down Expand Up @@ -94,15 +91,12 @@ rust_binary(
srcs = [
"src/upstream_rustfmt_wrapper.rs",
],
data = ["//rust/toolchain:current_rustfmt_toolchain"],
data = ["//rust/toolchain:current_rustfmt_toolchain_for_target"],
edition = "2018",
rustc_env = {
"RUSTFMT": "$(rlocationpath //rust/toolchain:current_rustfmt_toolchain)",
"RUSTFMT": "$(rlocationpath //rust/toolchain:current_rustfmt_toolchain_for_target)",
},
toolchains = [
"@rules_rust//rust/toolchain:current_rust_toolchain",
"@rules_rust//rust/toolchain:current_rustfmt_toolchain",
],
toolchains = ["@rules_rust//rust/toolchain:current_rust_toolchain"],
visibility = ["//visibility:public"],
deps = [
"//tools/runfiles",
Expand Down

0 comments on commit 837b7f8

Please sign in to comment.