Skip to content

Commit 749a0ec

Browse files
committed
Symlink compile_data if srcs are symlinked
This fixes #3171
1 parent f329c0c commit 749a0ec

File tree

4 files changed

+57
-18
lines changed

4 files changed

+57
-18
lines changed

rust/private/rust.bzl

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def _rust_library_common(ctx, crate_type):
149149
crate_root = getattr(ctx.file, "crate_root", None)
150150
if not crate_root:
151151
crate_root = crate_root_src(ctx.attr.name, ctx.attr.crate_name, ctx.files.srcs, crate_type)
152-
srcs, crate_root = transform_sources(ctx, ctx.files.srcs, crate_root)
152+
srcs, compile_data, crate_root = transform_sources(ctx, ctx.files.srcs, ctx.files.compile_data, crate_root)
153153

154154
# Determine unique hash for this rlib.
155155
# Note that we don't include a hash for `cdylib` and `staticlib` since they are meant to be consumed externally
@@ -202,7 +202,7 @@ def _rust_library_common(ctx, crate_type):
202202
rustc_env_files = ctx.files.rustc_env_files,
203203
is_test = False,
204204
data = depset(ctx.files.data),
205-
compile_data = depset(ctx.files.compile_data),
205+
compile_data = depset(compile_data),
206206
compile_data_targets = depset(ctx.attr.compile_data),
207207
owner = ctx.label,
208208
),
@@ -233,7 +233,7 @@ def _rust_binary_impl(ctx):
233233
crate_root = getattr(ctx.file, "crate_root", None)
234234
if not crate_root:
235235
crate_root = crate_root_src(ctx.attr.name, ctx.attr.crate_name, ctx.files.srcs, ctx.attr.crate_type)
236-
srcs, crate_root = transform_sources(ctx, ctx.files.srcs, crate_root)
236+
srcs, compile_data, crate_root = transform_sources(ctx, ctx.files.srcs, ctx.files.compile_data, crate_root)
237237

238238
providers = rustc_compile_action(
239239
ctx = ctx,
@@ -254,7 +254,7 @@ def _rust_binary_impl(ctx):
254254
rustc_env_files = ctx.files.rustc_env_files,
255255
is_test = False,
256256
data = depset(ctx.files.data),
257-
compile_data = depset(ctx.files.compile_data),
257+
compile_data = depset(compile_data),
258258
compile_data_targets = depset(ctx.attr.compile_data),
259259
owner = ctx.label,
260260
),
@@ -330,13 +330,11 @@ def _rust_test_impl(ctx):
330330
),
331331
)
332332

333-
srcs, crate_root = transform_sources(ctx, ctx.files.srcs, getattr(ctx.file, "crate_root", None))
333+
# Need to consider all src files together when transforming
334+
srcs = depset(ctx.files.srcs, transitive = [crate.srcs]).to_list()
335+
compile_data = depset(ctx.files.compile_data, transitive = [crate.compile_data]).to_list()
336+
srcs, compile_data, crate_root = transform_sources(ctx, srcs, compile_data, getattr(ctx.file, "crate_root", None))
334337

335-
# Optionally join compile data
336-
if crate.compile_data:
337-
compile_data = depset(ctx.files.compile_data, transitive = [crate.compile_data])
338-
else:
339-
compile_data = depset(ctx.files.compile_data)
340338
if crate.compile_data_targets:
341339
compile_data_targets = depset(ctx.attr.compile_data, transitive = [crate.compile_data_targets])
342340
else:
@@ -360,7 +358,7 @@ def _rust_test_impl(ctx):
360358
name = crate_name,
361359
type = crate_type,
362360
root = crate.root,
363-
srcs = depset(srcs, transitive = [crate.srcs]),
361+
srcs = depset(srcs),
364362
deps = depset(deps, transitive = [crate.deps]),
365363
proc_macro_deps = depset(proc_macro_deps, transitive = [crate.proc_macro_deps]),
366364
aliases = aliases,
@@ -370,7 +368,7 @@ def _rust_test_impl(ctx):
370368
rustc_env = rustc_env,
371369
rustc_env_files = rustc_env_files,
372370
is_test = True,
373-
compile_data = compile_data,
371+
compile_data = depset(compile_data),
374372
compile_data_targets = compile_data_targets,
375373
wrapped_crate_type = crate.type,
376374
owner = ctx.label,
@@ -381,7 +379,7 @@ def _rust_test_impl(ctx):
381379
if not crate_root:
382380
crate_root_type = "lib" if ctx.attr.use_libtest_harness else "bin"
383381
crate_root = crate_root_src(ctx.attr.name, ctx.attr.crate_name, ctx.files.srcs, crate_root_type)
384-
srcs, crate_root = transform_sources(ctx, ctx.files.srcs, crate_root)
382+
srcs, compile_data, crate_root = transform_sources(ctx, ctx.files.srcs, ctx.files.compile_data, crate_root)
385383

386384
if toolchain._incompatible_change_rust_test_compilation_output_directory:
387385
output = ctx.actions.declare_file(
@@ -420,7 +418,7 @@ def _rust_test_impl(ctx):
420418
rustc_env = rustc_env,
421419
rustc_env_files = ctx.files.rustc_env_files,
422420
is_test = True,
423-
compile_data = depset(ctx.files.compile_data),
421+
compile_data = depset(compile_data),
424422
compile_data_targets = depset(ctx.attr.compile_data),
425423
owner = ctx.label,
426424
)

rust/private/utils.bzl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ def determine_lib_name(name, crate_type, toolchain, lib_hash = None):
789789
extension = extension,
790790
)
791791

792-
def transform_sources(ctx, srcs, crate_root):
792+
def transform_sources(ctx, srcs, compile_data, crate_root):
793793
"""Creates symlinks of the source files if needed.
794794
795795
Rustc assumes that the source files are located next to the crate root.
@@ -802,25 +802,29 @@ def transform_sources(ctx, srcs, crate_root):
802802
Args:
803803
ctx (struct): The current rule's context.
804804
srcs (List[File]): The sources listed in the `srcs` attribute
805+
compile_data (List[File]): The sources listed in the `compile_data`
806+
attribute
805807
crate_root (File): The file specified in the `crate_root` attribute,
806808
if it exists, otherwise None
807809
808810
Returns:
809-
Tuple(List[File], File): The transformed srcs and crate_root
811+
Tuple(List[File], List[File], File): The transformed srcs, compile_data
812+
and crate_root
810813
"""
811814
has_generated_sources = len([src for src in srcs if not src.is_source]) > 0
812815

813816
if not has_generated_sources:
814-
return srcs, crate_root
817+
return srcs, compile_data, crate_root
815818

816819
package_root = paths.join(ctx.label.workspace_root, ctx.label.package)
817820
generated_sources = [_symlink_for_non_generated_source(ctx, src, package_root) for src in srcs if src != crate_root]
821+
generated_compile_data = [_symlink_for_non_generated_source(ctx, src, package_root) for src in compile_data]
818822
generated_root = crate_root
819823
if crate_root:
820824
generated_root = _symlink_for_non_generated_source(ctx, crate_root, package_root)
821825
generated_sources.append(generated_root)
822826

823-
return generated_sources, generated_root
827+
return generated_sources, generated_compile_data, generated_root
824828

825829
def get_edition(attr, toolchain, label):
826830
"""Returns the Rust edition from either the current rule's attributes or the current `rust_toolchain`
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
pub mod generated;
2+
3+
/// Data loaded from compile data
4+
pub const COMPILE_DATA: &str = include_str!("compile_data.txt");
5+
6+
#[cfg(test)]
7+
mod test {
8+
use super::*;
9+
10+
#[test]
11+
fn test_compile_data_contents() {
12+
assert_eq!(COMPILE_DATA.trim_end(), "compile data contents");
13+
}
14+
15+
#[test]
16+
fn test_generated_src() {
17+
assert_eq!(generated::GENERATED, "generated");
18+
}
19+
}

test/unit/compile_data/compile_data_test.bzl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,24 @@ def _define_test_targets():
9595
crate = ":compile_data_env",
9696
)
9797

98+
native.genrule(
99+
name = "generated_src",
100+
outs = ["generated.rs"],
101+
cmd = """echo 'pub const GENERATED: &str = "generated";' > $@""",
102+
)
103+
104+
rust_library(
105+
name = "compile_data_gen_srcs",
106+
srcs = ["compile_data_gen_srcs.rs", ":generated.rs"],
107+
compile_data = ["compile_data.txt"],
108+
edition = "2021",
109+
)
110+
111+
rust_test(
112+
name = "compile_data_gen_srcs_unit_test",
113+
crate = ":compile_data_gen_srcs",
114+
)
115+
98116
def compile_data_test_suite(name):
99117
"""Entry-point macro called from the BUILD file.
100118

0 commit comments

Comments
 (0)