Skip to content

Commit 477ab18

Browse files
authored
Do not use runfiles.collect_data (#3531)
Before this PR, Rust rules merge data_runfiles of dependencies into its default_runfiles (because we used `[collect_data=True](https://bazel.build/versions/7.1.0/rules/lib/builtins/ctx#runfiles)`). `cc_libraries` put shared libraries to data_runfiles even when `cc_library` has a static library equivalent and Bazel is linking statically. This becomes problematic when packaging binaries - we end up putting unnecessary shared libraries into the package. Therefore, this PR removes the use of `collect_data`, and refactors our runfiles logic to follow the [latest guidance](https://bazel.build/versions/7.1.0/extending/rules#runfiles). While at it, I made sure to only put transitive shared libraries to runfiles when building a binary-like target (bin, staticlib, cdylib). This way we avoid depset flattenning in libraries. Added a little regression test.
1 parent f8f380f commit 477ab18

File tree

2 files changed

+35
-15
lines changed

2 files changed

+35
-15
lines changed

rust/private/rustc.bzl

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,23 +1503,33 @@ def rustc_compile_action(
15031503

15041504
experimental_use_coverage_metadata_files = toolchain._experimental_use_coverage_metadata_files
15051505

1506-
dynamic_libraries = [
1507-
library_to_link.dynamic_library
1508-
for dep in getattr(ctx.attr, "deps", [])
1509-
if CcInfo in dep
1510-
for linker_input in dep[CcInfo].linking_context.linker_inputs.to_list()
1511-
for library_to_link in linker_input.libraries
1512-
if _is_dylib(library_to_link)
1513-
]
15141506
runfiles = ctx.runfiles(
15151507
files = getattr(ctx.files, "data", []) +
1516-
([] if experimental_use_coverage_metadata_files else coverage_runfiles) +
1517-
dynamic_libraries,
1518-
collect_data = True,
1508+
([] if experimental_use_coverage_metadata_files else coverage_runfiles),
15191509
)
1520-
if getattr(ctx.attr, "crate", None):
1521-
runfiles = runfiles.merge(ctx.attr.crate[DefaultInfo].default_runfiles)
1522-
runfiles = runfiles.merge(ctx.attr.crate[DefaultInfo].data_runfiles)
1510+
transitive_runfiles = []
1511+
crate_attr = getattr(ctx.attr, "crate", None)
1512+
for runfiles_attr in (
1513+
getattr(ctx.attr, "srcs", []),
1514+
getattr(ctx.attr, "deps", []),
1515+
getattr(ctx.attr, "data", []),
1516+
[crate_attr] if crate_attr else [],
1517+
):
1518+
if not runfiles_attr:
1519+
continue
1520+
for target in runfiles_attr:
1521+
transitive_runfiles.append(target[DefaultInfo].default_runfiles)
1522+
if crate_info.type in ["bin", "cdylib", "staticlib"]:
1523+
dynamic_libraries = ctx.runfiles(files = [
1524+
library_to_link.dynamic_library
1525+
for dep in getattr(ctx.attr, "deps", [])
1526+
if CcInfo in dep
1527+
for linker_input in dep[CcInfo].linking_context.linker_inputs.to_list()
1528+
for library_to_link in linker_input.libraries
1529+
if _is_dylib(library_to_link)
1530+
])
1531+
transitive_runfiles.append(dynamic_libraries)
1532+
runfiles = runfiles.merge_all(transitive_runfiles)
15231533

15241534
# TODO: Remove after some resolution to
15251535
# https://github.com/bazelbuild/rules_rust/issues/771

test/unit/check_runfiles/check_runfiles_test.bzl

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
44
load("@rules_cc//cc:cc_binary.bzl", "cc_binary")
5+
load("@rules_cc//cc:cc_library.bzl", "cc_library")
56
load(
67
"//rust:defs.bzl",
78
"rust_binary",
@@ -17,6 +18,11 @@ def _check_runfiles_test_impl(ctx):
1718

1819
asserts.true(env, _is_in_runfiles("libbar.so", runfiles))
1920

21+
# cc_libraries put shared libs to data runfiles even when linking statically
22+
# and there is a static library alternative. We must be careful not to put
23+
# these shared libs to default runfiles.
24+
asserts.false(env, _is_in_runfiles("libtest_Sunit_Scheck_Urunfiles_Slibcc_Ulib.so", runfiles))
25+
2026
return analysistest.end(env)
2127

2228
def _is_in_runfiles(name, runfiles):
@@ -28,11 +34,15 @@ def _is_in_runfiles(name, runfiles):
2834
check_runfiles_test = analysistest.make(_check_runfiles_test_impl)
2935

3036
def _check_runfiles_test():
37+
cc_library(
38+
name = "cc_lib",
39+
srcs = ["bar.cc"],
40+
)
3141
rust_library(
3242
name = "foo_lib",
3343
srcs = ["foo.rs"],
3444
edition = "2018",
35-
deps = [":libbar.so"],
45+
deps = [":libbar.so", ":cc_lib"],
3646
)
3747

3848
rust_binary(

0 commit comments

Comments
 (0)