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 @@ +