bazelbuild / bazelbuild/rules_rust
Add rule to materialize generated files into a `OUT_DIR`
- Dominant language
- Starlark
- Stars
- 843
- Forks
- 651
- Avg merge
- 2d 18h
- Merged PRs (30d)
- 15
Description
**Is your feature request related to a problem? Please describe.**
Cargo crates sometimes expect generated files to exist under `OUT_DIR`, for example:
```rust
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
```
This is common for crates that normally use a `build.rs` script, including FFI/sys crates. In Bazel, those generated files may already be produced by other rules, such as `rust_bindgen`, genrules, protobuf/schema generators, or checked-in generated files.
Today `rules_rust` can expose an existing directory artifact as `OUT_DIR` via `BuildInfo.out_dir` / `cargo_dep_env(out_dir = ...)`, but there does not seem to be a general public helper for taking individual Bazel-produced files and materializing them into the directory layout expected by Cargo-style Rust code.
**Describe the solution you'd like**
Add a small general-purpose rule that materializes declared files into a Cargo-style `OUT_DIR` directory and exposes that directory to a consuming Rust target.
For example:
```python
cargo_out_dir(
name = "bindings_out_dir",
files = {
"bindings.rs": ":bindings",
"nested/config.txt": ":config",
},
)
rust_library(
name = "my_sys_crate",
srcs = ["src/lib.rs"],
deps = [":bindings_out_dir"],
)
```
The consuming crate could then use:
```rust
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
```
This would provide a general solution for crates that need an `OUT_DIR` layout without requiring a dummy `build.rs`.
This could also supersede #3184. That issue asks for `rust_bindgen` to place generated files into `OUT_DIR`, but the underlying problem is not specific to bindgen. A general rule would allow `rust_bindgen` output to be mapped to `bindings.rs`, while also supporting other generators and files.
**Describe alternatives you've considered**
One alternative is to add a bindgen-specific option such as `use_out_dir` to `rust_bindgen`. I think a general rule would be cleaner because `OUT_DIR` is a convention of the consuming Rust crate, not of bindgen specifically.
Another alternative is to use `cargo_dep_env(out_dir = ...)` directly. That works if the user already has a directory artifact with the exact expected layout, but it does not solve the common case where the user has individual generated files that need to be assembled into that layout.
A third alternative is to run a dummy `build.rs` just to copy files into `OUT_DIR`, but that adds unnecessary build-script machinery when Bazel has already produced the files explicitly.
Contributor guide
Research direction
Start by reading the existing BuildInfo.out_dir and cargo_dep_env(out_dir = ...) entry points, then compare how rust_bindgen exposes generated files. Done means a public general-purpose rule can map declared individual files into a Cargo-style OUT_DIR layout and expose that directory to a consuming Rust target, including nested paths.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- build-system
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100