diff --git a/docs/flatten.md b/docs/flatten.md
index 8964a562eb..e579586179 100644
--- a/docs/flatten.md
+++ b/docs/flatten.md
@@ -1395,7 +1395,7 @@ A provider containing information about a Crate's dependencies.
| transitive_build_infos | depset[BuildInfo] |
| transitive_crate_outputs | depset[File]: All transitive crate outputs. |
| transitive_crates | depset[CrateInfo] |
-| transitive_libs | List[File]: All transitive dependencies, not filtered by type. |
+| transitive_libs | List[File]: (Deprecated, see https://github.com/bazelbuild/rules_rust/issues/1051) All transitive dependencies, not filtered by type. |
| transitive_noncrates | depset[LinkerInput]: All transitive dependencies that aren't crates. |
diff --git a/docs/providers.md b/docs/providers.md
index cb5ba1f635..5408554eb5 100644
--- a/docs/providers.md
+++ b/docs/providers.md
@@ -58,7 +58,7 @@ A provider containing information about a Crate's dependencies.
| transitive_build_infos | depset[BuildInfo] |
| transitive_crate_outputs | depset[File]: All transitive crate outputs. |
| transitive_crates | depset[CrateInfo] |
-| transitive_libs | List[File]: All transitive dependencies, not filtered by type. |
+| transitive_libs | List[File]: (Deprecated, see https://github.com/bazelbuild/rules_rust/issues/1051) All transitive dependencies, not filtered by type. |
| transitive_noncrates | depset[LinkerInput]: All transitive dependencies that aren't crates. |
diff --git a/rust/private/clippy.bzl b/rust/private/clippy.bzl
index 4b6cafef8f..251398dbe2 100644
--- a/rust/private/clippy.bzl
+++ b/rust/private/clippy.bzl
@@ -71,6 +71,7 @@ def _clippy_aspect_impl(target, ctx):
# Clippy doesn't need to invoke transitive linking, therefore doesn't need linkstamps.
are_linkstamps_supported = False,
make_rust_providers_target_independent = toolchain._incompatible_make_rust_providers_target_independent,
+ remove_transitive_libs_from_dep_info = toolchain._incompatible_remove_transitive_libs_from_dep_info,
)
compile_inputs, out_dir, build_env_files, build_flags_files, linkstamp_outs = collect_inputs(
diff --git a/rust/private/providers.bzl b/rust/private/providers.bzl
index 390551f381..cf49c4db3e 100644
--- a/rust/private/providers.bzl
+++ b/rust/private/providers.bzl
@@ -48,7 +48,8 @@ DepInfo = provider(
"transitive_build_infos": "depset[BuildInfo]",
"transitive_crate_outputs": "depset[File]: All transitive crate outputs.",
"transitive_crates": "depset[CrateInfo]",
- "transitive_libs": "List[File]: All transitive dependencies, not filtered by type.",
+ "transitive_libs": "List[File]: (Deprecated, see https://github.com/bazelbuild/rules_rust/issues/1051) " +
+ "All transitive dependencies, not filtered by type.",
"transitive_noncrates": "depset[LinkerInput]: All transitive dependencies that aren't crates.",
},
)
diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl
index 86c741051e..5eb7c2de9e 100644
--- a/rust/private/rustc.bzl
+++ b/rust/private/rustc.bzl
@@ -112,7 +112,14 @@ def _are_linkstamps_supported(feature_configuration, has_grep_includes):
# attribute is required for compiling linkstamps.
has_grep_includes)
-def collect_deps(label, deps, proc_macro_deps, aliases, are_linkstamps_supported = False, make_rust_providers_target_independent = False):
+def collect_deps(
+ label,
+ deps,
+ proc_macro_deps,
+ aliases,
+ are_linkstamps_supported = False,
+ make_rust_providers_target_independent = False,
+ remove_transitive_libs_from_dep_info = False):
"""Walks through dependencies and collects the transitive dependencies.
Args:
@@ -123,6 +130,8 @@ def collect_deps(label, deps, proc_macro_deps, aliases, are_linkstamps_supported
are_linkstamps_supported (bool): Whether the current rule and the toolchain support building linkstamps.
make_rust_providers_target_independent (bool): Whether
--incompatible_make_rust_providers_target_independent has been flipped.
+ remove_transitive_libs_from_dep_info (bool): Whether
+ --incompatible_remove_transitive_libs_from_dep_info has been flipped.
Returns:
tuple: Returns a tuple of:
@@ -175,14 +184,16 @@ def collect_deps(label, deps, proc_macro_deps, aliases, are_linkstamps_supported
),
)
transitive_noncrates.append(dep_info.transitive_noncrates)
- transitive_noncrate_libs.append(dep_info.transitive_libs)
+ if not remove_transitive_libs_from_dep_info:
+ transitive_noncrate_libs.append(dep_info.transitive_libs)
transitive_build_infos.append(dep_info.transitive_build_infos)
elif cc_info:
# This dependency is a cc_library
- transitive_noncrate_libs.append(depset(
- _collect_libs_from_linker_inputs(cc_info.linking_context.linker_inputs.to_list()),
- ))
transitive_noncrates.append(cc_info.linking_context.linker_inputs)
+ if not remove_transitive_libs_from_dep_info:
+ transitive_noncrate_libs.append(depset(
+ _collect_libs_from_linker_inputs(cc_info.linking_context.linker_inputs.to_list()),
+ ))
elif dep_build_info:
if build_info:
fail("Several deps are providing build information, " +
@@ -194,10 +205,12 @@ def collect_deps(label, deps, proc_macro_deps, aliases, are_linkstamps_supported
"targets.")
transitive_crates_depset = depset(transitive = transitive_crates)
- transitive_libs = depset(
- [c.output for c in transitive_crates_depset.to_list()],
- transitive = transitive_noncrate_libs,
- )
+ transitive_libs = depset([])
+ if not remove_transitive_libs_from_dep_info:
+ transitive_libs = depset(
+ [c.output for c in transitive_crates_depset.to_list()],
+ transitive = transitive_noncrate_libs,
+ )
return (
rust_common.dep_info(
@@ -719,6 +732,7 @@ def rustc_compile_action(
cc_toolchain, feature_configuration = find_cc_toolchain(ctx)
make_rust_providers_target_independent = toolchain._incompatible_make_rust_providers_target_independent
+ remove_transitive_libs_from_dep_info = toolchain._incompatible_remove_transitive_libs_from_dep_info
dep_info, build_info, linkstamps = collect_deps(
label = ctx.label,
@@ -730,6 +744,7 @@ def rustc_compile_action(
has_grep_includes = hasattr(ctx.attr, "_grep_includes"),
),
make_rust_providers_target_independent = make_rust_providers_target_independent,
+ remove_transitive_libs_from_dep_info = remove_transitive_libs_from_dep_info,
)
# Determine if the build is currently running with --stamp
diff --git a/rust/private/rustdoc.bzl b/rust/private/rustdoc.bzl
index eab9ced17c..295b7ea1b4 100644
--- a/rust/private/rustdoc.bzl
+++ b/rust/private/rustdoc.bzl
@@ -76,6 +76,7 @@ def rustdoc_compile_action(
deps = crate_info.deps,
proc_macro_deps = crate_info.proc_macro_deps,
aliases = crate_info.aliases,
+ remove_transitive_libs_from_dep_info = toolchain._incompatible_remove_transitive_libs_from_dep_info,
)
compile_inputs, out_dir, build_env_files, build_flags_files, linkstamp_outs = collect_inputs(
diff --git a/rust/settings/BUILD.bazel b/rust/settings/BUILD.bazel
index 0def88504b..b583bc0e5d 100644
--- a/rust/settings/BUILD.bazel
+++ b/rust/settings/BUILD.bazel
@@ -9,6 +9,12 @@ incompatible_flag(
issue = "https://github.com/bazelbuild/rules_rust/issues/966",
)
+incompatible_flag(
+ name = "incompatible_remove_transitive_libs_from_dep_info",
+ build_setting_default = False,
+ issue = "https://github.com/bazelbuild/rules_rust/issues/1051",
+)
+
bzl_library(
name = "rules",
srcs = glob(["**/*.bzl"]),
diff --git a/rust/toolchain.bzl b/rust/toolchain.bzl
index a84b52465e..b25725a54e 100644
--- a/rust/toolchain.bzl
+++ b/rust/toolchain.bzl
@@ -232,6 +232,7 @@ def _rust_toolchain_impl(ctx):
fail("Do not specify both target_triple and target_json, either use a builtin triple or provide a custom specification file.")
make_rust_providers_target_independent = ctx.attr._incompatible_make_rust_providers_target_independent[IncompatibleFlagInfo]
+ remove_transitive_libs_from_dep_info = ctx.attr._incompatible_remove_transitive_libs_from_dep_info[IncompatibleFlagInfo]
expanded_stdlib_linkflags = []
for flag in ctx.attr.stdlib_linkflags:
@@ -284,6 +285,7 @@ def _rust_toolchain_impl(ctx):
crosstool_files = ctx.files._crosstool,
libstd_and_allocator_ccinfo = _make_libstd_and_allocator_ccinfo(ctx, ctx.attr.rust_lib, ctx.attr.allocator_library),
_incompatible_make_rust_providers_target_independent = make_rust_providers_target_independent.enabled,
+ _incompatible_remove_transitive_libs_from_dep_info = remove_transitive_libs_from_dep_info.enabled,
)
return [toolchain]
@@ -399,6 +401,9 @@ rust_toolchain = rule(
"_incompatible_make_rust_providers_target_independent": attr.label(
default = "@rules_rust//rust/settings:incompatible_make_rust_providers_target_independent",
),
+ "_incompatible_remove_transitive_libs_from_dep_info": attr.label(
+ default = "@rules_rust//rust/settings:incompatible_remove_transitive_libs_from_dep_info",
+ ),
},
toolchains = [
"@bazel_tools//tools/cpp:toolchain_type",
diff --git a/test/unit/deprecate_transitive_libs_in_dep_info/BUILD.bazel b/test/unit/deprecate_transitive_libs_in_dep_info/BUILD.bazel
new file mode 100644
index 0000000000..8cfd70409f
--- /dev/null
+++ b/test/unit/deprecate_transitive_libs_in_dep_info/BUILD.bazel
@@ -0,0 +1,8 @@
+load(
+ ":deprecate_transitive_libs_in_dep_info_test.bzl",
+ "deprecate_transitive_libs_in_dep_info_test_suite",
+)
+
+deprecate_transitive_libs_in_dep_info_test_suite(
+ name = "deprecate_transitive_libs_in_dep_info_test_suite",
+)
diff --git a/test/unit/deprecate_transitive_libs_in_dep_info/bar.rs b/test/unit/deprecate_transitive_libs_in_dep_info/bar.rs
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/test/unit/deprecate_transitive_libs_in_dep_info/bar.rs
@@ -0,0 +1 @@
+
diff --git a/test/unit/deprecate_transitive_libs_in_dep_info/deprecate_transitive_libs_in_dep_info_test.bzl b/test/unit/deprecate_transitive_libs_in_dep_info/deprecate_transitive_libs_in_dep_info_test.bzl
new file mode 100644
index 0000000000..d4750fcd37
--- /dev/null
+++ b/test/unit/deprecate_transitive_libs_in_dep_info/deprecate_transitive_libs_in_dep_info_test.bzl
@@ -0,0 +1,82 @@
+"""Unittests for rust rules."""
+
+load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
+load("//rust:defs.bzl", "rust_common", "rust_library")
+
+def _transitive_libs_in_dep_info_not_deprecated_impl(ctx):
+ env = analysistest.begin(ctx)
+ tut = analysistest.target_under_test(env)
+ transitive_libs = tut[rust_common.dep_info].transitive_libs.to_list()
+
+ asserts.true(
+ env,
+ len(transitive_libs) > 0,
+ "Expected DepInfo.transitive_libs to not be empty",
+ )
+
+ return analysistest.end(env)
+
+def _transitive_libs_in_dep_info_deprecated_impl(ctx):
+ env = analysistest.begin(ctx)
+ tut = analysistest.target_under_test(env)
+ transitive_libs = tut[rust_common.dep_info].transitive_libs.to_list()
+
+ asserts.true(
+ env,
+ len(transitive_libs) == 0,
+ "Expected DepInfo.transitive_libs to be empty, got {}".format(transitive_libs),
+ )
+
+ return analysistest.end(env)
+
+transitive_libs_in_dep_info_not_deprecated_test = analysistest.make(
+ _transitive_libs_in_dep_info_not_deprecated_impl,
+ config_settings = {
+ "@//rust/settings:incompatible_remove_transitive_libs_from_dep_info": False,
+ },
+)
+
+transitive_libs_in_dep_info_deprecated_test = analysistest.make(
+ _transitive_libs_in_dep_info_deprecated_impl,
+ config_settings = {
+ "@//rust/settings:incompatible_remove_transitive_libs_from_dep_info": True,
+ },
+)
+
+def _transitive_libs_in_dep_info_test():
+ rust_library(
+ name = "foo",
+ srcs = ["foo.rs"],
+ deps = [":bar"],
+ )
+
+ rust_library(
+ name = "bar",
+ srcs = ["bar.rs"],
+ )
+
+ transitive_libs_in_dep_info_not_deprecated_test(
+ name = "transitive_libs_in_dep_info_not_deprecated_test",
+ target_under_test = ":foo",
+ )
+
+ transitive_libs_in_dep_info_deprecated_test(
+ name = "transitive_libs_in_dep_info_deprecated_test",
+ target_under_test = ":foo",
+ )
+
+def deprecate_transitive_libs_in_dep_info_test_suite(name):
+ """Entry-point macro called from the BUILD file.
+
+ Args:
+ name: Name of the macro.
+ """
+ _transitive_libs_in_dep_info_test()
+
+ native.test_suite(
+ name = name,
+ tests = [
+ ":transitive_libs_in_dep_info_not_deprecated_test",
+ ":transitive_libs_in_dep_info_deprecated_test",
+ ],
+ )
diff --git a/test/unit/deprecate_transitive_libs_in_dep_info/foo.rs b/test/unit/deprecate_transitive_libs_in_dep_info/foo.rs
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/test/unit/deprecate_transitive_libs_in_dep_info/foo.rs
@@ -0,0 +1 @@
+