Skip to content

Commit e3c8e49

Browse files
committed
Add support for self-contained files (musl).
1 parent ed64716 commit e3c8e49

File tree

3 files changed

+45
-13
lines changed

3 files changed

+45
-13
lines changed

rust/private/providers.bzl

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ StdLibInfo = provider(
5858
"between_core_and_std_files": "List[File]: `.a` files related to all modules except `adler`, `alloc`, `compiler_builtins`, `core`, and `std`.",
5959
"core_files": "List[File]: `.a` files related to the `core` and `adler` modules",
6060
"dot_a_files": "Depset[File]: Generated `.a` files",
61+
"self_contained_files": "List[File]: All `.o` files from the `self-contained` directory.",
6162
"srcs": "List[Target]: The original `src` attribute.",
6263
"std_files": "Depset[File]: `.a` files associated with the `std` module.",
6364
"std_rlibs": "List[File]: All `.rlib` files",

rust/private/repository_utils.bzl

+1
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ rust_stdlib_filegroup(
147147
"lib/rustlib/{target_triple}/lib/*.rlib",
148148
"lib/rustlib/{target_triple}/lib/*{dylib_ext}",
149149
"lib/rustlib/{target_triple}/lib/*{staticlib_ext}",
150+
"lib/rustlib/{target_triple}/lib/self-contained/**",
150151
],
151152
# Some patterns (e.g. `lib/*.a`) don't match anything, see https://github.com/bazelbuild/rules_rust/pull/245
152153
allow_empty = True,

rust/toolchain.bzl

+43-13
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ def _rust_stdlib_filegroup_impl(ctx):
2525
between_core_and_std_files = []
2626
std_files = []
2727
alloc_files = []
28+
self_contained_files = [
29+
file
30+
for file in rust_lib
31+
if file.basename.endswith(".o") and "self-contained" in file.path
32+
]
2833

2934
std_rlibs = [f for f in rust_lib if f.basename.endswith(".rlib")]
3035
if std_rlibs:
@@ -67,6 +72,7 @@ def _rust_stdlib_filegroup_impl(ctx):
6772
between_core_and_std_files = between_core_and_std_files,
6873
std_files = std_files,
6974
alloc_files = alloc_files,
75+
self_contained_files = self_contained_files,
7076
),
7177
]
7278

@@ -115,7 +121,7 @@ def _make_libstd_and_allocator_ccinfo(ctx, rust_lib, allocator_library):
115121
A CcInfo object for the required libraries, or None if no such libraries are available.
116122
"""
117123
cc_toolchain, feature_configuration = find_cc_toolchain(ctx)
118-
link_inputs = []
124+
cc_infos = []
119125

120126
if not rust_common.stdlib_info in ctx.attr.rust_lib:
121127
fail(dedent("""\
@@ -126,6 +132,23 @@ def _make_libstd_and_allocator_ccinfo(ctx, rust_lib, allocator_library):
126132
""").format(ctx.label, ctx.attr.rust_lib))
127133
rust_stdlib_info = ctx.attr.rust_lib[rust_common.stdlib_info]
128134

135+
if rust_stdlib_info.self_contained_files:
136+
compilation_outputs = cc_common.create_compilation_outputs(
137+
objects = depset(rust_stdlib_info.self_contained_files),
138+
)
139+
140+
linking_context, _linking_outputs = cc_common.create_linking_context_from_compilation_outputs(
141+
name = ctx.label.name,
142+
actions = ctx.actions,
143+
feature_configuration = feature_configuration,
144+
cc_toolchain = cc_toolchain,
145+
compilation_outputs = compilation_outputs,
146+
)
147+
148+
cc_infos.append(CcInfo(
149+
linking_context = linking_context,
150+
))
151+
129152
if rust_stdlib_info.std_rlibs:
130153
alloc_inputs = depset(
131154
[_ltl(f, ctx, cc_toolchain, feature_configuration) for f in rust_stdlib_info.alloc_files],
@@ -151,22 +174,29 @@ def _make_libstd_and_allocator_ccinfo(ctx, rust_lib, allocator_library):
151174
order = "topological",
152175
)
153176

154-
link_inputs.append(cc_common.create_linker_input(
177+
link_inputs = cc_common.create_linker_input(
155178
owner = rust_lib.label,
156179
libraries = std_inputs,
157-
))
180+
)
158181

159-
allocator_inputs = None
160-
if allocator_library:
161-
allocator_inputs = [allocator_library[CcInfo].linking_context.linker_inputs]
182+
allocator_inputs = None
183+
if allocator_library:
184+
allocator_inputs = [allocator_library[CcInfo].linking_context.linker_inputs]
185+
186+
cc_infos.append(CcInfo(
187+
linking_context = cc_common.create_linking_context(
188+
linker_inputs = depset(
189+
[link_inputs],
190+
transitive = allocator_inputs,
191+
order = "topological",
192+
),
193+
),
194+
))
162195

163-
libstd_and_allocator_ccinfo = None
164-
if link_inputs:
165-
return CcInfo(linking_context = cc_common.create_linking_context(linker_inputs = depset(
166-
link_inputs,
167-
transitive = allocator_inputs,
168-
order = "topological",
169-
)))
196+
if cc_infos:
197+
return cc_common.merge_cc_infos(
198+
direct_cc_infos = cc_infos,
199+
)
170200
return None
171201

172202
def _rust_toolchain_impl(ctx):

0 commit comments

Comments
 (0)