Skip to content

Commit 8f0c279

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
1 parent d86e06a commit 8f0c279

File tree

16 files changed

+349
-79
lines changed

16 files changed

+349
-79
lines changed

docs/flatten.md

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

13091309
<pre>
1310-
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>,
1311-
<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>)
1310+
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>,
1311+
<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>)
13121312
</pre>
13131313

13141314
A provider containing general Crate information.
@@ -1323,6 +1323,7 @@ A provider containing general Crate information.
13231323
| <a id="CrateInfo-deps"></a>deps | depset[DepVariantInfo]: This crate's (rust or cc) dependencies' providers. |
13241324
| <a id="CrateInfo-edition"></a>edition | str: The edition of this crate. |
13251325
| <a id="CrateInfo-is_test"></a>is_test | bool: If the crate is being compiled in a test context |
1326+
| <a id="CrateInfo-metadata"></a>metadata | File: The rmeta file produced for this crate. It is optional. |
13261327
| <a id="CrateInfo-name"></a>name | str: The name of this crate. |
13271328
| <a id="CrateInfo-output"></a>output | File: The output File that will be produced, depends on crate type. |
13281329
| <a id="CrateInfo-owner"></a>owner | Label: The label of the target that produced this CrateInfo |
@@ -1340,7 +1341,8 @@ A provider containing general Crate information.
13401341

13411342
<pre>
13421343
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>,
1343-
<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>)
1344+
<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>,
1345+
<a href="#DepInfo-transitive_noncrates">transitive_noncrates</a>)
13441346
</pre>
13451347

13461348
A provider containing information about a Crate's dependencies.
@@ -1356,6 +1358,7 @@ A provider containing information about a Crate's dependencies.
13561358
| <a id="DepInfo-transitive_build_infos"></a>transitive_build_infos | depset[BuildInfo] |
13571359
| <a id="DepInfo-transitive_crate_outputs"></a>transitive_crate_outputs | depset[File]: All transitive crate outputs. |
13581360
| <a id="DepInfo-transitive_crates"></a>transitive_crates | depset[CrateInfo] |
1361+
| <a id="DepInfo-transitive_metadata_outputs"></a>transitive_metadata_outputs | depset[File]: All transitive crate metadata outputs. |
13591362
| <a id="DepInfo-transitive_noncrates"></a>transitive_noncrates | depset[LinkerInput]: All transitive dependencies that aren't crates. |
13601363

13611364

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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,11 @@ def _rust_proto_compile(protos, descriptor_sets, imports, crate_name, ctx, is_gr
212212
crate_name,
213213
output_hash,
214214
))
215+
rust_metadata = ctx.actions.declare_file("%s/lib%s-%s.rmeta" % (
216+
output_dir,
217+
crate_name,
218+
output_hash,
219+
))
215220

216221
# Gather all dependencies for compilation
217222
compile_action_deps = depset(
@@ -234,6 +239,7 @@ def _rust_proto_compile(protos, descriptor_sets, imports, crate_name, ctx, is_gr
234239
proc_macro_deps = depset([]),
235240
aliases = {},
236241
output = rust_lib,
242+
metadata = rust_metadata,
237243
edition = proto_toolchain.edition,
238244
rustc_env = {},
239245
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: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
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(
@@ -26,7 +27,6 @@ load(
2627
"name_to_crate_name",
2728
"transform_deps",
2829
)
29-
3030
# TODO(marco): Separate each rule into its own file.
3131

3232
def _assert_no_deprecated_attributes(_ctx):
@@ -266,6 +266,20 @@ def _rust_library_common(ctx, crate_type):
266266
output_hash,
267267
)
268268
rust_lib = ctx.actions.declare_file(rust_lib_name)
269+
rust_metadata = None
270+
271+
# We can only build metadata iif
272+
# - Pipelined compilation is enabled,
273+
# - we are building with process wrapper, and
274+
# - the current crate is a lib or rlib
275+
can_build_metadata = toolchain._pipelined_compilation and ctx.attr._process_wrapper and crate_type in ("rlib", "lib")
276+
277+
# can_build_metadata = ctx.attr._process_wrapper and crate_type in ("rlib", "lib")
278+
if can_build_metadata:
279+
rust_metadata = ctx.actions.declare_file(
280+
paths.replace_extension(rust_lib_name, ".rmeta"),
281+
sibling = rust_lib,
282+
)
269283

270284
deps = transform_deps(ctx.attr.deps)
271285
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
@@ -283,6 +297,7 @@ def _rust_library_common(ctx, crate_type):
283297
proc_macro_deps = depset(proc_macro_deps),
284298
aliases = ctx.attr.aliases,
285299
output = rust_lib,
300+
metadata = rust_metadata,
286301
edition = get_edition(ctx.attr, toolchain, ctx.label),
287302
rustc_env = ctx.attr.rustc_env,
288303
is_test = False,

0 commit comments

Comments
 (0)