Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

propagate additional inputs from native dependencies #858

Merged
merged 9 commits into from
Jul 30, 2021
13 changes: 13 additions & 0 deletions rust/private/rustc.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,18 @@ def collect_inputs(

linker_depset = cc_toolchain.all_files

# Pass linker additional inputs (e.g., linker scripts) only for linking-like
# actions, not for example where the output is rlib. This avoids quadratic
# behavior where transitive noncrates are flattened on each transitive
# rust_library dependency.
additional_transitive_inputs = []
if crate_info.type in ("bin", "dylib", "cdylib"):
additional_transitive_inputs = [
additional_input
for linker_input in dep_info.transitive_noncrates.to_list()
for additional_input in linker_input.additional_inputs
]

compile_inputs = depset(
getattr(files, "data", []) +
[toolchain.rustc] +
Expand All @@ -303,6 +315,7 @@ def collect_inputs(
linker_depset,
crate_info.srcs,
dep_info.transitive_libs,
depset(additional_transitive_inputs),
crate_info.compile_data,
],
)
Expand Down
2 changes: 2 additions & 0 deletions test/unit/native_deps/dynamic.lds
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{
};
62 changes: 62 additions & 0 deletions test/unit/native_deps/native_deps_test.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,64 @@ def _linkopts_test():
target_under_test = ":linkopts_rust_bin",
)

def _check_additional_deps_test_impl(ctx, expect_additional_deps):
env = analysistest.begin(ctx)
tut = analysistest.target_under_test(env)
action = tut.actions[0]
additional_inputs = [inp.basename for inp in action.inputs.to_list()]
asserts.equals(env, "dynamic.lds" in additional_inputs, expect_additional_deps)
return analysistest.end(env)

def _has_additional_deps_test_impl(ctx):
return _check_additional_deps_test_impl(ctx, expect_additional_deps = True)

def _has_no_additional_deps_test_impl(ctx):
return _check_additional_deps_test_impl(ctx, expect_additional_deps = False)

has_additional_deps_test = analysistest.make(_has_additional_deps_test_impl)
has_no_additional_deps_test = analysistest.make(_has_no_additional_deps_test_impl)

def _additional_deps_test():
rust_binary(
name = "bin_additional_deps",
srcs = ["bin_using_native_dep.rs"],
deps = [":additional_deps_cc"],
)

rust_shared_library(
name = "cdylib_additional_deps",
srcs = ["lib_using_native_dep.rs"],
deps = [":additional_deps_cc"],
)

rust_library(
name = "lib_additional_deps",
srcs = ["lib_using_native_dep.rs"],
deps = ["additional_deps_cc"],
)

cc_library(
name = "additional_deps_cc",
srcs = ["native_dep.cc"],
linkopts = ["-L$(location :dynamic.lds)"],
deps = [":dynamic.lds"],
)

has_additional_deps_test(
name = "bin_has_additional_deps_test",
target_under_test = ":bin_additional_deps",
)

has_additional_deps_test(
name = "cdylib_has_additional_deps_test",
target_under_test = ":cdylib_additional_deps",
)

has_no_additional_deps_test(
name = "lib_has_no_additional_deps_test",
target_under_test = ":lib_additional_deps",
)

def native_deps_test_suite(name):
"""Entry-point macro called from the BUILD file.

Expand All @@ -301,6 +359,7 @@ def native_deps_test_suite(name):
"""
_native_dep_test()
_linkopts_test()
_additional_deps_test()

native.test_suite(
name = name,
Expand All @@ -313,5 +372,8 @@ def native_deps_test_suite(name):
":bin_has_native_dep_and_alwayslink_test",
":cdylib_has_native_dep_and_alwayslink_test",
":native_linkopts_propagate_test",
":bin_has_additional_deps_test",
":cdylib_has_additional_deps_test",
":lib_has_no_additional_deps_test",
],
)