Skip to content

Commit

Permalink
Added TemplateVariableInfo to rust_toolchain. (#1416)
Browse files Browse the repository at this point in the history
  • Loading branch information
UebelAndre authored Jun 27, 2022
1 parent 7465c1a commit 52fc701
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 14 deletions.
9 changes: 7 additions & 2 deletions rust/toolchain.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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.
Expand All @@ -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,
Expand Down
9 changes: 8 additions & 1 deletion test/unit/toolchain_make_variables/main.rs
Original file line number Diff line number Diff line change
@@ -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();
}
1 change: 1 addition & 0 deletions test/unit/toolchain_make_variables/test.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fn main() {}
136 changes: 125 additions & 11 deletions test/unit/toolchain_make_variables/toolchain_make_variables_test.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ _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]

assert_action_mnemonic(
env = env,
action = action,
mnemonic = "Rustc",
mnemonic = mnemonic,
)

toolchain = ctx.attr._current_rust_toolchain[platform_common.ToolchainInfo]
Expand All @@ -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,
),
},
)
Expand All @@ -59,34 +152,43 @@ def _define_targets():
rust_library(
name = "library",
srcs = ["main.rs"],
toolchains = ["//rust/toolchain:current_rust_toolchain"],
rustc_env = _ENV,
edition = "2018",
)

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",
)

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
Expand Down Expand Up @@ -115,12 +217,24 @@ 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 = [
":rustc_env_variable_expansion_library_test",
":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",
],
)

0 comments on commit 52fc701

Please sign in to comment.