Is your feature request related to a problem? Please describe.
Cargo crates sometimes expect generated files to exist under OUT_DIR, for example:
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:
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:
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.
Is your feature request related to a problem? Please describe.
Cargo crates sometimes expect generated files to exist under
OUT_DIR, for example:This is common for crates that normally use a
build.rsscript, including FFI/sys crates. In Bazel, those generated files may already be produced by other rules, such asrust_bindgen, genrules, protobuf/schema generators, or checked-in generated files.Today
rules_rustcan expose an existing directory artifact asOUT_DIRviaBuildInfo.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_DIRdirectory and exposes that directory to a consuming Rust target.For example:
The consuming crate could then use:
This would provide a general solution for crates that need an
OUT_DIRlayout without requiring a dummybuild.rs.This could also supersede #3184. That issue asks for
rust_bindgento place generated files intoOUT_DIR, but the underlying problem is not specific to bindgen. A general rule would allowrust_bindgenoutput to be mapped tobindings.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_dirtorust_bindgen. I think a general rule would be cleaner becauseOUT_DIRis 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.rsjust to copy files intoOUT_DIR, but that adds unnecessary build-script machinery when Bazel has already produced the files explicitly.