Skip to content

Keep transitive linkargs when linking inline rust_test. #1569

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

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions bindgen/bindgen.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,12 @@ load("//rust:defs.bzl", "rust_library")
load("//rust/private:rustc.bzl", "get_linker_and_args")

# buildifier: disable=bzl-visibility
load("//rust/private:utils.bzl", "find_cc_toolchain", "find_toolchain", "get_preferred_artifact")
load("//rust/private:utils.bzl",
"find_cc_toolchain",
"find_toolchain",
"get_preferred_artifact",
"transform_deps",
)

# TODO(hlopko): use the more robust logic from rustc.bzl also here, through a reasonable API.
def _get_libs_for_static_executable(dep):
Expand Down Expand Up @@ -133,7 +138,8 @@ def _rust_bindgen_impl(ctx):
"RUST_BACKTRACE": "1",
}
cc_toolchain, feature_configuration = find_cc_toolchain(ctx)
_, _, linker_env = get_linker_and_args(ctx, ctx.attr, cc_toolchain, feature_configuration, None)
deps = transform_deps(ctx.attr.deps)
_, _, linker_env = get_linker_and_args(ctx, deps, cc_toolchain, feature_configuration, None)
env.update(**linker_env)

# Set the dynamic linker search path so that clang uses the libstdcxx from the toolchain.
Expand Down
4 changes: 3 additions & 1 deletion cargo/cargo_build_script.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
load("@bazel_skylib//lib:paths.bzl", "paths")
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "CPP_COMPILE_ACTION_NAME", "C_COMPILE_ACTION_NAME")
load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain")
load("//rust/private:utils.bzl", "transform_deps")
load("//rust:defs.bzl", "rust_binary", "rust_common")

# buildifier: disable=bzl-visibility
Expand Down Expand Up @@ -130,7 +131,8 @@ def _build_script_impl(ctx):
# Pull in env vars which may be required for the cc_toolchain to work (e.g. on OSX, the SDK version).
# We hope that the linker env is sufficient for the whole cc_toolchain.
cc_toolchain, feature_configuration = find_cc_toolchain(ctx)
linker, link_args, linker_env = get_linker_and_args(ctx, ctx.attr, cc_toolchain, feature_configuration, None)
deps = transform_deps(ctx.attr.deps)
linker, link_args, linker_env = get_linker_and_args(ctx, deps, cc_toolchain, feature_configuration, None)
env.update(**linker_env)
env["LD"] = linker
env["LDFLAGS"] = " ".join(_pwd_flags(link_args))
Expand Down
15 changes: 8 additions & 7 deletions rust/private/rustc.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -335,12 +335,13 @@ def get_cc_user_link_flags(ctx):
"""
return ctx.fragments.cpp.linkopts

def get_linker_and_args(ctx, attr, cc_toolchain, feature_configuration, rpaths):
def get_linker_and_args(ctx, deps, cc_toolchain, feature_configuration, rpaths):
"""Gathers cc_common linker information

Args:
ctx (ctx): The current target's context object
attr (struct): Attributes to use in gathering linker args
ctx (ctx): The current target's context object.
deps (list of DepVariantInfos): Current target's dependencies (to use
in gathering linker args).
cc_toolchain (CcToolchain): cc_toolchain for which we are creating build variables.
feature_configuration (FeatureConfiguration): Feature configuration to be queried.
rpaths (depset): Depset of directories where loader will look for libraries at runtime.
Expand All @@ -356,9 +357,9 @@ def get_linker_and_args(ctx, attr, cc_toolchain, feature_configuration, rpaths):

# Add linkopt's from dependencies. This includes linkopts from transitive
# dependencies since they get merged up.
for dep in getattr(attr, "deps", []):
if CcInfo in dep and dep[CcInfo].linking_context:
for linker_input in dep[CcInfo].linking_context.linker_inputs.to_list():
for dep in deps:
if dep.cc_info and dep.cc_info.linking_context:
for linker_input in dep.cc_info.linking_context.linker_inputs.to_list():
for flag in linker_input.user_link_flags:
user_link_flags.append(flag)
link_variables = cc_common.create_link_variables(
Expand Down Expand Up @@ -917,7 +918,7 @@ def construct_arguments(
rpaths = _compute_rpaths(toolchain, output_dir, dep_info, use_pic)
else:
rpaths = depset([])
ld, link_args, link_env = get_linker_and_args(ctx, attr, cc_toolchain, feature_configuration, rpaths)
ld, link_args, link_env = get_linker_and_args(ctx, crate_info.deps.to_list(), cc_toolchain, feature_configuration, rpaths)
env.update(link_env)
rustc_flags.add("--codegen=linker=" + ld)
rustc_flags.add_joined("--codegen", link_args, join_with = " ", format_joined = "link-args=%s")
Expand Down