Skip to content

Commit ea39bfe

Browse files
committed
rules_rust: enable pipelined compilation.
Pipelined compilation allows better parallelism during builds as it allows libraries to generate lightweight metadata files to unlock other depencies. These metadata files (.rmeta) can only be used to unlock library -> library dependencies and do not affect builds in any other way. This is currently the default in cargo: https://internals.rust-lang.org/t/evaluating-pipelined-rustc-compilation/10199. Pipelined compilation will be disabled by default and will need to be enabled via flag. Pipelined compilation is not supported on windows and will thus always be disabled.
1 parent 674762f commit ea39bfe

File tree

17 files changed

+384
-80
lines changed

17 files changed

+384
-80
lines changed

docs/flatten.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,8 +1310,8 @@ A test rule for performing `rustfmt --check` on a set of targets
13101310
## CrateInfo
13111311

13121312
<pre>
1313-
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>,
1314-
<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>)
1313+
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-metadata">metadata</a>, <a href="#CrateInfo-name">name</a>, <a href="#CrateInfo-output">output</a>, <a href="#CrateInfo-owner">owner</a>,
1314+
<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>)
13151315
</pre>
13161316

13171317
A provider containing general Crate information.
@@ -1326,6 +1326,7 @@ A provider containing general Crate information.
13261326
| <a id="CrateInfo-deps"></a>deps | depset[DepVariantInfo]: This crate's (rust or cc) dependencies' providers. |
13271327
| <a id="CrateInfo-edition"></a>edition | str: The edition of this crate. |
13281328
| <a id="CrateInfo-is_test"></a>is_test | bool: If the crate is being compiled in a test context |
1329+
| <a id="CrateInfo-metadata"></a>metadata | File: The rmeta file produced for this crate. It is optional. |
13291330
| <a id="CrateInfo-name"></a>name | str: The name of this crate. |
13301331
| <a id="CrateInfo-output"></a>output | File: The output File that will be produced, depends on crate type. |
13311332
| <a id="CrateInfo-owner"></a>owner | Label: The label of the target that produced this CrateInfo |
@@ -1343,7 +1344,8 @@ A provider containing general Crate information.
13431344

13441345
<pre>
13451346
DepInfo(<a href="#DepInfo-dep_env">dep_env</a>, <a href="#DepInfo-direct_crates">direct_crates</a>, <a href="#DepInfo-link_search_path_files">link_search_path_files</a>, <a href="#DepInfo-transitive_build_infos">transitive_build_infos</a>,
1346-
<a href="#DepInfo-transitive_crate_outputs">transitive_crate_outputs</a>, <a href="#DepInfo-transitive_crates">transitive_crates</a>, <a href="#DepInfo-transitive_noncrates">transitive_noncrates</a>)
1347+
<a href="#DepInfo-transitive_crate_outputs">transitive_crate_outputs</a>, <a href="#DepInfo-transitive_crates">transitive_crates</a>, <a href="#DepInfo-transitive_metadata_outputs">transitive_metadata_outputs</a>,
1348+
<a href="#DepInfo-transitive_noncrates">transitive_noncrates</a>)
13471349
</pre>
13481350

13491351
A provider containing information about a Crate's dependencies.
@@ -1359,6 +1361,7 @@ A provider containing information about a Crate's dependencies.
13591361
| <a id="DepInfo-transitive_build_infos"></a>transitive_build_infos | depset[BuildInfo] |
13601362
| <a id="DepInfo-transitive_crate_outputs"></a>transitive_crate_outputs | depset[File]: All transitive crate outputs. |
13611363
| <a id="DepInfo-transitive_crates"></a>transitive_crates | depset[CrateInfo] |
1364+
| <a id="DepInfo-transitive_metadata_outputs"></a>transitive_metadata_outputs | depset[File]: All transitive crate metadata outputs. |
13621365
| <a id="DepInfo-transitive_noncrates"></a>transitive_noncrates | depset[LinkerInput]: All transitive dependencies that aren't crates. |
13631366

13641367

docs/providers.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
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-owner">owner</a>, <a href="#CrateInfo-proc_macro_deps">proc_macro_deps</a>, <a href="#CrateInfo-root">root</a>,
14-
<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>)
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-metadata">metadata</a>, <a href="#CrateInfo-name">name</a>, <a href="#CrateInfo-output">output</a>, <a href="#CrateInfo-owner">owner</a>,
14+
<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>)
1515
</pre>
1616

1717
A provider containing general Crate information.
@@ -26,6 +26,7 @@ A provider containing general Crate information.
2626
| <a id="CrateInfo-deps"></a>deps | depset[DepVariantInfo]: 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 |
29+
| <a id="CrateInfo-metadata"></a>metadata | File: The rmeta file produced for this crate. It is optional. |
2930
| <a id="CrateInfo-name"></a>name | str: The name of this crate. |
3031
| <a id="CrateInfo-output"></a>output | File: The output File that will be produced, depends on crate type. |
3132
| <a id="CrateInfo-owner"></a>owner | Label: The label of the target that produced this CrateInfo |
@@ -43,7 +44,8 @@ A provider containing general Crate information.
4344

4445
<pre>
4546
DepInfo(<a href="#DepInfo-dep_env">dep_env</a>, <a href="#DepInfo-direct_crates">direct_crates</a>, <a href="#DepInfo-link_search_path_files">link_search_path_files</a>, <a href="#DepInfo-transitive_build_infos">transitive_build_infos</a>,
46-
<a href="#DepInfo-transitive_crate_outputs">transitive_crate_outputs</a>, <a href="#DepInfo-transitive_crates">transitive_crates</a>, <a href="#DepInfo-transitive_noncrates">transitive_noncrates</a>)
47+
<a href="#DepInfo-transitive_crate_outputs">transitive_crate_outputs</a>, <a href="#DepInfo-transitive_crates">transitive_crates</a>, <a href="#DepInfo-transitive_metadata_outputs">transitive_metadata_outputs</a>,
48+
<a href="#DepInfo-transitive_noncrates">transitive_noncrates</a>)
4749
</pre>
4850

4951
A provider containing information about a Crate's dependencies.
@@ -59,6 +61,7 @@ A provider containing information about a Crate's dependencies.
5961
| <a id="DepInfo-transitive_build_infos"></a>transitive_build_infos | depset[BuildInfo] |
6062
| <a id="DepInfo-transitive_crate_outputs"></a>transitive_crate_outputs | depset[File]: All transitive crate outputs. |
6163
| <a id="DepInfo-transitive_crates"></a>transitive_crates | depset[CrateInfo] |
64+
| <a id="DepInfo-transitive_metadata_outputs"></a>transitive_metadata_outputs | depset[File]: All transitive crate metadata outputs. |
6265
| <a id="DepInfo-transitive_noncrates"></a>transitive_noncrates | depset[LinkerInput]: All transitive dependencies that aren't crates. |
6366

6467

proto/proto.bzl

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

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

4949
RustProtoInfo = provider(
5050
doc = "Rust protobuf provider info",
@@ -212,6 +212,13 @@ def _rust_proto_compile(protos, descriptor_sets, imports, crate_name, ctx, is_gr
212212
crate_name,
213213
output_hash,
214214
))
215+
rust_metadata = None
216+
if can_build_metadata(toolchain, ctx, "rlib"):
217+
rust_metadata = ctx.actions.declare_file("%s/lib%s-%s.rmeta" % (
218+
output_dir,
219+
crate_name,
220+
output_hash,
221+
))
215222

216223
# Gather all dependencies for compilation
217224
compile_action_deps = depset(
@@ -234,6 +241,7 @@ def _rust_proto_compile(protos, descriptor_sets, imports, crate_name, ctx, is_gr
234241
proc_macro_deps = depset([]),
235242
aliases = {},
236243
output = rust_lib,
244+
metadata = rust_metadata,
237245
edition = proto_toolchain.edition,
238246
rustc_env = {},
239247
is_test = False,

rust/private/common.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ def _create_crate_info(**kwargs):
4747
"""
4848
if not "wrapped_crate_type" in kwargs:
4949
kwargs.update({"wrapped_crate_type": None})
50+
if not "metadata" in kwargs:
51+
kwargs.update({"metadata": None})
5052
return CrateInfo(**kwargs)
5153

5254
rust_common = struct(

rust/private/providers.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ CrateInfo = provider(
2222
"deps": "depset[DepVariantInfo]: 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",
25+
"metadata": "File: The rmeta file produced for this crate. It is optional.",
2526
"name": "str: The name of this crate.",
2627
"output": "File: The output File that will be produced, depends on crate type.",
2728
"owner": "Label: The label of the target that produced this CrateInfo",
@@ -49,6 +50,7 @@ DepInfo = provider(
4950
"transitive_build_infos": "depset[BuildInfo]",
5051
"transitive_crate_outputs": "depset[File]: All transitive crate outputs.",
5152
"transitive_crates": "depset[CrateInfo]",
53+
"transitive_metadata_outputs": "depset[File]: All transitive crate metadata outputs.",
5254
"transitive_noncrates": "depset[LinkerInput]: All transitive dependencies that aren't crates.",
5355
},
5456
)

rust/private/rust.bzl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
# limitations under the License.
1414

1515
# buildifier: disable=module-docstring
16+
load("@bazel_skylib//lib:paths.bzl", "paths")
1617
load("//rust/private:common.bzl", "rust_common")
1718
load("//rust/private:rustc.bzl", "rustc_compile_action")
1819
load(
1920
"//rust/private:utils.bzl",
21+
"can_build_metadata",
2022
"compute_crate_name",
2123
"dedent",
2224
"determine_output_hash",
@@ -25,7 +27,6 @@ load(
2527
"get_import_macro_deps",
2628
"transform_deps",
2729
)
28-
2930
# TODO(marco): Separate each rule into its own file.
3031

3132
def _assert_no_deprecated_attributes(_ctx):
@@ -316,6 +317,13 @@ def _rust_library_common(ctx, crate_type):
316317
)
317318
rust_lib = ctx.actions.declare_file(rust_lib_name)
318319

320+
rust_metadata = None
321+
if can_build_metadata(toolchain, ctx, crate_type):
322+
rust_metadata = ctx.actions.declare_file(
323+
paths.replace_extension(rust_lib_name, ".rmeta"),
324+
sibling = rust_lib,
325+
)
326+
319327
deps = transform_deps(ctx.attr.deps)
320328
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
321329

@@ -332,6 +340,7 @@ def _rust_library_common(ctx, crate_type):
332340
proc_macro_deps = depset(proc_macro_deps),
333341
aliases = ctx.attr.aliases,
334342
output = rust_lib,
343+
metadata = rust_metadata,
335344
edition = get_edition(ctx.attr, toolchain, ctx.label),
336345
rustc_env = ctx.attr.rustc_env,
337346
is_test = False,

0 commit comments

Comments
 (0)