From 52fc70145a75ee047e04c86139ac32b3f58a23a3 Mon Sep 17 00:00:00 2001 From: UebelAndre Date: Mon, 27 Jun 2022 06:35:20 -0700 Subject: [PATCH] Added `TemplateVariableInfo` to `rust_toolchain`. (#1416) --- rust/toolchain.bzl | 9 +- test/unit/toolchain_make_variables/main.rs | 9 +- test/unit/toolchain_make_variables/test.rs | 1 + .../toolchain_make_variables_test.bzl | 136 ++++++++++++++++-- 4 files changed, 141 insertions(+), 14 deletions(-) create mode 100644 test/unit/toolchain_make_variables/test.rs diff --git a/rust/toolchain.bzl b/rust/toolchain.bzl index b7a72efff7..9a054592c2 100644 --- a/rust/toolchain.bzl +++ b/rust/toolchain.bzl @@ -483,6 +483,8 @@ def _rust_toolchain_impl(ctx): "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 @@ def _rust_toolchain_impl(ctx): 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 @@ def _rust_toolchain_impl(ctx): _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 da0f5d925d..997d772d20 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 0000000000..f328e4d9d0 --- /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 686d4cfe58..b20e79e441 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 = { "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 @@ def _rustc_env_variable_expansion_test_impl(ctx): assert_action_mnemonic( env = env, action = action, - mnemonic = "Rustc", + mnemonic = mnemonic, ) toolchain = ctx.attr._current_rust_toolchain[platform_common.ToolchainInfo] @@ -45,12 +45,105 @@ def _rustc_env_variable_expansion_test_impl(ctx): 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 = { + "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 = { - "_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, ), }, ) @@ -59,7 +152,6 @@ def _define_targets(): rust_library( name = "library", srcs = ["main.rs"], - toolchains = ["//rust/toolchain:current_rust_toolchain"], rustc_env = _ENV, edition = "2018", ) @@ -67,15 +159,13 @@ def _define_targets(): 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 @@ def _define_targets(): 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 @@ def toolchain_make_variable_test_suite(name): 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 @@ def toolchain_make_variable_test_suite(name): ":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", ], )