Skip to content

Commit 4efefd6

Browse files
authored
Add incompatible_make_rust_providers_target_independent flag (#967)
This flag guards the incompatible changes needed in order to be able to compile files in aspects. For more information see #966.
1 parent 3438d06 commit 4efefd6

File tree

10 files changed

+174
-46
lines changed

10 files changed

+174
-46
lines changed

docs/flatten.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,7 +1354,7 @@ A test rule for performing `rustfmt --check` on a set of targets
13541354
## CrateInfo
13551355

13561356
<pre>
1357-
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>,
1357+
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>,
13581358
<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>)
13591359
</pre>
13601360

@@ -1367,12 +1367,13 @@ A provider containing general Crate information.
13671367
| :------------- | :------------- |
13681368
| <a id="CrateInfo-aliases"></a>aliases | Dict[Label, String]: Renamed and aliased crates |
13691369
| <a id="CrateInfo-compile_data"></a>compile_data | depset[File]: Compile data required by this crate. |
1370-
| <a id="CrateInfo-deps"></a>deps | depset[Provider]: This crate's (rust or cc) dependencies' providers. |
1370+
| <a id="CrateInfo-deps"></a>deps | depset[DepVariantInfo|Target]: This crate's (rust or cc) dependencies' providers. |
13711371
| <a id="CrateInfo-edition"></a>edition | str: The edition of this crate. |
13721372
| <a id="CrateInfo-is_test"></a>is_test | bool: If the crate is being compiled in a test context |
13731373
| <a id="CrateInfo-name"></a>name | str: The name of this crate. |
13741374
| <a id="CrateInfo-output"></a>output | File: The output File that will be produced, depends on crate type. |
1375-
| <a id="CrateInfo-proc_macro_deps"></a>proc_macro_deps | depset[CrateInfo]: This crate's rust proc_macro dependencies' providers. |
1375+
| <a id="CrateInfo-owner"></a>owner | Label: The label of the target that produced this CrateInfo |
1376+
| <a id="CrateInfo-proc_macro_deps"></a>proc_macro_deps | depset[DepVariantInfo|Target]: This crate's rust proc_macro dependencies' providers. |
13761377
| <a id="CrateInfo-root"></a>root | File: The source File entrypoint to this crate, eg. lib.rs |
13771378
| <a id="CrateInfo-rustc_env"></a>rustc_env | Dict[String, String]: Additional <code>"key": "value"</code> environment variables to set for rustc. |
13781379
| <a id="CrateInfo-srcs"></a>srcs | depset[File]: All source Files that are part of the crate. |

docs/providers.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
## CrateInfo
1111

1212
<pre>
13-
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>,
13+
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>,
1414
<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>)
1515
</pre>
1616

@@ -23,12 +23,13 @@ A provider containing general Crate information.
2323
| :------------- | :------------- |
2424
| <a id="CrateInfo-aliases"></a>aliases | Dict[Label, String]: Renamed and aliased crates |
2525
| <a id="CrateInfo-compile_data"></a>compile_data | depset[File]: Compile data required by this crate. |
26-
| <a id="CrateInfo-deps"></a>deps | depset[Provider]: This crate's (rust or cc) dependencies' providers. |
26+
| <a id="CrateInfo-deps"></a>deps | depset[DepVariantInfo|Target]: This crate's (rust or cc) dependencies' providers. |
2727
| <a id="CrateInfo-edition"></a>edition | str: The edition of this crate. |
2828
| <a id="CrateInfo-is_test"></a>is_test | bool: If the crate is being compiled in a test context |
2929
| <a id="CrateInfo-name"></a>name | str: The name of this crate. |
3030
| <a id="CrateInfo-output"></a>output | File: The output File that will be produced, depends on crate type. |
31-
| <a id="CrateInfo-proc_macro_deps"></a>proc_macro_deps | depset[CrateInfo]: This crate's rust proc_macro dependencies' providers. |
31+
| <a id="CrateInfo-owner"></a>owner | Label: The label of the target that produced this CrateInfo |
32+
| <a id="CrateInfo-proc_macro_deps"></a>proc_macro_deps | depset[DepVariantInfo|Target]: This crate's rust proc_macro dependencies' providers. |
3233
| <a id="CrateInfo-root"></a>root | File: The source File entrypoint to this crate, eg. lib.rs |
3334
| <a id="CrateInfo-rustc_env"></a>rustc_env | Dict[String, String]: Additional <code>"key": "value"</code> environment variables to set for rustc. |
3435
| <a id="CrateInfo-srcs"></a>srcs | depset[File]: All source Files that are part of the crate. |

proto/proto.bzl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ load("//rust:rust.bzl", "rust_common")
4444
load("//rust/private:rustc.bzl", "rustc_compile_action")
4545

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

4949
RustProtoInfo = provider(
5050
doc = "Rust protobuf provider info",
@@ -212,10 +212,15 @@ def _rust_proto_compile(protos, descriptor_sets, imports, crate_name, ctx, is_gr
212212
output_hash,
213213
))
214214

215+
toolchain = find_toolchain(ctx)
216+
215217
# Gather all dependencies for compilation
216218
compile_action_deps = depset(
217-
compile_deps +
218-
proto_toolchain.grpc_compile_deps if is_grpc else proto_toolchain.proto_compile_deps,
219+
transform_deps(
220+
compile_deps +
221+
proto_toolchain.grpc_compile_deps if is_grpc else proto_toolchain.proto_compile_deps,
222+
toolchain._incompatible_make_rust_providers_target_independent,
223+
),
219224
)
220225

221226
return rustc_compile_action(

rust/private/clippy.bzl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@ load(
2222
"collect_inputs",
2323
"construct_arguments",
2424
)
25-
load("//rust/private:utils.bzl", "determine_output_hash", "find_cc_toolchain", "find_toolchain")
25+
load(
26+
"//rust/private:utils.bzl",
27+
"determine_output_hash",
28+
"find_cc_toolchain",
29+
"find_toolchain",
30+
)
2631

2732
def _get_clippy_ready_crate_info(target, aspect_ctx):
2833
"""Check that a target is suitable for clippy and extract the `CrateInfo` provider from it.
@@ -63,6 +68,7 @@ def _clippy_aspect_impl(target, ctx):
6368
deps = crate_info.deps,
6469
proc_macro_deps = crate_info.proc_macro_deps,
6570
aliases = crate_info.aliases,
71+
make_rust_providers_target_independent = toolchain._incompatible_make_rust_providers_target_independent,
6672
)
6773

6874
compile_inputs, out_dir, build_env_files, build_flags_files, linkstamp_outs = collect_inputs(

rust/private/providers.bzl

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ CrateInfo = provider(
1919
fields = {
2020
"aliases": "Dict[Label, String]: Renamed and aliased crates",
2121
"compile_data": "depset[File]: Compile data required by this crate.",
22-
"deps": "depset[Provider]: This crate's (rust or cc) dependencies' providers.",
22+
"deps": "depset[DepVariantInfo|Target]: This crate's (rust or cc) dependencies' providers.",
2323
"edition": "str: The edition of this crate.",
2424
"is_test": "bool: If the crate is being compiled in a test context",
2525
"name": "str: The name of this crate.",
2626
"output": "File: The output File that will be produced, depends on crate type.",
27-
"proc_macro_deps": "depset[CrateInfo]: This crate's rust proc_macro dependencies' providers.",
27+
"owner": "Label: The label of the target that produced this CrateInfo",
28+
"proc_macro_deps": "depset[DepVariantInfo|Target]: This crate's rust proc_macro dependencies' providers.",
2829
"root": "File: The source File entrypoint to this crate, eg. lib.rs",
2930
"rustc_env": "Dict[String, String]: Additional `\"key\": \"value\"` environment variables to set for rustc.",
3031
"srcs": "depset[File]: All source Files that are part of the crate.",
@@ -51,6 +52,30 @@ DepInfo = provider(
5152
},
5253
)
5354

55+
BuildInfo = provider(
56+
doc = "A provider containing `rustc` build settings for a given Crate.",
57+
fields = {
58+
"dep_env": "File: extra build script environment varibles to be set to direct dependencies.",
59+
"flags": "File: file containing additional flags to pass to rustc",
60+
"link_flags": "File: file containing flags to pass to the linker",
61+
"out_dir": "File: directory containing the result of a build script",
62+
"rustc_env": "File: file containing additional environment variables to set for rustc.",
63+
},
64+
)
65+
66+
DepVariantInfo = provider(
67+
doc = "A wrapper provider for a dependency of a crate. The dependency can be a Rust " +
68+
"dependency, in which case the `crate_info` and `dep_info` fields will be populated, " +
69+
"a Rust build script dependency, in which case `build_info` will be populated, or a " +
70+
"C/C++ dependency, in which case `cc_info` will be populated.",
71+
fields = {
72+
"build_info": "BuildInfo: The BuildInfo of a Rust dependency",
73+
"cc_info": "CcInfo: The CcInfo of a C/C++ dependency",
74+
"crate_info": "CrateInfo: The CrateInfo of a Rust dependency",
75+
"dep_info": "DepInfo: The DepInfo of a Rust dependency",
76+
},
77+
)
78+
5479
StdLibInfo = provider(
5580
doc = (
5681
"A collection of files either found within the `rust-stdlib` artifact or " +

rust/private/rust.bzl

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ load(
2222
"determine_output_hash",
2323
"expand_dict_value_locations",
2424
"find_toolchain",
25+
"transform_deps",
2526
)
2627

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

254+
make_rust_providers_target_independent = toolchain._incompatible_make_rust_providers_target_independent
255+
deps = transform_deps(ctx.attr.deps, make_rust_providers_target_independent)
256+
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps, make_rust_providers_target_independent)
257+
253258
return rustc_compile_action(
254259
ctx = ctx,
255260
attr = ctx.attr,
@@ -259,14 +264,15 @@ def _rust_library_common(ctx, crate_type):
259264
type = crate_type,
260265
root = crate_root,
261266
srcs = depset(ctx.files.srcs),
262-
deps = depset(ctx.attr.deps),
263-
proc_macro_deps = depset(ctx.attr.proc_macro_deps),
267+
deps = depset(deps),
268+
proc_macro_deps = depset(proc_macro_deps),
264269
aliases = ctx.attr.aliases,
265270
output = rust_lib,
266271
edition = get_edition(ctx.attr, toolchain),
267272
rustc_env = ctx.attr.rustc_env,
268273
is_test = False,
269274
compile_data = depset(ctx.files.compile_data),
275+
owner = ctx.label,
270276
),
271277
output_hash = output_hash,
272278
)
@@ -286,6 +292,10 @@ def _rust_binary_impl(ctx):
286292

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

295+
make_rust_providers_target_independent = toolchain._incompatible_make_rust_providers_target_independent
296+
deps = transform_deps(ctx.attr.deps, make_rust_providers_target_independent)
297+
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps, make_rust_providers_target_independent)
298+
289299
return rustc_compile_action(
290300
ctx = ctx,
291301
attr = ctx.attr,
@@ -295,14 +305,15 @@ def _rust_binary_impl(ctx):
295305
type = ctx.attr.crate_type,
296306
root = crate_root_src(ctx.attr, ctx.files.srcs, ctx.attr.crate_type),
297307
srcs = depset(ctx.files.srcs),
298-
deps = depset(ctx.attr.deps),
299-
proc_macro_deps = depset(ctx.attr.proc_macro_deps),
308+
deps = depset(deps),
309+
proc_macro_deps = depset(proc_macro_deps),
300310
aliases = ctx.attr.aliases,
301311
output = output,
302312
edition = get_edition(ctx.attr, toolchain),
303313
rustc_env = ctx.attr.rustc_env,
304314
is_test = False,
305315
compile_data = depset(ctx.files.compile_data),
316+
owner = ctx.label,
306317
),
307318
)
308319

@@ -397,6 +408,11 @@ def _rust_test_common(ctx, toolchain, output):
397408

398409
crate_name = crate_name_from_attr(ctx.attr)
399410
crate_type = "bin"
411+
412+
make_rust_providers_target_independent = toolchain._incompatible_make_rust_providers_target_independent
413+
deps = transform_deps(ctx.attr.deps, make_rust_providers_target_independent)
414+
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps, make_rust_providers_target_independent)
415+
400416
if ctx.attr.crate:
401417
# Target is building the crate in `test` config
402418
crate = ctx.attr.crate[rust_common.crate_info]
@@ -413,15 +429,16 @@ def _rust_test_common(ctx, toolchain, output):
413429
type = crate_type,
414430
root = crate.root,
415431
srcs = depset(ctx.files.srcs, transitive = [crate.srcs]),
416-
deps = depset(ctx.attr.deps, transitive = [crate.deps]),
417-
proc_macro_deps = depset(ctx.attr.proc_macro_deps, transitive = [crate.proc_macro_deps]),
432+
deps = depset(deps, transitive = [crate.deps]),
433+
proc_macro_deps = depset(proc_macro_deps, transitive = [crate.proc_macro_deps]),
418434
aliases = ctx.attr.aliases,
419435
output = output,
420436
edition = crate.edition,
421437
rustc_env = ctx.attr.rustc_env,
422438
is_test = True,
423439
compile_data = compile_data,
424440
wrapped_crate_type = crate.type,
441+
owner = ctx.label,
425442
)
426443
else:
427444
# Target is a standalone crate. Build the test binary as its own crate.
@@ -430,14 +447,15 @@ def _rust_test_common(ctx, toolchain, output):
430447
type = crate_type,
431448
root = crate_root_src(ctx.attr, ctx.files.srcs, "lib"),
432449
srcs = depset(ctx.files.srcs),
433-
deps = depset(ctx.attr.deps),
434-
proc_macro_deps = depset(ctx.attr.proc_macro_deps),
450+
deps = depset(deps),
451+
proc_macro_deps = depset(proc_macro_deps),
435452
aliases = ctx.attr.aliases,
436453
output = output,
437454
edition = get_edition(ctx.attr, toolchain),
438455
rustc_env = ctx.attr.rustc_env,
439456
is_test = True,
440457
compile_data = depset(ctx.files.compile_data),
458+
owner = ctx.label,
441459
)
442460

443461
providers = rustc_compile_action(

0 commit comments

Comments
 (0)