bazelbuild / bazelbuild/rules_rust
rust_library doesn't work with copy_to_directory output
- Dominant language
- Starlark
- Stars
- 843
- Forks
- 651
- Avg merge
- 2d 18h
- Merged PRs (30d)
- 15
Description
Setup:
```
$ tree .
.
├── BUILD.bazel
├── MODULE.bazel
└── src
├── a
│ └── main.rs
└── foo
└── mod.rs
```
MODULE.bazel:
```
bazel_dep(name = "rules_rust", version = "0.60.0")
bazel_dep(name = "aspect_bazel_lib", version = "2.15.3")
```
BUILD.bazel:
```
load("@rules_rust//rust:defs.bzl", "rust_binary")
load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory")
copy_to_directory(
name = "copy_srcs",
srcs = glob([
"src/**/*.rs",
]),
replace_prefixes = {
"src/a/": "",
"src/foo/": "foo/",
},
)
rust_binary(
name = "hello_world",
srcs = [":copy_srcs"],
deps = [],
)
```
main.rs:
```
mod foo;
fn main() {
foo::hello_world();
}
```
foo.rs
```
pub fn hello_world() {
println!("Hello from foo!");
}
```
Trying to build this gives:
```
ERROR: /home/mikea/tmp/rust_bazel_test/BUILD.bazel:32:12: in rust_binary rule //:hello_world:
Traceback (most recent call last):
File "/home/mikea/.cache/bazel/_bazel_mikea/873f4a151b5bd21ce14e322b91406545/external/rules_rust+/rust/private/rust.bzl", line 239, column 37, in _rust_binary_impl
providers = rustc_compile_action(
File "/home/mikea/.cache/bazel/_bazel_mikea/873f4a151b5bd21ce14e322b91406545/external/rules_rust+/rust/private/rustc.bzl", line 1258, column 46, in rustc_compile_action
args, env_from_args = construct_arguments(
File "/home/mikea/.cache/bazel/_bazel_mikea/873f4a151b5bd21ce14e322b91406545/external/rules_rust+/rust/private/rustc.bzl", line 937, column 20, in construct_arguments
rustc_flags.add(crate_info.root)
Error in add: Cannot add directories to Args#add since they may expand to multiple values. Either use Args#add_all (if you want expansion) or args.add(directory.path) (if you do not).
ERROR: /home/mikea/tmp/rust_bazel_test/BUILD.bazel:32:12: Analysis of target '//:hello_world' failed
```
You can verify that resulting directory structure is ok:
```
bazel build //:copy_srcs && tree bazel-bin/copy_srcs/
bazel-bin/copy_srcs/
├── foo
│ └── mod.rs
└── main.rs
```
If I try to use data then I have a different error:
```
rust_binary(
name = "hello_world",
srcs = ["copy_srcs/lib.rs"],
compile_data = [":copy_srcs"],
deps = [],
)
```
gives
```
ERROR: One of the output paths 'bazel-out/k8-fastbuild/bin/copy_srcs' (belonging to //:copy_srcs) and 'bazel-out/k8-fastbuild/bin/copy_srcs/lib.rs' (belonging to //:hello_world) is a prefix of the other. These actions cannot be simultaneously present; please rename one of the output files or build just one of them
ERROR: One of the output paths 'bazel-out/k8-fastbuild/bin/copy_srcs' (belonging to //:copy_srcs) and 'bazel-out/k8-fastbuild/bin/copy_srcs/lib.rs' (belonging to //:hello_world) is a prefix of the other. These actions cannot be simultaneously present; please rename one of the output files or build just one of them
```
I can't seem to find a combination of attributes to use copy_to_directoy output.
Thanks.
Contributor guide
Assessment
This issue has not been assessed yet.