Skip to content

Commit 72cc0aa

Browse files
authored
propagate additional inputs from native dependencies (#858)
* propagate additional native inputs * adapt test for buildbots * update test * only flatten additional inputs for bin crate type * use crate_info.type instead of crate_type arg * add cdylib and dylib to the types that get additional deps + tests
1 parent e10eff7 commit 72cc0aa

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

rust/private/rustc.bzl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,18 @@ def collect_inputs(
290290

291291
linker_depset = cc_toolchain.all_files
292292

293+
# Pass linker additional inputs (e.g., linker scripts) only for linking-like
294+
# actions, not for example where the output is rlib. This avoids quadratic
295+
# behavior where transitive noncrates are flattened on each transitive
296+
# rust_library dependency.
297+
additional_transitive_inputs = []
298+
if crate_info.type in ("bin", "dylib", "cdylib"):
299+
additional_transitive_inputs = [
300+
additional_input
301+
for linker_input in dep_info.transitive_noncrates.to_list()
302+
for additional_input in linker_input.additional_inputs
303+
]
304+
293305
compile_inputs = depset(
294306
getattr(files, "data", []) +
295307
[toolchain.rustc] +
@@ -303,6 +315,7 @@ def collect_inputs(
303315
linker_depset,
304316
crate_info.srcs,
305317
dep_info.transitive_libs,
318+
depset(additional_transitive_inputs),
306319
crate_info.compile_data,
307320
],
308321
)

test/unit/native_deps/dynamic.lds

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{
2+
};

test/unit/native_deps/native_deps_test.bzl

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,64 @@ def _linkopts_test():
293293
target_under_test = ":linkopts_rust_bin",
294294
)
295295

296+
def _check_additional_deps_test_impl(ctx, expect_additional_deps):
297+
env = analysistest.begin(ctx)
298+
tut = analysistest.target_under_test(env)
299+
action = tut.actions[0]
300+
additional_inputs = [inp.basename for inp in action.inputs.to_list()]
301+
asserts.equals(env, "dynamic.lds" in additional_inputs, expect_additional_deps)
302+
return analysistest.end(env)
303+
304+
def _has_additional_deps_test_impl(ctx):
305+
return _check_additional_deps_test_impl(ctx, expect_additional_deps = True)
306+
307+
def _has_no_additional_deps_test_impl(ctx):
308+
return _check_additional_deps_test_impl(ctx, expect_additional_deps = False)
309+
310+
has_additional_deps_test = analysistest.make(_has_additional_deps_test_impl)
311+
has_no_additional_deps_test = analysistest.make(_has_no_additional_deps_test_impl)
312+
313+
def _additional_deps_test():
314+
rust_binary(
315+
name = "bin_additional_deps",
316+
srcs = ["bin_using_native_dep.rs"],
317+
deps = [":additional_deps_cc"],
318+
)
319+
320+
rust_shared_library(
321+
name = "cdylib_additional_deps",
322+
srcs = ["lib_using_native_dep.rs"],
323+
deps = [":additional_deps_cc"],
324+
)
325+
326+
rust_library(
327+
name = "lib_additional_deps",
328+
srcs = ["lib_using_native_dep.rs"],
329+
deps = ["additional_deps_cc"],
330+
)
331+
332+
cc_library(
333+
name = "additional_deps_cc",
334+
srcs = ["native_dep.cc"],
335+
linkopts = ["-L$(location :dynamic.lds)"],
336+
deps = [":dynamic.lds"],
337+
)
338+
339+
has_additional_deps_test(
340+
name = "bin_has_additional_deps_test",
341+
target_under_test = ":bin_additional_deps",
342+
)
343+
344+
has_additional_deps_test(
345+
name = "cdylib_has_additional_deps_test",
346+
target_under_test = ":cdylib_additional_deps",
347+
)
348+
349+
has_no_additional_deps_test(
350+
name = "lib_has_no_additional_deps_test",
351+
target_under_test = ":lib_additional_deps",
352+
)
353+
296354
def native_deps_test_suite(name):
297355
"""Entry-point macro called from the BUILD file.
298356
@@ -301,6 +359,7 @@ def native_deps_test_suite(name):
301359
"""
302360
_native_dep_test()
303361
_linkopts_test()
362+
_additional_deps_test()
304363

305364
native.test_suite(
306365
name = name,
@@ -313,5 +372,8 @@ def native_deps_test_suite(name):
313372
":bin_has_native_dep_and_alwayslink_test",
314373
":cdylib_has_native_dep_and_alwayslink_test",
315374
":native_linkopts_propagate_test",
375+
":bin_has_additional_deps_test",
376+
":cdylib_has_additional_deps_test",
377+
":lib_has_no_additional_deps_test",
316378
],
317379
)

0 commit comments

Comments
 (0)