Added `TemplateVariableInfo` to `rust_toolchain`. (#1416)
diff --git a/rust/toolchain.bzl b/rust/toolchain.bzl
index b7a72ef..9a05459 100644
--- a/rust/toolchain.bzl
+++ b/rust/toolchain.bzl
@@ -483,6 +483,8 @@
"RUSTFMT": sysroot.rustfmt.path,
})
+ make_variable_info = platform_common.TemplateVariableInfo(make_variables)
+
toolchain = platform_common.ToolchainInfo(
all_files = sysroot.all_files,
binary_ext = ctx.attr.binary_ext,
@@ -497,7 +499,7 @@
libstd_and_allocator_ccinfo = _make_libstd_and_allocator_ccinfo(ctx, rust_std, ctx.attr.allocator_library),
llvm_cov = ctx.file.llvm_cov,
llvm_profdata = ctx.file.llvm_profdata,
- make_variables = platform_common.TemplateVariableInfo(make_variables),
+ make_variables = make_variable_info,
os = ctx.attr.os,
rust_doc = sysroot.rustdoc,
rust_lib = sysroot.rust_std, # `rust_lib` is deprecated and only exists for legacy support.
@@ -520,7 +522,10 @@
_rename_first_party_crates = rename_first_party_crates,
_third_party_dir = third_party_dir,
)
- return [toolchain]
+ return [
+ toolchain,
+ make_variable_info,
+ ]
rust_toolchain = rule(
implementation = _rust_toolchain_impl,
diff --git a/test/unit/toolchain_make_variables/main.rs b/test/unit/toolchain_make_variables/main.rs
index da0f5d9..997d772 100644
--- a/test/unit/toolchain_make_variables/main.rs
+++ b/test/unit/toolchain_make_variables/main.rs
@@ -1 +1,8 @@
-pub fn main() {}
+use std::env;
+use std::fs;
+
+pub fn main() {
+ let argv1 = env::args().nth(1).expect("Missing output argument");
+
+ fs::write(argv1, "").unwrap();
+}
diff --git a/test/unit/toolchain_make_variables/test.rs b/test/unit/toolchain_make_variables/test.rs
new file mode 100644
index 0000000..f328e4d
--- /dev/null
+++ b/test/unit/toolchain_make_variables/test.rs
@@ -0,0 +1 @@
+fn main() {}
diff --git a/test/unit/toolchain_make_variables/toolchain_make_variables_test.bzl b/test/unit/toolchain_make_variables/toolchain_make_variables_test.bzl
index 686d4cf..b20e79e 100644
--- a/test/unit/toolchain_make_variables/toolchain_make_variables_test.bzl
+++ b/test/unit/toolchain_make_variables/toolchain_make_variables_test.bzl
@@ -13,7 +13,7 @@
"ENV_VAR_RUST_SYSROOT": "$(RUST_SYSROOT)",
}
-def _rustc_env_variable_expansion_test_impl(ctx):
+def _rust_toolchain_make_variable_expansion_test_common_impl(ctx, mnemonic):
env = analysistest.begin(ctx)
target = analysistest.target_under_test(env)
action = target.actions[0]
@@ -21,7 +21,7 @@
assert_action_mnemonic(
env = env,
action = action,
- mnemonic = "Rustc",
+ mnemonic = mnemonic,
)
toolchain = ctx.attr._current_rust_toolchain[platform_common.ToolchainInfo]
@@ -45,12 +45,105 @@
return analysistest.end(env)
-rustc_env_variable_expansion_test = analysistest.make(
+def make_toolchain_make_variable_test(impl):
+ return analysistest.make(
+ impl = impl,
+ attrs = {
+ "_current_rust_toolchain": attr.label(
+ doc = "The currently registered rust toolchain",
+ default = Label("//rust/toolchain:current_rust_toolchain"),
+ ),
+ },
+ )
+
+def _rustc_env_variable_expansion_test_impl(ctx):
+ return _rust_toolchain_make_variable_expansion_test_common_impl(ctx, "Rustc")
+
+rustc_env_variable_expansion_test = make_toolchain_make_variable_test(
impl = _rustc_env_variable_expansion_test_impl,
+)
+
+def _rust_toolchain_make_variable_expansion_test(ctx):
+ return _rust_toolchain_make_variable_expansion_test_common_impl(ctx, "RustToolchainConsumer")
+
+rust_toolchain_make_variable_expansion_test = make_toolchain_make_variable_test(
+ impl = _rust_toolchain_make_variable_expansion_test,
+)
+
+def _current_rust_toolchain_make_variable_expansion_test_impl(ctx):
+ return _rust_toolchain_make_variable_expansion_test_common_impl(ctx, "CurrentRustToolchainConsumer")
+
+current_rust_toolchain_make_variable_expansion_test = make_toolchain_make_variable_test(
+ impl = _current_rust_toolchain_make_variable_expansion_test_impl,
+)
+
+def _rust_toolchain_consumer_common_impl(ctx, mnemonic):
+ output = ctx.actions.declare_file(ctx.label.name)
+
+ args = ctx.actions.args()
+ args.add(output)
+
+ # Expand make variables
+ env = {
+ key: ctx.expand_make_variables(
+ key,
+ val,
+ {},
+ )
+ for key, val in ctx.attr.env.items()
+ }
+
+ ctx.actions.run(
+ outputs = [output],
+ executable = ctx.executable.writer,
+ mnemonic = mnemonic,
+ env = env,
+ arguments = [args],
+ )
+
+ return DefaultInfo(
+ files = depset([output]),
+ )
+
+def _rust_toolchain_consumer_impl(ctx):
+ return _rust_toolchain_consumer_common_impl(ctx, "RustToolchainConsumer")
+
+rust_toolchain_consumer = rule(
+ implementation = _rust_toolchain_consumer_impl,
+ doc = "A helper rule to test make variable expansion of rules that depend on `rust_toolchain`.",
attrs = {
- "_current_rust_toolchain": attr.label(
- doc = "The currently registered rust toolchain",
- default = Label("//rust/toolchain:current_rust_toolchain"),
+ "env": attr.string_dict(
+ doc = "Environment variables used for expansion",
+ mandatory = True,
+ ),
+ "writer": attr.label(
+ doc = "An executable for creating an action output",
+ cfg = "exec",
+ executable = True,
+ mandatory = True,
+ ),
+ },
+ toolchains = [
+ "@rules_rust//rust:toolchain",
+ ],
+)
+
+def _current_rust_toolchain_consumer_impl(ctx):
+ return _rust_toolchain_consumer_common_impl(ctx, "CurrentRustToolchainConsumer")
+
+current_rust_toolchain_consumer = rule(
+ implementation = _current_rust_toolchain_consumer_impl,
+ doc = "A helper rule to test make variable expansion of `current_rust_toolchain`.",
+ attrs = {
+ "env": attr.string_dict(
+ doc = "Environment variables used for expansion",
+ mandatory = True,
+ ),
+ "writer": attr.label(
+ doc = "An executable for creating an action output",
+ cfg = "exec",
+ executable = True,
+ mandatory = True,
),
},
)
@@ -59,7 +152,6 @@
rust_library(
name = "library",
srcs = ["main.rs"],
- toolchains = ["//rust/toolchain:current_rust_toolchain"],
rustc_env = _ENV,
edition = "2018",
)
@@ -67,15 +159,13 @@
rust_binary(
name = "binary",
srcs = ["main.rs"],
- toolchains = ["//rust/toolchain:current_rust_toolchain"],
rustc_env = _ENV,
edition = "2018",
)
rust_test(
name = "integration_test",
- srcs = ["main.rs"],
- toolchains = ["//rust/toolchain:current_rust_toolchain"],
+ srcs = ["test.rs"],
rustc_env = _ENV,
edition = "2018",
)
@@ -83,10 +173,22 @@
rust_test(
name = "unit_test",
crate = "library",
- toolchains = ["//rust/toolchain:current_rust_toolchain"],
rustc_env = _ENV,
)
+ rust_toolchain_consumer(
+ name = "rust_toolchain_consumer",
+ env = _ENV,
+ writer = ":binary",
+ )
+
+ current_rust_toolchain_consumer(
+ name = "current_rust_toolchain_consumer",
+ env = _ENV,
+ toolchains = ["//rust/toolchain:current_rust_toolchain"],
+ writer = ":binary",
+ )
+
def toolchain_make_variable_test_suite(name):
"""Defines a test suite
@@ -115,6 +217,16 @@
target_under_test = ":unit_test",
)
+ rust_toolchain_make_variable_expansion_test(
+ name = "rust_toolchain_make_variable_expansion_test",
+ target_under_test = ":rust_toolchain_consumer",
+ )
+
+ current_rust_toolchain_make_variable_expansion_test(
+ name = "current_rust_toolchain_make_variable_expansion_test",
+ target_under_test = ":current_rust_toolchain_consumer",
+ )
+
native.test_suite(
name = name,
tests = [
@@ -122,5 +234,7 @@
":rustc_env_variable_expansion_binary_test",
":rustc_env_variable_expansion_integration_test_test",
":rustc_env_variable_expansion_unit_test_test",
+ ":rust_toolchain_make_variable_expansion_test",
+ ":current_rust_toolchain_make_variable_expansion_test",
],
)