Enable build-dir layout v2 on nightly by default - #17258
Conversation
3f297a4 to
d34b4b3
Compare
|
r? @epage rustbot has assigned @epage. Use Why was this reviewer chosen?The reviewer was selected based on:
|
|
Marking this as ready to review. I spent some time trying to reproduce sccache failures with argfiles on windows, and couldn't get a failure. (tested on zed again, with |
| /// gating unstable functionality to Cargo. These flags are only available on | ||
| /// the nightly channel of Cargo. | ||
| #[derive(Default, Debug, Deserialize)] | ||
| #[derive(Debug, Deserialize)] |
There was a problem hiding this comment.
Is there a way to do this without removing Default? This makes it more invasive to undo and redo.
There was a problem hiding this comment.
Ehh its get awkward to avoid, specially due to #[serde(default)].
I split out a refactor commit and manually impl'd Default in the macro to reduce the bloat and need to update the Default impl when adding new features.
It's still not ideal but maybe a bit better?
d34b4b3 to
4bb796b
Compare
This comment has been minimized.
This comment has been minimized.
4bb796b to
7b66084
Compare
|
This PR was rebased onto a different master commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
| // Defaults to enabled on nightly unless explicitly opted out. | ||
| let c = &channel(); | ||
| unstable.build_dir_new_layout = | ||
| (c == "nightly" || c == "dev") && !is_new_build_dir_layout_opt_out(); |
There was a problem hiding this comment.
Josh (or someone I don't remember) has mentioned there are people using stable toolchains but enable RUSTC_BOOTSTRAP=1 for enabling some unstable features. Should we avoid enable it if the toolchain is stable/beta?
There was a problem hiding this comment.
It was @Mark-Simulacrum that mentioned it here.
Yeah, I think that makes sense. When that comment was made it kind of went over my head (we have so many bespoke config options 😆)
If I understand it correctly, enabling RUSTC_BOOTSTRAP=1 will result in Cargo using the dev channel.
cargo/src/workspace/features.rs
Lines 1602 to 1605 in 5b6fca7
So the logic should be updated to
let is_rustc_bootstrap = env::var("RUSTC_BOOTSTRAP").map(|o| &o == "1");
unstable.build_dir_new_layout = (c == "nightly" || c == "dev") && !is_new_build_dir_layout_opt_out() && !is_rustc_bootstrap;Will this cause an issues in bootstrap? I guess not since bootstrap explicitly passes -Zbuild-dir-new-layout and this is just for the defaults.
Does that all sound correct?
There was a problem hiding this comment.
Either that or just something like crate::version().release_channel == Some("nightly" | "dev")?
There was a problem hiding this comment.
ah yeah that should work. I wish I had thought of this before updating all of the tests again. 🫠
Since this skips __CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS none of the tests need to be updated
7b66084 to
d035da6
Compare
Cargo enables build-dir layout v2 by default on nightly (rust-lang/cargo#17258). Intermediate build artifacts no longer live in `<target-dir>/<triple>/<profile>/deps/` but in per-unit `build/<pkg>/<hash>/out/` directories. Search the target directory recursively instead of hardcoding the artifact location, so these tests pass under both the old and the new layout.
Cargo enables build-dir layout v2 by default on nightly (rust-lang/cargo#17258). Intermediate build artifacts no longer live in `<target-dir>/<triple>/<profile>/deps/` but in per-unit `build/<pkg>/<hash>/out/` directories.
Update cargo submodule 17 commits in 3efb1f477e99b42974b982d939fd100303cdf7db..54b61f13a4eea47ec3ee95237d4107976d7909ed 2026-07-17 23:53:19 +0000 to 2026-07-24 13:23:18 +0000 - chore: bump to `libgit2-sys@0.18.7+1.9.6` (rust-lang/cargo#17259) - Enable build-dir layout v2 on nightly by default (rust-lang/cargo#17258) - fix(path): clarify error message when path dependency has wrong package (rust-lang/cargo#16927) - fix(toml): warn on hyphenated lint names and duplicates (rust-lang/cargo#17051) - fix(test): gate trim-paths tests on split debuginfo support (rust-lang/cargo#17256) - test(git): Explicitly test for git injection attacks (rust-lang/cargo#17253) - fix(git): Suggest libgit2 if git-cli fails (rust-lang/cargo#17252) - fix(diag): bound transitive unused dependency traversal (rust-lang/cargo#17251) - fix(git): Hide git fetch output without progress (rust-lang/cargo#17243) - revert(lint): Remove `new_implicit_minimum_version_req` (rust-lang/cargo#16321) (rust-lang/cargo#17249) - fix: Add haiku's dylib path (rust-lang/cargo#17248) - Zsh completion: Add `-p` and `--package` flags for `cargo add` (rust-lang/cargo#17247) - refactor(source): Clarify the name of the remote git registry (rust-lang/cargo#17240) - fix(timings): only report units the job queue actually ran (rust-lang/cargo#17238) - Do not include proc-macro deps in rustc search path args (rust-lang/cargo#17236) - chore(deps): update cargo-semver-checks to v0.49.0 (rust-lang/cargo#17237) - rustdoc: rename the doc parts metadata params (rust-lang/cargo#17234) r? ghost
Update cargo submodule 17 commits in 3efb1f477e99b42974b982d939fd100303cdf7db..54b61f13a4eea47ec3ee95237d4107976d7909ed 2026-07-17 23:53:19 +0000 to 2026-07-24 13:23:18 +0000 - chore: bump to `libgit2-sys@0.18.7+1.9.6` (rust-lang/cargo#17259) - Enable build-dir layout v2 on nightly by default (rust-lang/cargo#17258) - fix(path): clarify error message when path dependency has wrong package (rust-lang/cargo#16927) - fix(toml): warn on hyphenated lint names and duplicates (rust-lang/cargo#17051) - fix(test): gate trim-paths tests on split debuginfo support (rust-lang/cargo#17256) - test(git): Explicitly test for git injection attacks (rust-lang/cargo#17253) - fix(git): Suggest libgit2 if git-cli fails (rust-lang/cargo#17252) - fix(diag): bound transitive unused dependency traversal (rust-lang/cargo#17251) - fix(git): Hide git fetch output without progress (rust-lang/cargo#17243) - revert(lint): Remove `new_implicit_minimum_version_req` (rust-lang/cargo#16321) (rust-lang/cargo#17249) - fix: Add haiku's dylib path (rust-lang/cargo#17248) - Zsh completion: Add `-p` and `--package` flags for `cargo add` (rust-lang/cargo#17247) - refactor(source): Clarify the name of the remote git registry (rust-lang/cargo#17240) - fix(timings): only report units the job queue actually ran (rust-lang/cargo#17238) - Do not include proc-macro deps in rustc search path args (rust-lang/cargo#17236) - chore(deps): update cargo-semver-checks to v0.49.0 (rust-lang/cargo#17237) - rustdoc: rename the doc parts metadata params (rust-lang/cargo#17234) r? ghost
Update cargo submodule ## src/tools/cargo 20 commits in 3efb1f477e99b42974b982d939fd100303cdf7db..a09737c688e6b643b3a2e185d076bb4a298d6965 2026-07-17 23:53:19 +0000 to 2026-07-26 15:00:33 +0000 - fix(cli): don't panic during completions when rustup is unavailable (rust-lang/cargo#17263) - docs(workspace): add recommended structure to members field (rust-lang/cargo#17166) - Update cargo-fetch.md to remove cargo-prefetch reference (rust-lang/cargo#16568) - chore: bump to `libgit2-sys@0.18.7+1.9.6` (rust-lang/cargo#17259) - Enable build-dir layout v2 on nightly by default (rust-lang/cargo#17258) - fix(path): clarify error message when path dependency has wrong package (rust-lang/cargo#16927) - fix(toml): warn on hyphenated lint names and duplicates (rust-lang/cargo#17051) - fix(test): gate trim-paths tests on split debuginfo support (rust-lang/cargo#17256) - test(git): Explicitly test for git injection attacks (rust-lang/cargo#17253) - fix(git): Suggest libgit2 if git-cli fails (rust-lang/cargo#17252) - fix(diag): bound transitive unused dependency traversal (rust-lang/cargo#17251) - fix(git): Hide git fetch output without progress (rust-lang/cargo#17243) - revert(lint): Remove `new_implicit_minimum_version_req` (rust-lang/cargo#16321) (rust-lang/cargo#17249) - fix: Add haiku's dylib path (rust-lang/cargo#17248) - Zsh completion: Add `-p` and `--package` flags for `cargo add` (rust-lang/cargo#17247) - refactor(source): Clarify the name of the remote git registry (rust-lang/cargo#17240) - fix(timings): only report units the job queue actually ran (rust-lang/cargo#17238) - Do not include proc-macro deps in rustc search path args (rust-lang/cargo#17236) - chore(deps): update cargo-semver-checks to v0.49.0 (rust-lang/cargo#17237) - rustdoc: rename the doc parts metadata params (rust-lang/cargo#17234) ## src/tools/rustc-perf 12 commits in 0508bdcd37152b28c39b6752828683cdd3f128b5..74ecbcdf88411937a6e39baf2779948565dfd388 2026-07-15 10:20:27 +0000 to 2026-07-27 15:02:48 +0000 - feat: support `@argfile` for rustc-fake (rust-lang/rustc-perf#2509) - Download Clippy when a Clippy profile is requested (rust-lang/rustc-perf#2508) - Add early check for missing rustdoc/clippy in a toolchain (rust-lang/rustc-perf#2507) - Add 2026-07-21 triage (rust-lang/rustc-perf#2506) - use stable extract_if: since 1.87 (rust-lang/rustc-perf#2191) - Update GitHub Actions (rust-lang/rustc-perf#2460) - Update dependency @types/msgpack-lite to v0.1.12 (rust-lang/rustc-perf#2439) - Add 30 day history link to artifact size tab on the compare page (rust-lang/rustc-perf#2505) - Fix selecting color for the bootstrap chart on the toolchain page (rust-lang/rustc-perf#2504) - Add artifact size history chart to toolchain page (rust-lang/rustc-perf#2501) - Parallel frontend compiler support (perf backend only) (rust-lang/rustc-perf#2491) - Run benchmark smoke test for all profiles on Windows on CI (rust-lang/rustc-perf#2503)
Update cargo submodule ## src/tools/cargo 20 commits in 3efb1f477e99b42974b982d939fd100303cdf7db..a09737c688e6b643b3a2e185d076bb4a298d6965 2026-07-17 23:53:19 +0000 to 2026-07-26 15:00:33 +0000 - fix(cli): don't panic during completions when rustup is unavailable (rust-lang/cargo#17263) - docs(workspace): add recommended structure to members field (rust-lang/cargo#17166) - Update cargo-fetch.md to remove cargo-prefetch reference (rust-lang/cargo#16568) - chore: bump to `libgit2-sys@0.18.7+1.9.6` (rust-lang/cargo#17259) - Enable build-dir layout v2 on nightly by default (rust-lang/cargo#17258) - fix(path): clarify error message when path dependency has wrong package (rust-lang/cargo#16927) - fix(toml): warn on hyphenated lint names and duplicates (rust-lang/cargo#17051) - fix(test): gate trim-paths tests on split debuginfo support (rust-lang/cargo#17256) - test(git): Explicitly test for git injection attacks (rust-lang/cargo#17253) - fix(git): Suggest libgit2 if git-cli fails (rust-lang/cargo#17252) - fix(diag): bound transitive unused dependency traversal (rust-lang/cargo#17251) - fix(git): Hide git fetch output without progress (rust-lang/cargo#17243) - revert(lint): Remove `new_implicit_minimum_version_req` (rust-lang/cargo#16321) (rust-lang/cargo#17249) - fix: Add haiku's dylib path (rust-lang/cargo#17248) - Zsh completion: Add `-p` and `--package` flags for `cargo add` (rust-lang/cargo#17247) - refactor(source): Clarify the name of the remote git registry (rust-lang/cargo#17240) - fix(timings): only report units the job queue actually ran (rust-lang/cargo#17238) - Do not include proc-macro deps in rustc search path args (rust-lang/cargo#17236) - chore(deps): update cargo-semver-checks to v0.49.0 (rust-lang/cargo#17237) - rustdoc: rename the doc parts metadata params (rust-lang/cargo#17234) ## src/tools/rustc-perf 12 commits in 0508bdcd37152b28c39b6752828683cdd3f128b5..74ecbcdf88411937a6e39baf2779948565dfd388 2026-07-15 10:20:27 +0000 to 2026-07-27 15:02:48 +0000 - feat: support `@argfile` for rustc-fake (rust-lang/rustc-perf#2509) - Download Clippy when a Clippy profile is requested (rust-lang/rustc-perf#2508) - Add early check for missing rustdoc/clippy in a toolchain (rust-lang/rustc-perf#2507) - Add 2026-07-21 triage (rust-lang/rustc-perf#2506) - use stable extract_if: since 1.87 (rust-lang/rustc-perf#2191) - Update GitHub Actions (rust-lang/rustc-perf#2460) - Update dependency @types/msgpack-lite to v0.1.12 (rust-lang/rustc-perf#2439) - Add 30 day history link to artifact size tab on the compare page (rust-lang/rustc-perf#2505) - Fix selecting color for the bootstrap chart on the toolchain page (rust-lang/rustc-perf#2504) - Add artifact size history chart to toolchain page (rust-lang/rustc-perf#2501) - Parallel frontend compiler support (perf backend only) (rust-lang/rustc-perf#2491) - Run benchmark smoke test for all profiles on Windows on CI (rust-lang/rustc-perf#2503)
Update cargo submodule ## src/tools/cargo 23 commits in 3efb1f477e99b42974b982d939fd100303cdf7db..7c83d4cc0953b81d823e47d640c64da9b8bd4fac 2026-07-17 23:53:19 +0000 to 2026-07-29 21:34:53 +0000 - fix: Pass rustdoc flags to final CCI merge step (rust-lang/cargo#17269) - Reworked how we enable the new build-dir layout on nightly (rust-lang/cargo#17272) - Allow setting `-Zembed-metadata` value from the config (rust-lang/cargo#17266) - fix(cli): don't panic during completions when rustup is unavailable (rust-lang/cargo#17263) - docs(workspace): add recommended structure to members field (rust-lang/cargo#17166) - Update cargo-fetch.md to remove cargo-prefetch reference (rust-lang/cargo#16568) - chore: bump to `libgit2-sys@0.18.7+1.9.6` (rust-lang/cargo#17259) - Enable build-dir layout v2 on nightly by default (rust-lang/cargo#17258) - fix(path): clarify error message when path dependency has wrong package (rust-lang/cargo#16927) - fix(toml): warn on hyphenated lint names and duplicates (rust-lang/cargo#17051) - fix(test): gate trim-paths tests on split debuginfo support (rust-lang/cargo#17256) - test(git): Explicitly test for git injection attacks (rust-lang/cargo#17253) - fix(git): Suggest libgit2 if git-cli fails (rust-lang/cargo#17252) - fix(diag): bound transitive unused dependency traversal (rust-lang/cargo#17251) - fix(git): Hide git fetch output without progress (rust-lang/cargo#17243) - revert(lint): Remove `new_implicit_minimum_version_req` (rust-lang/cargo#16321) (rust-lang/cargo#17249) - fix: Add haiku's dylib path (rust-lang/cargo#17248) - Zsh completion: Add `-p` and `--package` flags for `cargo add` (rust-lang/cargo#17247) - refactor(source): Clarify the name of the remote git registry (rust-lang/cargo#17240) - fix(timings): only report units the job queue actually ran (rust-lang/cargo#17238) - Do not include proc-macro deps in rustc search path args (rust-lang/cargo#17236) - chore(deps): update cargo-semver-checks to v0.49.0 (rust-lang/cargo#17237) - rustdoc: rename the doc parts metadata params (rust-lang/cargo#17234) ## src/tools/rustc-perf 12 commits in 0508bdcd37152b28c39b6752828683cdd3f128b5..74ecbcdf88411937a6e39baf2779948565dfd388 2026-07-15 10:20:27 +0000 to 2026-07-27 15:02:48 +0000 - feat: support `@argfile` for rustc-fake (rust-lang/rustc-perf#2509) - Download Clippy when a Clippy profile is requested (rust-lang/rustc-perf#2508) - Add early check for missing rustdoc/clippy in a toolchain (rust-lang/rustc-perf#2507) - Add 2026-07-21 triage (rust-lang/rustc-perf#2506) - use stable extract_if: since 1.87 (rust-lang/rustc-perf#2191) - Update GitHub Actions (rust-lang/rustc-perf#2460) - Update dependency @types/msgpack-lite to v0.1.12 (rust-lang/rustc-perf#2439) - Add 30 day history link to artifact size tab on the compare page (rust-lang/rustc-perf#2505) - Fix selecting color for the bootstrap chart on the toolchain page (rust-lang/rustc-perf#2504) - Add artifact size history chart to toolchain page (rust-lang/rustc-perf#2501) - Parallel frontend compiler support (perf backend only) (rust-lang/rustc-perf#2491) - Run benchmark smoke test for all profiles on Windows on CI (rust-lang/rustc-perf#2503)
Update cargo submodule ## src/tools/cargo 23 commits in 3efb1f477e99b42974b982d939fd100303cdf7db..7c83d4cc0953b81d823e47d640c64da9b8bd4fac 2026-07-17 23:53:19 +0000 to 2026-07-29 21:34:53 +0000 - fix: Pass rustdoc flags to final CCI merge step (rust-lang/cargo#17269) - Reworked how we enable the new build-dir layout on nightly (rust-lang/cargo#17272) - Allow setting `-Zembed-metadata` value from the config (rust-lang/cargo#17266) - fix(cli): don't panic during completions when rustup is unavailable (rust-lang/cargo#17263) - docs(workspace): add recommended structure to members field (rust-lang/cargo#17166) - Update cargo-fetch.md to remove cargo-prefetch reference (rust-lang/cargo#16568) - chore: bump to `libgit2-sys@0.18.7+1.9.6` (rust-lang/cargo#17259) - Enable build-dir layout v2 on nightly by default (rust-lang/cargo#17258) - fix(path): clarify error message when path dependency has wrong package (rust-lang/cargo#16927) - fix(toml): warn on hyphenated lint names and duplicates (rust-lang/cargo#17051) - fix(test): gate trim-paths tests on split debuginfo support (rust-lang/cargo#17256) - test(git): Explicitly test for git injection attacks (rust-lang/cargo#17253) - fix(git): Suggest libgit2 if git-cli fails (rust-lang/cargo#17252) - fix(diag): bound transitive unused dependency traversal (rust-lang/cargo#17251) - fix(git): Hide git fetch output without progress (rust-lang/cargo#17243) - revert(lint): Remove `new_implicit_minimum_version_req` (rust-lang/cargo#16321) (rust-lang/cargo#17249) - fix: Add haiku's dylib path (rust-lang/cargo#17248) - Zsh completion: Add `-p` and `--package` flags for `cargo add` (rust-lang/cargo#17247) - refactor(source): Clarify the name of the remote git registry (rust-lang/cargo#17240) - fix(timings): only report units the job queue actually ran (rust-lang/cargo#17238) - Do not include proc-macro deps in rustc search path args (rust-lang/cargo#17236) - chore(deps): update cargo-semver-checks to v0.49.0 (rust-lang/cargo#17237) - rustdoc: rename the doc parts metadata params (rust-lang/cargo#17234) ## src/tools/rustc-perf 12 commits in 0508bdcd37152b28c39b6752828683cdd3f128b5..74ecbcdf88411937a6e39baf2779948565dfd388 2026-07-15 10:20:27 +0000 to 2026-07-27 15:02:48 +0000 - feat: support `@argfile` for rustc-fake (rust-lang/rustc-perf#2509) - Download Clippy when a Clippy profile is requested (rust-lang/rustc-perf#2508) - Add early check for missing rustdoc/clippy in a toolchain (rust-lang/rustc-perf#2507) - Add 2026-07-21 triage (rust-lang/rustc-perf#2506) - use stable extract_if: since 1.87 (rust-lang/rustc-perf#2191) - Update GitHub Actions (rust-lang/rustc-perf#2460) - Update dependency @types/msgpack-lite to v0.1.12 (rust-lang/rustc-perf#2439) - Add 30 day history link to artifact size tab on the compare page (rust-lang/rustc-perf#2505) - Fix selecting color for the bootstrap chart on the toolchain page (rust-lang/rustc-perf#2504) - Add artifact size history chart to toolchain page (rust-lang/rustc-perf#2501) - Parallel frontend compiler support (perf backend only) (rust-lang/rustc-perf#2491) - Run benchmark smoke test for all profiles on Windows on CI (rust-lang/rustc-perf#2503)
Four independent breakages, all found while investigating the red build on b4b80f8. 1. FIPS integrity test aborts under cargo build-dir layout v2 --------------------------------------------------------------- `path_looks_like_latticearc_module` required the running binary's parent directory to be literally `deps`. Layout v2 moved unit test binaries from target/<triple>/<profile>/deps/<crate>-<hash> to target/<triple>/<profile>/build/<pkg>/<hash>/out/<crate>-<hash> so every test binary began failing that check. The rejection failed the module integrity test, failed the power-up self-test, and hit FIPS 140-3 section 9.1's `process::abort()` - SIGABRT-ing the test runner before a single result was reported. This surfaced on the weekly ASan/TSan/LSan jobs, the only ones pinned to nightly: all three aborted at `self_test::tests::test_initialize_and_test_sets_flag_succeeds` once rust-lang/cargo#17258 (merged 2026-07-24) made layout v2 the nightly default. Layout v2 is stabilized for 1.99.0 by rust-lang/cargo#16807, so this was days from reaching every `cargo test` on stable - including downstream consumers whose suites call `initialize_and_test()`. The check now matches on the two properties cargo does not document as internal: the `<crate-name>-<16-hex>` file-name shape, and containment under a `target` ancestor. Cargo explicitly reserves the right to reshuffle the build-dir layout, so pinning an intermediate directory name would only queue the same outage up for layout v3. Consequences of the wider match: * `target/<profile>/<crate>-<hex>` (no intervening artifact dir) is now accepted. It is a legitimate build-tree artifact. * The ancestor walk is bounded at 12 hops rather than 8. The bound only stops the walk reaching the filesystem root; it is not a trust boundary, and sizing it flush against the deepest layout known today is what caused this outage. Module authenticity is unchanged: it is established by HMAC over the binary, not by path. The helper's actual job - distinguishing our own artifact from a Python/Node host process that dlopen'd the library - still rejects every host-interpreter path. Verified against a real layout-v2 build (`cargo +nightly test -Zbuild-dir-new-layout`), which places the binary at `target/debug/build/latticearc/<hash>/out/latticearc-<hash>`: the integrity test returns Ok and `test_initialize_and_test_sets_flag_succeeds` passes instead of aborting. Both layouts are pinned in the unit tests so a future re-narrowing fails loudly rather than at POST. 2. Feature Flag Powerset never completed, and never went red --------------------------------------------------------------- Every scheduled run was killed at exactly 6h00m: 30736018769 cancelled 6h0m22s 2026-08-02 30191256595 cancelled 6h0m19s 2026-07-26 29676467815 cancelled 6h0m19s 2026-07-19 29182750237 cancelled 6h0m21s 2026-07-12 28733241736 cancelled 6h0m22s 2026-07-05 28315598345 cancelled 6h0m19s 2026-06-28 Six hours is a hard GitHub limit on job execution time for hosted runners. `timeout-minutes` can only lower it, never raise it, so the `timeout-minutes: 720` this workflow carried - added specifically to escape the cap, per its own header comment - had no effect. And because the cap terminates a job as `cancelled` rather than `failure`, the workflow never rendered red: the check silently provided zero coverage for over a month. * Shard the sweep across an 8-way matrix using `cargo hack --partition M/8`. The powerset is 5119 combinations (measured via `--print-command-list`), so each shard runs ~640. `--partition` assigns each run to exactly one shard - contiguous, disjoint blocks of `ceil(total/N)` - so the shards cover the sweep exactly once. * Set `timeout-minutes: 300`, below the cap, so an overrun is killed by us as a visible `failure` rather than silently by GitHub. * `fail-fast: false`, so one shard failing does not discard the other seven results. * Key the cargo cache per shard; eight jobs sharing one key would race on save. `restore-keys` lets a cold shard warm from a sibling. The header comment is rewritten to record why `timeout-minutes` cannot raise the cap, so the next person to hit a shard timeout raises the partition count instead of the timeout. 3. One failed commit bricked every later commit --------------------------------------------------------------- The hook builds its test log with mktemp "$TEST_LOG_DIR/pre-commit-test-output.XXXXXX.log" BSD `mktemp` (macOS, where this hook actually runs) only substitutes a trailing run of `X`s. Given `...XXXXXX.log` it expands nothing and tries to create a file named literally `pre-commit-test-output.XXXXXX.log`. That succeeds the first time - and since the log is deliberately PRESERVED on failure, every subsequent commit then died with mktemp: mkstemp failed on .../pre-commit-test-output.XXXXXX.log: File exists before running a single test. A single failed commit permanently blocked all later commits until someone manually deleted the file. A stale log from 2026-08-02 was doing exactly that. Moving the `X`s to the end (`pre-commit-test-output.log.XXXXXX`) restores per-run unique names on both BSD and GNU mktemp; verified that two successive calls now yield distinct paths. `mktemp -d` at line 436 already had the `X`s trailing and was unaffected. The comment records why the suffix must not be moved back. 4. Flaky FIPS global-state test --------------------------------------------------------------- `test_get_fips_validation_result_consistency_succeeds` intermittently failed at global.rs:375 comparing two consecutive reads of `FIPS_VALIDATION_RESULT` - caught in a preserved hook log from 2026-08-02, and passing on the very next full run. `FIPS_GLOBAL_SERIAL` exists precisely to serialize this, and the reader does hold it across both reads. The hole is on the writer side: of the three writers of `FIPS_VALIDATION_RESULT` in this module, only one took the guard. * `ensure_initialized_for_test` did a check-then-act on `FIPS_INITIALIZED` with no guard, so several tests could all observe `false`, each run `validate_module()` (a fresh `validation_id` per call) and each `replace()` the global. * `test_init_lock_and_store_result_succeeds` replaced the global unconditionally on every run, guardless - the guaranteed writer, and the most likely source of the observed interleaving. Both now take `FIPS_GLOBAL_SERIAL`, and `ensure_initialized_for_test` re-checks the flag under the guard so initialization happens exactly once. The guard's doc comment now states the actual invariant - every writer holds it, not just store-then-read tests - and warns that it is a plain non-reentrant `Mutex`, so a guard holder must not call `ensure_initialized_for_test`. Confirmed the globals are `pub(crate)` but touched only in this module, and that `tests/tests/` merely replicates these code paths in a separate binary, so there is no cross-module or cross-binary writer left out. Verified by A/B stress of the module, same binary, same loop: pre-fix 600 iterations 7 failures post-fix 900 iterations 0 failures Every pre-fix failure was `test_get_fips_validation_result_consistency_succeeds`, matching the 2026-08-02 log. The full 510-test binary also passes 20 consecutive runs, so the added guard introduces no contention or deadlock with the module's other tests. Not fixed here: `performance.yml` carries the same layout-v1 assumption (`find target/{release,debug}/deps -name 'latticearc-*'`) in its two profiling steps. That workflow is dormant - every trigger is commented out and it last ran 2026-02-05 - so it is left alone, but it needs the same treatment before those triggers are re-enabled.
What does this PR try to resolve?
This PR enables the new
build-diron nightly by default.The majority of changes were taken/adapted from #16807
Tracked in #15010
How to test and review this PR?
Same as the original stabilization PR.
The notable changes are:
p.cargo()use a mixture of stable and nightlyp.cargo()as the tests are specifically testing for rebuilds.