Skip to content

Commit b9767f1

Browse files
committed
feat: Stablize build-dir layout v2
1 parent 324047c commit b9767f1

54 files changed

Lines changed: 1015 additions & 1133 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/cargo/core/features.rs

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ macro_rules! unstable_cli_options {
814814
/// Cargo, like `rustc`, accepts a suite of `-Z` flags which are intended for
815815
/// gating unstable functionality to Cargo. These flags are only available on
816816
/// the nightly channel of Cargo.
817-
#[derive(Default, Debug, Deserialize)]
817+
#[derive(Debug, Deserialize)]
818818
#[serde(default, rename_all = "kebab-case")]
819819
pub struct CliUnstable {
820820
$(
@@ -852,6 +852,68 @@ macro_rules! unstable_cli_options {
852852
}
853853
}
854854

855+
// TODO: Move this back to derive(Default) once `build_dir_new_layout` is stabilized and the old
856+
// layout has been removed.
857+
impl Default for CliUnstable {
858+
fn default() -> Self {
859+
Self {
860+
build_dir_new_layout: !is_new_build_dir_layout_opt_out(),
861+
862+
allow_features: Default::default(),
863+
print_im_a_teapot: Default::default(),
864+
advanced_env: Default::default(),
865+
any_build_script_metadata: Default::default(),
866+
asymmetric_token: Default::default(),
867+
avoid_dev_deps: Default::default(),
868+
binary_dep_depinfo: Default::default(),
869+
bindeps: Default::default(),
870+
build_analysis: Default::default(),
871+
build_std: Default::default(),
872+
build_std_features: Default::default(),
873+
cargo_lints: Default::default(),
874+
checksum_freshness: Default::default(),
875+
codegen_backend: Default::default(),
876+
direct_minimal_versions: Default::default(),
877+
dual_proc_macros: Default::default(),
878+
feature_unification: Default::default(),
879+
features: Default::default(),
880+
fine_grain_locking: Default::default(),
881+
fix_edition: Default::default(),
882+
gc: Default::default(),
883+
git: Default::default(),
884+
gitoxide: Default::default(),
885+
host_config: Default::default(),
886+
json_target_spec: Default::default(),
887+
minimal_versions: Default::default(),
888+
msrv_policy: Default::default(),
889+
mtime_on_use: Default::default(),
890+
next_lockfile_bump: Default::default(),
891+
no_embed_metadata: Default::default(),
892+
no_index_update: Default::default(),
893+
panic_abort_tests: Default::default(),
894+
panic_immediate_abort: Default::default(),
895+
profile_hint_mostly_unused: Default::default(),
896+
profile_rustflags: Default::default(),
897+
public_dependency: Default::default(),
898+
publish_timeout: Default::default(),
899+
root_dir: Default::default(),
900+
rustc_unicode: Default::default(),
901+
rustdoc_depinfo: Default::default(),
902+
rustdoc_map: Default::default(),
903+
rustdoc_mergeable_info: Default::default(),
904+
rustdoc_scrape_examples: Default::default(),
905+
sbom: Default::default(),
906+
script: Default::default(),
907+
section_timings: Default::default(),
908+
separate_nightlies: Default::default(),
909+
skip_rustdoc_fingerprint: Default::default(),
910+
target_applies_to_host: Default::default(),
911+
trim_paths: Default::default(),
912+
unstable_options: Default::default(),
913+
}
914+
}
915+
}
916+
855917
unstable_cli_options!(
856918
// Permanently unstable features:
857919
allow_features: Option<AllowFeatures> = ("Allow *only* the listed unstable features"),
@@ -1003,6 +1065,8 @@ const STABILIZED_LOCKFILE_PATH: &str = "The `lockfile-path` config key is now al
10031065

10041066
const STABILIZED_WARNINGS: &str = "The `build.warnings` config key is now always available";
10051067

1068+
const STABILIZED_BUILD_DIR_NEW_LAYOUT: &str = "build.build-dir-new-layout is now always enabled.";
1069+
10061070
fn deserialize_comma_separated_list<'de, D>(
10071071
deserializer: D,
10081072
) -> Result<Option<Vec<String>>, D::Error>
@@ -1399,6 +1463,7 @@ impl CliUnstable {
13991463
"config-include" => stabilized_warn(k, "1.93", STABILIZED_CONFIG_INCLUDE),
14001464
"lockfile-path" => stabilized_warn(k, "1.97", STABILIZED_LOCKFILE_PATH),
14011465
"warnings" => stabilized_warn(k, "1.97", STABILIZED_WARNINGS),
1466+
"build-dir-new-layout" => stabilized_warn(k, "1.98", STABILIZED_BUILD_DIR_NEW_LAYOUT),
14021467

14031468
// Unstable features
14041469
// Sorted alphabetically:
@@ -1409,7 +1474,6 @@ impl CliUnstable {
14091474
"binary-dep-depinfo" => self.binary_dep_depinfo = parse_empty(k, v)?,
14101475
"bindeps" => self.bindeps = parse_empty(k, v)?,
14111476
"build-analysis" => self.build_analysis = parse_empty(k, v)?,
1412-
"build-dir-new-layout" => self.build_dir_new_layout = parse_empty(k, v)?,
14131477
"build-std" => self.build_std = Some(parse_list(v)),
14141478
"build-std-features" => self.build_std_features = Some(parse_list(v)),
14151479
"cargo-lints" => self.cargo_lints = parse_empty(k, v)?,

src/doc/src/reference/build-cache.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,10 @@ change. Some of these directories are:
7070

7171
Directory | Description
7272
----------|------------
73-
<code style="white-space: nowrap">\<build-dir>/debug/deps/</code> | Dependencies and other artifacts.
7473
<code style="white-space: nowrap">\<build-dir>/debug/incremental/</code> | `rustc` [incremental output], a cache used to speed up subsequent builds.
75-
<code style="white-space: nowrap">\<build-dir>/debug/build/</code> | Output from [build scripts].
74+
<code style="white-space: nowrap">\<build-dir>/debug/build/</code> | Build step results including compilation artifacts and [build script] output.
75+
76+
> **Note**: The build-dir layout was changed in Cargo 1.98.0, thus prior versions use a different layout. (see [#15010](https://github.com/rust-lang/cargo/issues/15010))
7677
7778
## Dep-info files
7879

@@ -107,7 +108,7 @@ configuration][config]. Refer to sccache documentation for more details.
107108
[`cargo doc`]: ../commands/cargo-doc.md
108109
[`cargo package`]: ../commands/cargo-package.md
109110
[`cargo publish`]: ../commands/cargo-publish.md
110-
[build scripts]: ../reference/build-scripts.md
111+
[build script]: ../reference/build-scripts.md
111112
[config]: ../reference/config.md
112113
[def-workspace]: ../appendix/glossary.md#workspace '"workspace" (glossary entry)'
113114
[target]: ../appendix/glossary.md#target '"target" (glossary entry)'

src/doc/src/reference/unstable.md

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ Each new feature described below should explain how to use it.
8282
* [lockfile-publish-time](#lockfile-publish-time) --- Limit resolver to packages older than the specified time
8383
* Output behavior
8484
* [artifact-dir](#artifact-dir) --- Adds a directory where artifacts are copied to.
85-
* [build-dir-new-layout](#build-dir-new-layout) --- Enables the new build-dir filesystem layout
8685
* [Different binary name](#different-binary-name) --- Assign a name to the built binary that is separate from the crate name.
8786
* [root-dir](#root-dir) --- Controls the root directory relative to which paths are printed
8887
* Compile behavior
@@ -1956,14 +1955,6 @@ The following commands are available under `-Zbuild-analysis`:
19561955
- `cargo report rebuilds` --- Reports why crates were rebuilt,
19571956
helping diagnose unexpected recompilations.
19581957

1959-
## build-dir-new-layout
1960-
1961-
* Tracking Issue: [#15010](https://github.com/rust-lang/cargo/issues/15010)
1962-
1963-
Enables the new build-dir filesystem layout.
1964-
This layout change unblocks work towards caching and locking improvements.
1965-
1966-
19671958
## compile-time-deps
19681959

19691960
This permanently-unstable flag to only build proc-macros and build scripts (and their required dependencies),
@@ -2300,3 +2291,7 @@ Support for `resolver.lockfile-path` config field has been stabilized in Rust 1.
23002291
## warnings
23012292

23022293
The `build.warnings` config field has been stabilized in Rust 1.97.
2294+
2295+
## build-dir-new-layout
2296+
2297+
The new build-dir filesystem layout was stabilized in the 1.98.0 release.

tests/build-std/main.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,9 @@ fn basic() {
168168
[COMPILING] [..]
169169
...
170170
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
171-
[RUNNING] unittests src/lib.rs (target/[HOST_TARGET]/debug/deps/foo-[HASH])
172-
[RUNNING] unittests src/main.rs (target/[HOST_TARGET]/debug/deps/foo-[HASH])
173-
[RUNNING] tests/smoke.rs (target/[HOST_TARGET]/debug/deps/smoke-[HASH])
171+
[RUNNING] unittests src/lib.rs (target/[HOST_TARGET]/debug/build/foo/[HASH]/out/foo-[HASH])
172+
[RUNNING] unittests src/main.rs (target/[HOST_TARGET]/debug/build/foo/[HASH]/out/foo-[HASH])
173+
[RUNNING] tests/smoke.rs (target/[HOST_TARGET]/debug/build/foo/[HASH]/out/smoke-[HASH])
174174
[DOCTEST] foo
175175
176176
"#]])
@@ -180,9 +180,9 @@ fn basic() {
180180
let deps_dir = Path::new("target")
181181
.join(rustc_host())
182182
.join("debug")
183-
.join("deps");
184-
assert!(p.glob(deps_dir.join("*.rlib")).count() > 0);
185-
assert_eq!(p.glob(deps_dir.join("*.dylib")).count(), 0);
183+
.join("build");
184+
assert!(p.glob(deps_dir.join("**/*.rlib")).count() > 0);
185+
assert_eq!(p.glob(deps_dir.join("**/*.dylib")).count(), 0);
186186
}
187187

188188
#[cargo_test(build_std_real)]
@@ -432,7 +432,7 @@ fn test_proc_macro() {
432432
...
433433
[COMPILING] foo v0.0.0 ([ROOT]/foo)
434434
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
435-
[RUNNING] unittests src/lib.rs (target/debug/deps/foo-[HASH])
435+
[RUNNING] unittests src/lib.rs (target/debug/build/foo/[HASH]/out/foo-[HASH])
436436
437437
"#]])
438438
.run();

tests/testsuite/artifact_dep.rs

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -620,25 +620,25 @@ fn build_script_with_bin_artifacts() {
620620
assert_e2e().eq(
621621
&build_script_output,
622622
str![[r#"
623-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/bin/baz[EXE]
624-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/staticlib/bar-[HASH].lib
625-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/cdylib/bar.dll
626-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/bin
627-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/bin/bar[EXE]
628-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/bin/bar[EXE]
623+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/bin/baz[EXE]
624+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/staticlib/bar-[HASH].lib
625+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/cdylib/bar.dll
626+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/bin
627+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/bin/bar[EXE]
628+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/bin/bar[EXE]
629629
630630
"#]],
631631
);
632632
} else {
633633
assert_e2e().eq(
634634
&build_script_output,
635635
str![[r#"
636-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/bin/baz-[HASH][EXE]
637-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/staticlib/libbar-[HASH].a
638-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/cdylib/[..]bar.[..]
639-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/bin
640-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/bin/bar-[HASH][EXE]
641-
[ROOT]/foo/target/debug/deps/artifact/bar-[HASH]/bin/bar-[HASH][EXE]
636+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/bin/baz[EXE]
637+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/staticlib/libbar-[HASH].a
638+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/cdylib/[..]bar.[..]
639+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/bin
640+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/bin/bar[EXE]
641+
[ROOT]/foo/target/debug/build/bar/[HASH]/artifact/bin/bar[EXE]
642642
643643
"#]],
644644
);
@@ -810,17 +810,17 @@ fn build_script_with_selected_dashed_bin_artifact_and_lib_true() {
810810
assert_e2e().eq(
811811
&build_script_output,
812812
str![[r#"
813-
[ROOT]/foo/target/debug/deps/artifact/bar-baz-[HASH]/bin
814-
[ROOT]/foo/target/debug/deps/artifact/bar-baz-[HASH]/bin/baz_suffix[EXE]
813+
[ROOT]/foo/target/debug/build/bar-baz/[HASH]/artifact/bin
814+
[ROOT]/foo/target/debug/build/bar-baz/[HASH]/artifact/bin/baz_suffix[EXE]
815815
816816
"#]],
817817
);
818818
} else {
819819
assert_e2e().eq(
820820
&build_script_output,
821821
str![[r#"
822-
[ROOT]/foo/target/debug/deps/artifact/bar-baz-[HASH]/bin
823-
[ROOT]/foo/target/debug/deps/artifact/bar-baz-[HASH]/bin/baz_suffix-[HASH][EXE]
822+
[ROOT]/foo/target/debug/build/bar-baz/[HASH]/artifact/bin
823+
[ROOT]/foo/target/debug/build/bar-baz/[HASH]/artifact/bin/baz_suffix[EXE]
824824
825825
"#]],
826826
);
@@ -830,7 +830,7 @@ fn build_script_with_selected_dashed_bin_artifact_and_lib_true() {
830830
!p.bin("bar").is_file(),
831831
"artifacts are located in their own directory, exclusively, and won't be lifted up"
832832
);
833-
assert_artifact_executable_output(&p, "debug", "bar", "baz_suffix");
833+
assert_artifact_executable_output(&p, "debug", "bar-baz", "baz_suffix");
834834
}
835835

836836
#[cargo_test]
@@ -900,7 +900,7 @@ fn lib_with_selected_dashed_bin_artifact_and_lib_true() {
900900
!p.bin("bar").is_file(),
901901
"artifacts are located in their own directory, exclusively, and won't be lifted up"
902902
);
903-
assert_artifact_executable_output(&p, "debug", "bar", "baz_suffix");
903+
assert_artifact_executable_output(&p, "debug", "bar-baz", "baz_suffix");
904904
}
905905

906906
#[cargo_test]
@@ -943,7 +943,7 @@ fn allow_artifact_and_no_artifact_dep_to_same_package_within_different_dep_categ
943943
[COMPILING] bar v0.5.0 ([ROOT]/foo/bar)
944944
[COMPILING] foo v0.0.0 ([ROOT]/foo)
945945
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
946-
[RUNNING] unittests src/lib.rs (target/debug/deps/foo-[HASH][EXE])
946+
[RUNNING] unittests src/lib.rs (target/debug/build/foo/[HASH]/out/foo-[HASH][EXE])
947947
[DOCTEST] foo
948948
949949
"#]])
@@ -1292,7 +1292,7 @@ fn cross_doctests_works_with_artifacts() {
12921292
[COMPILING] bar v0.5.0 ([ROOT]/foo/bar)
12931293
[COMPILING] foo v0.0.1 ([ROOT]/foo)
12941294
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
1295-
[RUNNING] unittests src/lib.rs (target/[HOST_TARGET]/debug/deps/foo-[HASH][EXE])
1295+
[RUNNING] unittests src/lib.rs (target/[HOST_TARGET]/debug/build/foo/[HASH]/out/foo-[HASH][EXE])
12961296
[DOCTEST] foo
12971297
12981298
"#]])
@@ -1316,7 +1316,7 @@ fn cross_doctests_works_with_artifacts() {
13161316
[RUNNING] `rustc --crate-name foo [..]
13171317
[RUNNING] `rustc --crate-name foo [..]
13181318
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
1319-
[RUNNING] `[ROOT]/foo/target/[ALT_TARGET]/debug/deps/foo-[HASH][EXE]`
1319+
[RUNNING] `[ROOT]/foo/target/[ALT_TARGET]/debug/build/foo/[HASH]/out/foo-[HASH][EXE]`
13201320
[DOCTEST] foo
13211321
[RUNNING] `rustdoc [..]--test src/lib.rs --test-run-directory [ROOT]/foo --target [ALT_TARGET] [..]
13221322
@@ -1422,7 +1422,7 @@ fn profile_override_basic() {
14221422
[RUNNING] `rustc --crate-name bar --edition=2015 bar/src/lib.rs [..] -C opt-level=1 [..]`
14231423
[RUNNING] `rustc --crate-name bar --edition=2015 bar/src/lib.rs [..] -C opt-level=3 [..]`
14241424
[RUNNING] `rustc --crate-name foo [..] -C opt-level=3 [..]`
1425-
[RUNNING] `[ROOT]/foo/target/debug/build/foo-[HASH]/build-script-build`
1425+
[RUNNING] `[ROOT]/foo/target/debug/build/foo/[HASH]/out/build_script_build`
14261426
[FINISHED] `dev` profile [optimized + debuginfo] target(s) in [ELAPSED]s
14271427
[COMPILING] foo v0.0.1 ([ROOT]/foo)
14281428
@@ -2207,8 +2207,8 @@ fn env_vars_and_build_products_for_various_build_targets() {
22072207
[COMPILING] bar v0.5.0 ([ROOT]/foo/bar)
22082208
[COMPILING] foo v0.0.0 ([ROOT]/foo)
22092209
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
2210-
[RUNNING] unittests src/lib.rs (target/debug/deps/foo-[HASH][EXE])
2211-
[RUNNING] tests/main.rs (target/debug/deps/main-[HASH][EXE])
2210+
[RUNNING] unittests src/lib.rs (target/debug/build/foo/[HASH]/out/foo-[HASH][EXE])
2211+
[RUNNING] tests/main.rs (target/debug/build/foo/[HASH]/out/main-[HASH][EXE])
22122212
[DOCTEST] foo
22132213
22142214
"#]])
@@ -2416,7 +2416,11 @@ fn doc_lib_true() {
24162416

24172417
// Verify that it emits rmeta for the bin and lib dependency.
24182418
assert_eq!(p.glob("target/debug/artifact/*.rlib").count(), 0);
2419-
assert_eq!(p.glob("target/debug/deps/libbar-*.rmeta").count(), 2);
2419+
assert_eq!(
2420+
p.glob("target/debug/build/bar/*/out/libbar-*.rmeta")
2421+
.count(),
2422+
2
2423+
);
24202424

24212425
p.cargo("doc -Z bindeps")
24222426
.masquerade_as_nightly_cargo(&["bindeps"])
@@ -2508,7 +2512,7 @@ fn assert_artifact_executable_output(
25082512
if cfg!(target_env = "msvc") {
25092513
assert_eq!(
25102514
p.glob(format!(
2511-
"target/{}/deps/artifact/{}-*/bin/{}{}",
2515+
"target/{}/build/{}/*/artifact/bin/{}{}",
25122516
target_name,
25132517
dep_name,
25142518
bin_name,
@@ -2521,7 +2525,7 @@ fn assert_artifact_executable_output(
25212525
} else {
25222526
assert_eq!(
25232527
p.glob(format!(
2524-
"target/{}/deps/artifact/{}-*/bin/{}-*{}",
2528+
"target/{}/build/{}/*/artifact/bin/{}{}",
25252529
target_name,
25262530
dep_name,
25272531
bin_name,
@@ -2538,7 +2542,7 @@ fn assert_artifact_executable_output(
25382542

25392543
fn build_script_output_string(p: &Project, package_name: &str) -> String {
25402544
let paths = p
2541-
.glob(format!("target/debug/build/{}-*/output", package_name))
2545+
.glob(format!("target/debug/build/{}/*/run/stdout", package_name))
25422546
.collect::<Result<Vec<_>, _>>()
25432547
.unwrap();
25442548
assert_eq!(paths.len(), 1);
@@ -2822,7 +2826,7 @@ fn with_assumed_host_target_and_optional_build_dep() {
28222826
[COMPILING] d1 v0.0.1 ([ROOT]/foo/d1)
28232827
[RUNNING] `rustc --crate-name build_script_build --edition=2021 [..]--crate-type bin[..]
28242828
[RUNNING] `rustc --crate-name d1 --edition=2021 [..]--crate-type bin[..]
2825-
[RUNNING] `[ROOT]/foo/target/debug/build/foo-[HASH]/build-script-build`
2829+
[RUNNING] `[ROOT]/foo/target/debug/build/foo/[HASH]/out/build_script_build`
28262830
[RUNNING] `rustc --crate-name foo --edition=2021 [..]--cfg[..]d1[..]
28272831
[FINISHED] `dev` profile [..]
28282832
[COMPILING] foo v0.0.1 ([ROOT]/foo)
@@ -3489,7 +3493,7 @@ fn artifact_dep_target_does_not_propagate_to_deps_of_build_script() {
34893493
[COMPILING] artifact v0.0.1 ([ROOT]/foo/artifact)
34903494
[COMPILING] foo v0.0.1 ([ROOT]/foo)
34913495
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
3492-
[RUNNING] unittests src/main.rs (target/debug/deps/foo-[HASH][EXE])
3496+
[RUNNING] unittests src/main.rs (target/debug/build/foo/[HASH]/out/foo-[HASH][EXE])
34933497
34943498
"#]])
34953499
.masquerade_as_nightly_cargo(&["bindeps"])
@@ -3581,7 +3585,7 @@ fn artifact_dep_target_does_not_propagate_to_proc_macro() {
35813585
[COMPILING] artifact v0.0.1 ([ROOT]/foo/artifact)
35823586
[COMPILING] foo v0.0.1 ([ROOT]/foo)
35833587
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
3584-
[RUNNING] unittests src/main.rs (target/debug/deps/foo-[HASH][EXE])
3588+
[RUNNING] unittests src/main.rs (target/debug/build/foo/[HASH]/out/foo-[HASH][EXE])
35853589
35863590
"#]])
35873591
.masquerade_as_nightly_cargo(&["bindeps"])

0 commit comments

Comments
 (0)