Skip to content

Commit 2f22aa8

Browse files
authored
use linking_context for additional_link_libraries (#73)
Instead of assuming that targets in `additional_link_libraries` always provide a single file, use `linking_context` to obtain additional link flags. Additionally, ensure that `additional_linker_inputs` are available in the transitioned library.
1 parent 96bd0b4 commit 2f22aa8

5 files changed

Lines changed: 35 additions & 10 deletions

File tree

MODULE.bazel.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/bzlmod/custom/toolchain/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ arm_none_eabi_toolchain(
5050
cc_library(
5151
name = "start",
5252
srcs = ["start.c"],
53+
additional_linker_inputs = ["link.ld"],
54+
linkopts = ["-T $(location :link.ld)"],
5355
)
5456

5557
# Cortex-M4 toolchain that always links `:start`

examples/bzlmod/custom/toolchain/link.ld

Whitespace-only changes.

toolchain/config.bzl

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,21 @@ def _default_linker_flags(_ctx):
4444
"-no-canonical-prefixes",
4545
]
4646

47-
def _additional_link_library_paths(ctx):
48-
"""Extract library paths from CcInfo providers."""
49-
return [
50-
target[DefaultInfo].files.to_list()[0].path
51-
for target in ctx.attr.additional_link_libraries
52-
]
47+
def _additional_link_library_flags(ctx):
48+
"""Extract link flags from CcInfo providers."""
49+
flags = []
50+
51+
for link in ctx.attr.additional_link_libraries:
52+
for input in link[CcInfo].linking_context.linker_inputs.to_list():
53+
flags.extend(input.user_link_flags)
54+
55+
for library in input.libraries:
56+
if library.static_library:
57+
flags.append(library.static_library.path)
58+
elif library.dynamic_library:
59+
flags.append(library.dynamic_library.path)
60+
61+
return flags
5362

5463
def _impl(ctx):
5564
default_compiler_flags = _default_compiler_flags(ctx)
@@ -140,7 +149,7 @@ def _impl(ctx):
140149
actions = [ACTION_NAMES.cpp_link_executable],
141150
flag_groups = [
142151
flag_group(
143-
flags = _additional_link_library_paths(ctx),
152+
flags = _additional_link_library_flags(ctx),
144153
),
145154
] if ctx.attr.additional_link_libraries else [],
146155
),

toolchain/transitions.bzl

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,23 @@ _toolchain_transition = transition(
1414
)
1515

1616
def _toolchain_transition_library_impl(ctx):
17+
default_info = ctx.attr.src[DefaultInfo]
18+
cc_info = ctx.attr.src[CcInfo]
19+
20+
linker_input_files = []
21+
for linker_input in cc_info.linking_context.linker_inputs.to_list():
22+
linker_input_files.extend(linker_input.additional_inputs)
23+
1724
return [
18-
ctx.attr.src[DefaultInfo],
19-
ctx.attr.src[CcInfo],
25+
DefaultInfo(
26+
files = depset(
27+
transitive = [
28+
default_info.files,
29+
depset(linker_input_files),
30+
],
31+
),
32+
),
33+
cc_info,
2034
]
2135

2236
toolchain_transition_library = rule(

0 commit comments

Comments
 (0)