From 68a2671c9659704a14bbaf352d50a48e2083c7ad Mon Sep 17 00:00:00 2001 From: Krasimir Georgiev Date: Wed, 28 Jul 2021 11:48:08 +0200 Subject: [PATCH 1/6] propagate additional native inputs --- rust/private/rustc.bzl | 7 +++++ test/unit/native_deps/dynamic.lds | 2 ++ test/unit/native_deps/native_deps_test.bzl | 30 ++++++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 test/unit/native_deps/dynamic.lds diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl index ac0e6ff4b8..c699035150 100644 --- a/rust/private/rustc.bzl +++ b/rust/private/rustc.bzl @@ -290,6 +290,12 @@ def collect_inputs( linker_depset = cc_toolchain.all_files + additional_transitive_inputs = depset([ + 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] + @@ -303,6 +309,7 @@ def collect_inputs( linker_depset, crate_info.srcs, dep_info.transitive_libs, + additional_transitive_inputs, crate_info.compile_data, ], ) diff --git a/test/unit/native_deps/dynamic.lds b/test/unit/native_deps/dynamic.lds new file mode 100644 index 0000000000..022df8c4d7 --- /dev/null +++ b/test/unit/native_deps/dynamic.lds @@ -0,0 +1,2 @@ +{ +}; diff --git a/test/unit/native_deps/native_deps_test.bzl b/test/unit/native_deps/native_deps_test.bzl index 7983685bb5..9900788fdb 100644 --- a/test/unit/native_deps/native_deps_test.bzl +++ b/test/unit/native_deps/native_deps_test.bzl @@ -293,6 +293,34 @@ def _linkopts_test(): target_under_test = ":linkopts_rust_bin", ) +def _additional_deps_test_impl(ctx): + 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.true(env, "dynamic.lds" in additional_inputs) + return analysistest.end(env) + +additional_deps_test = analysistest.make(_additional_deps_test_impl) + +def _additional_deps_test(): + rust_binary( + name = "additional_deps_rust_bin", + srcs = ["bin_using_native_dep.rs"], + deps = [":additional_deps_cc"], + ) + + cc_library( + name = "additional_deps_cc", + linkopts = ["-Wl,--dynamic-list=$(location :dynamic.lds)"], + deps = [":dynamic.lds"], + ) + + additional_deps_test( + name = "additional_deps_test", + target_under_test = ":additional_deps_rust_bin", + ) + def native_deps_test_suite(name): """Entry-point macro called from the BUILD file. @@ -301,6 +329,7 @@ def native_deps_test_suite(name): """ _native_dep_test() _linkopts_test() + _additional_deps_test() native.test_suite( name = name, @@ -313,5 +342,6 @@ def native_deps_test_suite(name): ":bin_has_native_dep_and_alwayslink_test", ":cdylib_has_native_dep_and_alwayslink_test", ":native_linkopts_propagate_test", + ":additional_deps_test", ], ) From 229bd36a84441f0f85864d88c227f41799058302 Mon Sep 17 00:00:00 2001 From: Krasimir Georgiev Date: Wed, 28 Jul 2021 12:04:14 +0200 Subject: [PATCH 2/6] adapt test for buildbots --- test/unit/native_deps/native_deps_test.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/native_deps/native_deps_test.bzl b/test/unit/native_deps/native_deps_test.bzl index 9900788fdb..9a6d30c773 100644 --- a/test/unit/native_deps/native_deps_test.bzl +++ b/test/unit/native_deps/native_deps_test.bzl @@ -312,7 +312,7 @@ def _additional_deps_test(): cc_library( name = "additional_deps_cc", - linkopts = ["-Wl,--dynamic-list=$(location :dynamic.lds)"], + linkopts = ["-L$(location :dynamic.lds)"], deps = [":dynamic.lds"], ) From 16c4b8541800f21af528cc9ee4f321048bf24c24 Mon Sep 17 00:00:00 2001 From: Krasimir Georgiev Date: Wed, 28 Jul 2021 12:13:49 +0200 Subject: [PATCH 3/6] update test --- test/unit/native_deps/native_deps_test.bzl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unit/native_deps/native_deps_test.bzl b/test/unit/native_deps/native_deps_test.bzl index 9a6d30c773..c4d026083b 100644 --- a/test/unit/native_deps/native_deps_test.bzl +++ b/test/unit/native_deps/native_deps_test.bzl @@ -312,6 +312,7 @@ def _additional_deps_test(): cc_library( name = "additional_deps_cc", + srcs = ["native_dep.cc"], linkopts = ["-L$(location :dynamic.lds)"], deps = [":dynamic.lds"], ) From efd88b67b40ac08686a0b416f6605c4df3e97084 Mon Sep 17 00:00:00 2001 From: Krasimir Georgiev Date: Wed, 28 Jul 2021 14:38:17 +0200 Subject: [PATCH 4/6] only flatten additional inputs for bin crate type --- rust/private/clippy.bzl | 1 + rust/private/rustc.bzl | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/rust/private/clippy.bzl b/rust/private/clippy.bzl index a0cdd70193..847bc9523c 100644 --- a/rust/private/clippy.bzl +++ b/rust/private/clippy.bzl @@ -70,6 +70,7 @@ def _clippy_aspect_impl(target, ctx): ctx.rule.files, toolchain, cc_toolchain, + crate_type, crate_info, dep_info, build_info, diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl index 6831082610..64cae858a1 100644 --- a/rust/private/rustc.bzl +++ b/rust/private/rustc.bzl @@ -268,6 +268,7 @@ def collect_inputs( files, toolchain, cc_toolchain, + crate_type, crate_info, dep_info, build_info): @@ -279,6 +280,7 @@ def collect_inputs( files (list): A list of all inputs (`ctx.files`). toolchain (rust_toolchain): The current `rust_toolchain`. cc_toolchain (CcToolchainInfo): The current `cc_toolchain`. + crate_type (str): Crate type of the current target. crate_info (CrateInfo): The Crate information of the crate to process build scripts for. dep_info (DepInfo): The target Crate's dependency information. build_info (BuildInfo): The target Crate's build settings. @@ -290,11 +292,17 @@ def collect_inputs( linker_depset = cc_toolchain.all_files - additional_transitive_inputs = depset([ - additional_input - for linker_input in dep_info.transitive_noncrates.to_list() - for additional_input in linker_input.additional_inputs - ]) + # 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_type == "bin": + 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", []) + @@ -309,7 +317,7 @@ def collect_inputs( linker_depset, crate_info.srcs, dep_info.transitive_libs, - additional_transitive_inputs, + depset(additional_transitive_inputs), crate_info.compile_data, ], ) @@ -562,6 +570,7 @@ def rustc_compile_action( ctx.files, toolchain, cc_toolchain, + crate_type, crate_info, dep_info, build_info, From ab9834fa05870f9d669b75e725aeeaeb9f71d60e Mon Sep 17 00:00:00 2001 From: Krasimir Georgiev Date: Fri, 30 Jul 2021 12:37:09 +0200 Subject: [PATCH 5/6] use crate_info.type instead of crate_type arg --- rust/private/clippy.bzl | 1 - rust/private/rustc.bzl | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/rust/private/clippy.bzl b/rust/private/clippy.bzl index 847bc9523c..a0cdd70193 100644 --- a/rust/private/clippy.bzl +++ b/rust/private/clippy.bzl @@ -70,7 +70,6 @@ def _clippy_aspect_impl(target, ctx): ctx.rule.files, toolchain, cc_toolchain, - crate_type, crate_info, dep_info, build_info, diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl index 64cae858a1..6b244e8966 100644 --- a/rust/private/rustc.bzl +++ b/rust/private/rustc.bzl @@ -268,7 +268,6 @@ def collect_inputs( files, toolchain, cc_toolchain, - crate_type, crate_info, dep_info, build_info): @@ -280,7 +279,6 @@ def collect_inputs( files (list): A list of all inputs (`ctx.files`). toolchain (rust_toolchain): The current `rust_toolchain`. cc_toolchain (CcToolchainInfo): The current `cc_toolchain`. - crate_type (str): Crate type of the current target. crate_info (CrateInfo): The Crate information of the crate to process build scripts for. dep_info (DepInfo): The target Crate's dependency information. build_info (BuildInfo): The target Crate's build settings. @@ -297,7 +295,7 @@ def collect_inputs( # behavior where transitive noncrates are flattened on each transitive # rust_library dependency. additional_transitive_inputs = [] - if crate_type == "bin": + if crate_info.type == "bin": additional_transitive_inputs = [ additional_input for linker_input in dep_info.transitive_noncrates.to_list() @@ -570,7 +568,6 @@ def rustc_compile_action( ctx.files, toolchain, cc_toolchain, - crate_type, crate_info, dep_info, build_info, From 5aa2795cab44699eeb4c492eda5bd6e1e80116cc Mon Sep 17 00:00:00 2001 From: Krasimir Georgiev Date: Fri, 30 Jul 2021 13:17:46 +0200 Subject: [PATCH 6/6] add cdylib and dylib to the types that get additional deps + tests --- rust/private/rustc.bzl | 2 +- test/unit/native_deps/native_deps_test.bzl | 47 ++++++++++++++++++---- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl index 6b244e8966..e321812d9c 100644 --- a/rust/private/rustc.bzl +++ b/rust/private/rustc.bzl @@ -295,7 +295,7 @@ def collect_inputs( # behavior where transitive noncrates are flattened on each transitive # rust_library dependency. additional_transitive_inputs = [] - if crate_info.type == "bin": + if crate_info.type in ("bin", "dylib", "cdylib"): additional_transitive_inputs = [ additional_input for linker_input in dep_info.transitive_noncrates.to_list() diff --git a/test/unit/native_deps/native_deps_test.bzl b/test/unit/native_deps/native_deps_test.bzl index c4d026083b..b320d34ea1 100644 --- a/test/unit/native_deps/native_deps_test.bzl +++ b/test/unit/native_deps/native_deps_test.bzl @@ -293,23 +293,42 @@ def _linkopts_test(): target_under_test = ":linkopts_rust_bin", ) -def _additional_deps_test_impl(ctx): +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.true(env, "dynamic.lds" in additional_inputs) + asserts.equals(env, "dynamic.lds" in additional_inputs, expect_additional_deps) return analysistest.end(env) -additional_deps_test = analysistest.make(_additional_deps_test_impl) +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 = "additional_deps_rust_bin", + 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"], @@ -317,9 +336,19 @@ def _additional_deps_test(): deps = [":dynamic.lds"], ) - additional_deps_test( - name = "additional_deps_test", - target_under_test = ":additional_deps_rust_bin", + 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): @@ -343,6 +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", - ":additional_deps_test", + ":bin_has_additional_deps_test", + ":cdylib_has_additional_deps_test", + ":lib_has_no_additional_deps_test", ], )