Skip to content

Add rule to materialize generated files into a OUT_DIR #4196

Description

@callframe

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions