Update `rust_library_group` to use `DepVariantInfo` (#2022)
* Update rust_library_group to use DepVariantInfo
* Regenerate documentation
diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel
index 6c55c0c..2a37518 100644
--- a/docs/BUILD.bazel
+++ b/docs/BUILD.bazel
@@ -49,6 +49,7 @@
symbols = [
"rust_binary",
"rust_library",
+ "rust_library_group",
"rust_static_library",
"rust_shared_library",
"rust_proc_macro",
diff --git a/docs/defs.md b/docs/defs.md
index 5ab97ba..ce622ea 100644
--- a/docs/defs.md
+++ b/docs/defs.md
@@ -3,6 +3,7 @@
* [rust_binary](#rust_binary)
* [rust_library](#rust_library)
+* [rust_library_group](#rust_library_group)
* [rust_static_library](#rust_static_library)
* [rust_shared_library](#rust_shared_library)
* [rust_proc_macro](#rust_proc_macro)
@@ -308,6 +309,57 @@
| <a id="rust_library-version"></a>version | A version to inject in the cargo environment variable. | String | optional | <code>"0.0.0"</code> |
+<a id="rust_library_group"></a>
+
+## rust_library_group
+
+<pre>
+rust_library_group(<a href="#rust_library_group-name">name</a>, <a href="#rust_library_group-deps">deps</a>)
+</pre>
+
+Functions as an alias for a set of dependencies.
+
+Specifically, the following are equivalent:
+
+```starlark
+rust_library_group(
+ name = "crate_group",
+ deps = [
+ ":crate1",
+ ":crate2",
+ ],
+)
+
+rust_library(
+ name = "foobar",
+ deps = [":crate_group"],
+ ...
+)
+```
+
+and
+
+```starlark
+rust_library(
+ name = "foobar",
+ deps = [
+ ":crate1",
+ ":crate2",
+ ],
+ ...
+)
+```
+
+
+**ATTRIBUTES**
+
+
+| Name | Description | Type | Mandatory | Default |
+| :------------- | :------------- | :------------- | :------------- | :------------- |
+| <a id="rust_library_group-name"></a>name | A unique name for this target. | <a href="https://bazel.build/concepts/labels#target-names">Name</a> | required | |
+| <a id="rust_library_group-deps"></a>deps | Other dependencies to forward through this crate group. | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | <code>[]</code> |
+
+
<a id="rust_proc_macro"></a>
## rust_proc_macro
diff --git a/docs/flatten.md b/docs/flatten.md
index 4a9941f..2af15c9 100644
--- a/docs/flatten.md
+++ b/docs/flatten.md
@@ -29,6 +29,7 @@
* [rust_doc_test](#rust_doc_test)
* [rust_grpc_library](#rust_grpc_library)
* [rust_library](#rust_library)
+* [rust_library_group](#rust_library_group)
* [rust_proc_macro](#rust_proc_macro)
* [rust_proto_library](#rust_proto_library)
* [rust_proto_repositories](#rust_proto_repositories)
@@ -731,6 +732,57 @@
| <a id="rust_library-version"></a>version | A version to inject in the cargo environment variable. | String | optional | <code>"0.0.0"</code> |
+<a id="rust_library_group"></a>
+
+## rust_library_group
+
+<pre>
+rust_library_group(<a href="#rust_library_group-name">name</a>, <a href="#rust_library_group-deps">deps</a>)
+</pre>
+
+Functions as an alias for a set of dependencies.
+
+Specifically, the following are equivalent:
+
+```starlark
+rust_library_group(
+ name = "crate_group",
+ deps = [
+ ":crate1",
+ ":crate2",
+ ],
+)
+
+rust_library(
+ name = "foobar",
+ deps = [":crate_group"],
+ ...
+)
+```
+
+and
+
+```starlark
+rust_library(
+ name = "foobar",
+ deps = [
+ ":crate1",
+ ":crate2",
+ ],
+ ...
+)
+```
+
+
+**ATTRIBUTES**
+
+
+| Name | Description | Type | Mandatory | Default |
+| :------------- | :------------- | :------------- | :------------- | :------------- |
+| <a id="rust_library_group-name"></a>name | A unique name for this target. | <a href="https://bazel.build/concepts/labels#target-names">Name</a> | required | |
+| <a id="rust_library_group-deps"></a>deps | Other dependencies to forward through this crate group. | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | <code>[]</code> |
+
+
<a id="rust_proc_macro"></a>
## rust_proc_macro
diff --git a/docs/symbols.bzl b/docs/symbols.bzl
index c5aa922..9a7e761 100644
--- a/docs/symbols.bzl
+++ b/docs/symbols.bzl
@@ -57,6 +57,7 @@
_rust_doc = "rust_doc",
_rust_doc_test = "rust_doc_test",
_rust_library = "rust_library",
+ _rust_library_group = "rust_library_group",
_rust_proc_macro = "rust_proc_macro",
_rust_shared_library = "rust_shared_library",
_rust_static_library = "rust_static_library",
@@ -112,6 +113,7 @@
rust_binary = _rust_binary
rust_library = _rust_library
+rust_library_group = _rust_library_group
rust_static_library = _rust_static_library
rust_shared_library = _rust_shared_library
rust_proc_macro = _rust_proc_macro
diff --git a/rust/private/common.bzl b/rust/private/common.bzl
index 63eb157..f6063a0 100644
--- a/rust/private/common.bzl
+++ b/rust/private/common.bzl
@@ -23,7 +23,7 @@
In the Bazel lingo, `rust_common` gives the access to the Rust Sandwich API.
"""
-load(":providers.bzl", "CrateGroupInfo", "CrateInfo", "DepInfo", "StdLibInfo", "TestCrateInfo")
+load(":providers.bzl", "CrateGroupInfo", "CrateInfo", "DepInfo", "DepVariantInfo", "StdLibInfo", "TestCrateInfo")
# This constant only represents the default value for attributes and macros
# defined in `rules_rust`. Like any attribute public attribute, it can be
@@ -59,6 +59,7 @@
create_crate_info = _create_crate_info,
crate_info = CrateInfo,
dep_info = DepInfo,
+ dep_variant_info = DepVariantInfo,
stdlib_info = StdLibInfo,
test_crate_info = TestCrateInfo,
crate_group_info = CrateGroupInfo,
diff --git a/rust/private/providers.bzl b/rust/private/providers.bzl
index fbcbcec..b26cc67 100644
--- a/rust/private/providers.bzl
+++ b/rust/private/providers.bzl
@@ -60,8 +60,7 @@
CrateGroupInfo = provider(
doc = "A provider containing a group of crates.",
fields = {
- "crate_infos": "List[CrateInfo]",
- "dep_infos": "List[DepInfo]",
+ "dep_variant_infos": "depset[DepVariantInfo]: Dependency information from all crates in the group.",
},
)
diff --git a/rust/private/rust.bzl b/rust/private/rust.bzl
index 166d896..88b98d1 100644
--- a/rust/private/rust.bzl
+++ b/rust/private/rust.bzl
@@ -16,6 +16,7 @@
load("@bazel_skylib//lib:paths.bzl", "paths")
load("//rust/private:common.bzl", "rust_common")
+load("//rust/private:providers.bzl", "BuildInfo")
load("//rust/private:rustc.bzl", "rustc_compile_action")
load(
"//rust/private:utils.bzl",
@@ -491,17 +492,21 @@
return providers
def _rust_library_group_impl(ctx):
- crate_infos = []
- dep_infos = []
+ dep_variant_infos = []
+ dep_variant_transitive_infos = []
runfiles = []
for dep in ctx.attr.deps:
if rust_common.crate_info in dep:
- crate_infos.append(dep[rust_common.crate_info])
- dep_infos.append(dep[rust_common.dep_info])
+ dep_variant_infos.append(rust_common.dep_variant_info(
+ crate_info = dep[rust_common.crate_info] if rust_common.crate_info in dep else None,
+ dep_info = dep[rust_common.dep_info] if rust_common.crate_info in dep else None,
+ build_info = dep[BuildInfo] if BuildInfo in dep else None,
+ cc_info = dep[CcInfo] if CcInfo in dep else None,
+ crate_group_info = None,
+ ))
elif rust_common.crate_group_info in dep:
- crate_infos.extend(dep[rust_common.crate_group_info].crate_infos)
- dep_infos.extend(dep[rust_common.crate_group_info].dep_infos)
+ dep_variant_transitive_infos.append(dep[rust_common.crate_group_info].dep_variant_infos)
else:
fail("crate_group_info targets can only depend on rust_library or rust_library_group targets.")
@@ -510,8 +515,7 @@
return [
rust_common.crate_group_info(
- crate_infos = crate_infos,
- dep_infos = dep_infos,
+ dep_variant_infos = depset(dep_variant_infos, transitive = dep_variant_transitive_infos),
),
DefaultInfo(runfiles = ctx.runfiles().merge_all(runfiles)),
coverage_common.instrumented_files_info(
@@ -1422,6 +1426,7 @@
attrs = {
"deps": attr.label_list(
doc = "Other dependencies to forward through this crate group.",
+ providers = [[rust_common.crate_group_info], [rust_common.crate_info]],
),
},
doc = dedent("""\
@@ -1429,7 +1434,7 @@
Specifically, the following are equivalent:
- ```rust
+ ```starlark
rust_library_group(
name = "crate_group",
deps = [
@@ -1447,7 +1452,7 @@
and
- ```rust
+ ```starlark
rust_library(
name = "foobar",
deps = [
diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl
index 6d4c90a..841d5a5 100644
--- a/rust/private/rustc.bzl
+++ b/rust/private/rustc.bzl
@@ -231,12 +231,10 @@
crate_deps.append(dep)
if crate_group:
- if len(crate_group.crate_infos) != len(crate_group.dep_infos):
- fail("CrateGroupInfo must have len(crate_infos) == len(dep_infos)")
- for (crate_info, dep_info) in zip(crate_group.crate_infos, crate_group.dep_infos):
+ for dep_variant_info in crate_group.dep_variant_infos.to_list():
crate_deps.append(struct(
- crate_info = crate_info,
- dep_info = dep_info,
+ crate_info = dep_variant_info.crate_info,
+ dep_info = dep_variant_info.dep_info,
))
aliases = {k.label: v for k, v in aliases.items()}
diff --git a/rust/rust_common.bzl b/rust/rust_common.bzl
index 155c1f1..a895f5b 100644
--- a/rust/rust_common.bzl
+++ b/rust/rust_common.bzl
@@ -14,8 +14,19 @@
"""Module with Rust definitions required to write custom Rust rules."""
-load("//rust/private:providers.bzl", _BuildInfo = "BuildInfo", _ClippyInfo = "ClippyInfo", _CrateInfo = "CrateInfo")
+load(
+ "//rust/private:providers.bzl",
+ _BuildInfo = "BuildInfo",
+ _ClippyInfo = "ClippyInfo",
+ _CrateInfo = "CrateInfo",
+ _DepInfo = "DepInfo",
+ _DepVariantInfo = "DepVariantInfo",
+ _TestCrateInfo = "TestCrateInfo",
+)
BuildInfo = _BuildInfo
-CrateInfo = _CrateInfo
ClippyInfo = _ClippyInfo
+CrateInfo = _CrateInfo
+DepInfo = _DepInfo
+DepVariantInfo = _DepVariantInfo
+TestCrateInfo = _TestCrateInfo