Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add incompatible_make_rust_providers_target_independent flag #967

Merged
merged 10 commits into from
Oct 12, 2021
7 changes: 4 additions & 3 deletions docs/flatten.md
Original file line number Diff line number Diff line change
Expand Up @@ -1351,7 +1351,7 @@ A test rule for performing `rustfmt --check` on a set of targets
## CrateInfo

<pre>
CrateInfo(<a href="#CrateInfo-aliases">aliases</a>, <a href="#CrateInfo-compile_data">compile_data</a>, <a href="#CrateInfo-deps">deps</a>, <a href="#CrateInfo-edition">edition</a>, <a href="#CrateInfo-is_test">is_test</a>, <a href="#CrateInfo-name">name</a>, <a href="#CrateInfo-output">output</a>, <a href="#CrateInfo-proc_macro_deps">proc_macro_deps</a>, <a href="#CrateInfo-root">root</a>,
CrateInfo(<a href="#CrateInfo-aliases">aliases</a>, <a href="#CrateInfo-compile_data">compile_data</a>, <a href="#CrateInfo-deps">deps</a>, <a href="#CrateInfo-edition">edition</a>, <a href="#CrateInfo-is_test">is_test</a>, <a href="#CrateInfo-name">name</a>, <a href="#CrateInfo-output">output</a>, <a href="#CrateInfo-owner">owner</a>, <a href="#CrateInfo-proc_macro_deps">proc_macro_deps</a>, <a href="#CrateInfo-root">root</a>,
<a href="#CrateInfo-rustc_env">rustc_env</a>, <a href="#CrateInfo-srcs">srcs</a>, <a href="#CrateInfo-type">type</a>, <a href="#CrateInfo-wrapped_crate_type">wrapped_crate_type</a>)
</pre>

Expand All @@ -1364,12 +1364,13 @@ A provider containing general Crate information.
| :------------- | :------------- |
| <a id="CrateInfo-aliases"></a>aliases | Dict[Label, String]: Renamed and aliased crates |
| <a id="CrateInfo-compile_data"></a>compile_data | depset[File]: Compile data required by this crate. |
| <a id="CrateInfo-deps"></a>deps | depset[Provider]: This crate's (rust or cc) dependencies' providers. |
| <a id="CrateInfo-deps"></a>deps | depset[DepVariantInfo|Target]: This crate's (rust or cc) dependencies' providers. |
| <a id="CrateInfo-edition"></a>edition | str: The edition of this crate. |
| <a id="CrateInfo-is_test"></a>is_test | bool: If the crate is being compiled in a test context |
| <a id="CrateInfo-name"></a>name | str: The name of this crate. |
| <a id="CrateInfo-output"></a>output | File: The output File that will be produced, depends on crate type. |
| <a id="CrateInfo-proc_macro_deps"></a>proc_macro_deps | depset[CrateInfo]: This crate's rust proc_macro dependencies' providers. |
| <a id="CrateInfo-owner"></a>owner | Label: The label of the target that produced this CrateInfo |
| <a id="CrateInfo-proc_macro_deps"></a>proc_macro_deps | depset[DepVariantInfo|Target]: This crate's rust proc_macro dependencies' providers. |
| <a id="CrateInfo-root"></a>root | File: The source File entrypoint to this crate, eg. lib.rs |
| <a id="CrateInfo-rustc_env"></a>rustc_env | Dict[String, String]: Additional <code>"key": "value"</code> environment variables to set for rustc. |
| <a id="CrateInfo-srcs"></a>srcs | depset[File]: All source Files that are part of the crate. |
Expand Down
7 changes: 4 additions & 3 deletions docs/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
## CrateInfo

<pre>
CrateInfo(<a href="#CrateInfo-aliases">aliases</a>, <a href="#CrateInfo-compile_data">compile_data</a>, <a href="#CrateInfo-deps">deps</a>, <a href="#CrateInfo-edition">edition</a>, <a href="#CrateInfo-is_test">is_test</a>, <a href="#CrateInfo-name">name</a>, <a href="#CrateInfo-output">output</a>, <a href="#CrateInfo-proc_macro_deps">proc_macro_deps</a>, <a href="#CrateInfo-root">root</a>,
CrateInfo(<a href="#CrateInfo-aliases">aliases</a>, <a href="#CrateInfo-compile_data">compile_data</a>, <a href="#CrateInfo-deps">deps</a>, <a href="#CrateInfo-edition">edition</a>, <a href="#CrateInfo-is_test">is_test</a>, <a href="#CrateInfo-name">name</a>, <a href="#CrateInfo-output">output</a>, <a href="#CrateInfo-owner">owner</a>, <a href="#CrateInfo-proc_macro_deps">proc_macro_deps</a>, <a href="#CrateInfo-root">root</a>,
<a href="#CrateInfo-rustc_env">rustc_env</a>, <a href="#CrateInfo-srcs">srcs</a>, <a href="#CrateInfo-type">type</a>, <a href="#CrateInfo-wrapped_crate_type">wrapped_crate_type</a>)
</pre>

Expand All @@ -23,12 +23,13 @@ A provider containing general Crate information.
| :------------- | :------------- |
| <a id="CrateInfo-aliases"></a>aliases | Dict[Label, String]: Renamed and aliased crates |
| <a id="CrateInfo-compile_data"></a>compile_data | depset[File]: Compile data required by this crate. |
| <a id="CrateInfo-deps"></a>deps | depset[Provider]: This crate's (rust or cc) dependencies' providers. |
| <a id="CrateInfo-deps"></a>deps | depset[DepVariantInfo|Target]: This crate's (rust or cc) dependencies' providers. |
| <a id="CrateInfo-edition"></a>edition | str: The edition of this crate. |
| <a id="CrateInfo-is_test"></a>is_test | bool: If the crate is being compiled in a test context |
| <a id="CrateInfo-name"></a>name | str: The name of this crate. |
| <a id="CrateInfo-output"></a>output | File: The output File that will be produced, depends on crate type. |
| <a id="CrateInfo-proc_macro_deps"></a>proc_macro_deps | depset[CrateInfo]: This crate's rust proc_macro dependencies' providers. |
| <a id="CrateInfo-owner"></a>owner | Label: The label of the target that produced this CrateInfo |
| <a id="CrateInfo-proc_macro_deps"></a>proc_macro_deps | depset[DepVariantInfo|Target]: This crate's rust proc_macro dependencies' providers. |
| <a id="CrateInfo-root"></a>root | File: The source File entrypoint to this crate, eg. lib.rs |
| <a id="CrateInfo-rustc_env"></a>rustc_env | Dict[String, String]: Additional <code>"key": "value"</code> environment variables to set for rustc. |
| <a id="CrateInfo-srcs"></a>srcs | depset[File]: All source Files that are part of the crate. |
Expand Down
11 changes: 8 additions & 3 deletions proto/proto.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ load("//rust:rust.bzl", "rust_common")
load("//rust/private:rustc.bzl", "rustc_compile_action")

# buildifier: disable=bzl-visibility
load("//rust/private:utils.bzl", "determine_output_hash", "find_toolchain")
load("//rust/private:utils.bzl", "determine_output_hash", "find_toolchain", "transform_deps")

RustProtoInfo = provider(
doc = "Rust protobuf provider info",
Expand Down Expand Up @@ -212,10 +212,15 @@ def _rust_proto_compile(protos, descriptor_sets, imports, crate_name, ctx, is_gr
output_hash,
))

toolchain = find_toolchain(ctx)

# Gather all dependencies for compilation
compile_action_deps = depset(
compile_deps +
proto_toolchain.grpc_compile_deps if is_grpc else proto_toolchain.proto_compile_deps,
transform_deps(
compile_deps +
proto_toolchain.grpc_compile_deps if is_grpc else proto_toolchain.proto_compile_deps,
toolchain._incompatible_make_rust_providers_target_independent,
),
)

return rustc_compile_action(
Expand Down
8 changes: 7 additions & 1 deletion rust/private/clippy.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,12 @@ load(
"collect_inputs",
"construct_arguments",
)
load("//rust/private:utils.bzl", "determine_output_hash", "find_cc_toolchain", "find_toolchain")
load(
"//rust/private:utils.bzl",
"determine_output_hash",
"find_cc_toolchain",
"find_toolchain",
)

def _get_clippy_ready_crate_info(target, aspect_ctx):
"""Check that a target is suitable for clippy and extract the `CrateInfo` provider from it.
Expand Down Expand Up @@ -63,6 +68,7 @@ def _clippy_aspect_impl(target, ctx):
deps = crate_info.deps,
proc_macro_deps = crate_info.proc_macro_deps,
aliases = crate_info.aliases,
make_rust_providers_target_independent = toolchain._incompatible_make_rust_providers_target_independent,
)

compile_inputs, out_dir, build_env_files, build_flags_files = collect_inputs(
Expand Down
29 changes: 27 additions & 2 deletions rust/private/providers.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ CrateInfo = provider(
fields = {
"aliases": "Dict[Label, String]: Renamed and aliased crates",
"compile_data": "depset[File]: Compile data required by this crate.",
"deps": "depset[Provider]: This crate's (rust or cc) dependencies' providers.",
"deps": "depset[DepVariantInfo|Target]: This crate's (rust or cc) dependencies' providers.",
"edition": "str: The edition of this crate.",
"is_test": "bool: If the crate is being compiled in a test context",
"name": "str: The name of this crate.",
"output": "File: The output File that will be produced, depends on crate type.",
"proc_macro_deps": "depset[CrateInfo]: This crate's rust proc_macro dependencies' providers.",
"owner": "Label: The label of the target that produced this CrateInfo",
"proc_macro_deps": "depset[DepVariantInfo|Target]: This crate's rust proc_macro dependencies' providers.",
"root": "File: The source File entrypoint to this crate, eg. lib.rs",
"rustc_env": "Dict[String, String]: Additional `\"key\": \"value\"` environment variables to set for rustc.",
"srcs": "depset[File]: All source Files that are part of the crate.",
Expand All @@ -51,6 +52,30 @@ DepInfo = provider(
},
)

BuildInfo = provider(
doc = "A provider containing `rustc` build settings for a given Crate.",
fields = {
"dep_env": "File: extra build script environment varibles to be set to direct dependencies.",
"flags": "File: file containing additional flags to pass to rustc",
"link_flags": "File: file containing flags to pass to the linker",
"out_dir": "File: directory containing the result of a build script",
"rustc_env": "File: file containing additional environment variables to set for rustc.",
},
)

DepVariantInfo = provider(
doc = "A wrapper provider for a dependency of a crate. The dependency can be a Rust " +
"dependency, in which case the `crate_info` and `dep_info` fields will be populated, " +
"a Rust build script dependency, in which case `build_info` will be populated, or a " +
"C/C++ dependency, in which case `cc_info` will be populated.",
fields = {
"build_info": "BuildInfo: The BuildInfo of a Rust dependency",
"cc_info": "CcInfo: The CcInfo of a C/C++ dependency",
"crate_info": "CrateInfo: The CrateInfo of a Rust dependency",
"dep_info": "DepInfo: The DepInfo of a Rust dependency",
},
)

StdLibInfo = provider(
doc = (
"A collection of files either found within the `rust-stdlib` artifact or " +
Expand Down
34 changes: 26 additions & 8 deletions rust/private/rust.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ load(
"determine_output_hash",
"expand_dict_value_locations",
"find_toolchain",
"transform_deps",
)

# TODO(marco): Separate each rule into its own file.
Expand Down Expand Up @@ -250,6 +251,10 @@ def _rust_library_common(ctx, crate_type):
)
rust_lib = ctx.actions.declare_file(rust_lib_name)

make_rust_providers_target_independent = toolchain._incompatible_make_rust_providers_target_independent
deps = transform_deps(ctx.attr.deps, make_rust_providers_target_independent)
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps, make_rust_providers_target_independent)

return rustc_compile_action(
ctx = ctx,
attr = ctx.attr,
Expand All @@ -259,14 +264,15 @@ def _rust_library_common(ctx, crate_type):
type = crate_type,
root = crate_root,
srcs = depset(ctx.files.srcs),
deps = depset(ctx.attr.deps),
proc_macro_deps = depset(ctx.attr.proc_macro_deps),
deps = depset(deps),
proc_macro_deps = depset(proc_macro_deps),
aliases = ctx.attr.aliases,
output = rust_lib,
edition = get_edition(ctx.attr, toolchain),
rustc_env = ctx.attr.rustc_env,
is_test = False,
compile_data = depset(ctx.files.compile_data),
owner = ctx.label,
),
output_hash = output_hash,
)
Expand All @@ -286,6 +292,10 @@ def _rust_binary_impl(ctx):

output = ctx.actions.declare_file(ctx.label.name + toolchain.binary_ext)

make_rust_providers_target_independent = toolchain._incompatible_make_rust_providers_target_independent
deps = transform_deps(ctx.attr.deps, make_rust_providers_target_independent)
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps, make_rust_providers_target_independent)

return rustc_compile_action(
ctx = ctx,
attr = ctx.attr,
Expand All @@ -295,14 +305,15 @@ def _rust_binary_impl(ctx):
type = ctx.attr.crate_type,
root = crate_root_src(ctx.attr, ctx.files.srcs, ctx.attr.crate_type),
srcs = depset(ctx.files.srcs),
deps = depset(ctx.attr.deps),
proc_macro_deps = depset(ctx.attr.proc_macro_deps),
deps = depset(deps),
proc_macro_deps = depset(proc_macro_deps),
aliases = ctx.attr.aliases,
output = output,
edition = get_edition(ctx.attr, toolchain),
rustc_env = ctx.attr.rustc_env,
is_test = False,
compile_data = depset(ctx.files.compile_data),
owner = ctx.label,
),
)

Expand Down Expand Up @@ -404,6 +415,11 @@ def _rust_test_common(ctx, toolchain, output):

crate_name = crate_name_from_attr(ctx.attr)
crate_type = "bin"

make_rust_providers_target_independent = toolchain._incompatible_make_rust_providers_target_independent
deps = transform_deps(ctx.attr.deps, make_rust_providers_target_independent)
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps, make_rust_providers_target_independent)

if ctx.attr.crate:
# Target is building the crate in `test` config
crate = ctx.attr.crate[rust_common.crate_info]
Expand All @@ -420,15 +436,16 @@ def _rust_test_common(ctx, toolchain, output):
type = crate_type,
root = crate.root,
srcs = depset(ctx.files.srcs, transitive = [crate.srcs]),
deps = depset(ctx.attr.deps, transitive = [crate.deps]),
proc_macro_deps = depset(ctx.attr.proc_macro_deps, transitive = [crate.proc_macro_deps]),
deps = depset(deps, transitive = [crate.deps]),
proc_macro_deps = depset(proc_macro_deps, transitive = [crate.proc_macro_deps]),
aliases = ctx.attr.aliases,
output = output,
edition = crate.edition,
rustc_env = ctx.attr.rustc_env,
is_test = True,
compile_data = compile_data,
wrapped_crate_type = crate.type,
owner = ctx.label,
)
else:
# Target is a standalone crate. Build the test binary as its own crate.
Expand All @@ -437,14 +454,15 @@ def _rust_test_common(ctx, toolchain, output):
type = crate_type,
root = crate_root_src(ctx.attr, ctx.files.srcs, "lib"),
srcs = depset(ctx.files.srcs),
deps = depset(ctx.attr.deps),
proc_macro_deps = depset(ctx.attr.proc_macro_deps),
deps = depset(deps),
proc_macro_deps = depset(proc_macro_deps),
aliases = ctx.attr.aliases,
output = output,
edition = get_edition(ctx.attr, toolchain),
rustc_env = ctx.attr.rustc_env,
is_test = True,
compile_data = depset(ctx.files.compile_data),
owner = ctx.label,
)

providers = rustc_compile_action(
Expand Down
Loading