Skip to content

Commit

Permalink
Add an --incompatible_remove_transitive_libs_from_dep_info flag (#1057)
Browse files Browse the repository at this point in the history
As per #1051.
  • Loading branch information
scentini committed Dec 6, 2021
1 parent cbfffbc commit 23a4631
Show file tree
Hide file tree
Showing 12 changed files with 133 additions and 12 deletions.
2 changes: 1 addition & 1 deletion docs/flatten.md
Original file line number Diff line number Diff line change
Expand Up @@ -1395,7 +1395,7 @@ A provider containing information about a Crate's dependencies.
| <a id="DepInfo-transitive_build_infos"></a>transitive_build_infos | depset[BuildInfo] |
| <a id="DepInfo-transitive_crate_outputs"></a>transitive_crate_outputs | depset[File]: All transitive crate outputs. |
| <a id="DepInfo-transitive_crates"></a>transitive_crates | depset[CrateInfo] |
| <a id="DepInfo-transitive_libs"></a>transitive_libs | List[File]: All transitive dependencies, not filtered by type. |
| <a id="DepInfo-transitive_libs"></a>transitive_libs | List[File]: (Deprecated, see https://github.com/bazelbuild/rules_rust/issues/1051) All transitive dependencies, not filtered by type. |
| <a id="DepInfo-transitive_noncrates"></a>transitive_noncrates | depset[LinkerInput]: All transitive dependencies that aren't crates. |


Expand Down
2 changes: 1 addition & 1 deletion docs/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ A provider containing information about a Crate's dependencies.
| <a id="DepInfo-transitive_build_infos"></a>transitive_build_infos | depset[BuildInfo] |
| <a id="DepInfo-transitive_crate_outputs"></a>transitive_crate_outputs | depset[File]: All transitive crate outputs. |
| <a id="DepInfo-transitive_crates"></a>transitive_crates | depset[CrateInfo] |
| <a id="DepInfo-transitive_libs"></a>transitive_libs | List[File]: All transitive dependencies, not filtered by type. |
| <a id="DepInfo-transitive_libs"></a>transitive_libs | List[File]: (Deprecated, see https://github.com/bazelbuild/rules_rust/issues/1051) All transitive dependencies, not filtered by type. |
| <a id="DepInfo-transitive_noncrates"></a>transitive_noncrates | depset[LinkerInput]: All transitive dependencies that aren't crates. |


Expand Down
1 change: 1 addition & 0 deletions rust/private/clippy.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
3 changes: 2 additions & 1 deletion rust/private/providers.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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.",
},
)
Expand Down
33 changes: 24 additions & 9 deletions rust/private/rustc.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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:
Expand Down Expand Up @@ -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, " +
Expand All @@ -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(
Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions rust/private/rustdoc.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
6 changes: 6 additions & 0 deletions rust/settings/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -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"]),
Expand Down
5 changes: 5 additions & 0 deletions rust/toolchain.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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]

Expand Down Expand Up @@ -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",
Expand Down
8 changes: 8 additions & 0 deletions test/unit/deprecate_transitive_libs_in_dep_info/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -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",
)
1 change: 1 addition & 0 deletions test/unit/deprecate_transitive_libs_in_dep_info/bar.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Original file line number Diff line number Diff line change
@@ -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",
],
)
1 change: 1 addition & 0 deletions test/unit/deprecate_transitive_libs_in_dep_info/foo.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

0 comments on commit 23a4631

Please sign in to comment.