bazelbuild / bazelbuild/rules_rust

rust_library doesn't work with copy_to_directory output

Open
#3,416 1 comment 0 reactions 0 assignees View on GitHub
needs-triage
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.