Add support for experimental_output_paths - #4011
Conversation
a2c755c to
68242ac
Compare
| rust_analyzer_tests_linux: | ||
| name: Rust-Analyzer Linux Tests | ||
| ide_integration_tests_linux: | ||
| name: IDE VSCode Tests |
There was a problem hiding this comment.
Are the Rust-Analyzer -> IDE VSCode config changes related to the rest of the PR?
There was a problem hiding this comment.
I needed to trim down the number of jobs since we're hitting the 128 limit
| rustc_flags.add('--cfg=feature="no_std"') | ||
|
|
||
| # Add target specific flags last, so they can override previous flags | ||
| authored_rustc_flags = getattr(attr, "rustc_flags", []) |
There was a problem hiding this comment.
What does "authored" mean in this context?
There was a problem hiding this comment.
Flags users added to their targets. I can use whatever name you'd prefer. I know I'm bad at naming 😅
|
I think this has broken a pattern somewhat common in embedded Rust where one crate puts a file into build script outputs, and another create references it from its build script in linker flags. I bisected the problem to 175bf94, but didn't yet understand whether the problem is in this commit or somewhere on my side. |
Interesting, I would be surprised this has an impact assuming you're not using |
|
No, I don't. |
Can you make a small repro in a pull-request somewhere in //cargo/tests/cargo_build_script ? |
### The bug Since the `OUT_DIR` sanitization work (#4050 / #4011, first released in 0.71.x), `outputs_to_dep_env` redacts the producer's `out_dir` to the generic `${out_dir}` substitution token, the same way `outputs_to_env` does. That redaction is only correct for `_bs.env` files, which are consumed by the target that directly owns the build script (where `process_wrapper`'s `--out-dir` resolves the token to the right directory). Dep env (`DEP_*`) files, however, are consumed by *downstream* crates' build scripts: their runner only substitutes `${pwd}`, and their own `out_dir` points to a different directory. The token is therefore left unresolved, or would resolve to the wrong directory. Real-world failure: `libssh2-sys`'s build script fails to find `zlib.h` because `libz-sys`'s `DEP_Z_INCLUDE` contains a literal `${out_dir}` path component. Found while upgrading `rules_rust` to 0.71.3 in dfinity/ic (see dfinity/ic#10632, where this fix is currently carried as a patch). ### The fix Only substitute the exec root in dep env files and keep the real `out_dir` path. That path is valid for consumers: the producer's `out_dir` is a declared input of downstream build script actions. ### Tests * Unit test `out_dir_in_dep_env_value_is_not_redacted_to_substitution_token` in `cargo/private/cargo_build_script_runner/lib.rs`. * End-to-end regression test `//cargo/tests/dep_env:build_read_out_dir` mirroring the libz-sys → libssh2-sys scenario: a producer build script advertises `cargo:include=$OUT_DIR/include` and the consumer build script asserts `DEP_Z_INCLUDE` points at an existing directory. Fails without the fix, passes with it. --- Assisted-by: GitHub Copilot
For details on path mapping see bazelbuild/bazel#22658
Changes:
out_dirto avoid location expanded environment variables.construct_argumentsis updated to supportrustc_flagsas anArgsobject.Listis still supported though