Skip to content

Commit 9bb9104

Browse files
committed
feat: Stablize build-dir layout v2
1 parent 3fe5198 commit 9bb9104

Some content is hidden

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

54 files changed

+1015
-1112
lines changed

src/cargo/core/features.rs

Lines changed: 68 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,70 @@ 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+
lockfile_path: Default::default(),
888+
minimal_versions: Default::default(),
889+
msrv_policy: Default::default(),
890+
mtime_on_use: Default::default(),
891+
next_lockfile_bump: Default::default(),
892+
no_embed_metadata: Default::default(),
893+
no_index_update: Default::default(),
894+
panic_abort_tests: Default::default(),
895+
panic_immediate_abort: Default::default(),
896+
profile_hint_mostly_unused: Default::default(),
897+
profile_rustflags: Default::default(),
898+
public_dependency: Default::default(),
899+
publish_timeout: Default::default(),
900+
root_dir: Default::default(),
901+
rustc_unicode: Default::default(),
902+
rustdoc_depinfo: Default::default(),
903+
rustdoc_map: Default::default(),
904+
rustdoc_mergeable_info: Default::default(),
905+
rustdoc_scrape_examples: Default::default(),
906+
sbom: Default::default(),
907+
script: Default::default(),
908+
section_timings: Default::default(),
909+
separate_nightlies: Default::default(),
910+
skip_rustdoc_fingerprint: Default::default(),
911+
target_applies_to_host: Default::default(),
912+
trim_paths: Default::default(),
913+
unstable_options: Default::default(),
914+
warnings: Default::default(),
915+
}
916+
}
917+
}
918+
855919
unstable_cli_options!(
856920
// Permanently unstable features:
857921
allow_features: Option<AllowFeatures> = ("Allow *only* the listed unstable features"),
@@ -1001,6 +1065,8 @@ const STABILIZED_BUILD_DIR: &str = "build.build-dir is now always enabled.";
10011065

10021066
const STABILIZED_CONFIG_INCLUDE: &str = "The `include` config key is now always available";
10031067

1068+
const STABILIZED_BUILD_DIR_NEW_LAYOUT: &str = "build.build-dir-new-layout is now always enabled.";
1069+
10041070
fn deserialize_comma_separated_list<'de, D>(
10051071
deserializer: D,
10061072
) -> Result<Option<Vec<String>>, D::Error>
@@ -1395,6 +1461,7 @@ impl CliUnstable {
13951461
"package-workspace" => stabilized_warn(k, "1.89", STABILIZED_PACKAGE_WORKSPACE),
13961462
"build-dir" => stabilized_warn(k, "1.91", STABILIZED_BUILD_DIR),
13971463
"config-include" => stabilized_warn(k, "1.93", STABILIZED_CONFIG_INCLUDE),
1464+
"build-dir-new-layout" => stabilized_warn(k, "1.97", STABILIZED_BUILD_DIR_NEW_LAYOUT),
13981465

13991466
// Unstable features
14001467
// Sorted alphabetically:
@@ -1405,7 +1472,6 @@ impl CliUnstable {
14051472
"binary-dep-depinfo" => self.binary_dep_depinfo = parse_empty(k, v)?,
14061473
"bindeps" => self.bindeps = parse_empty(k, v)?,
14071474
"build-analysis" => self.build_analysis = parse_empty(k, v)?,
1408-
"build-dir-new-layout" => self.build_dir_new_layout = parse_empty(k, v)?,
14091475
"build-std" => self.build_std = Some(parse_list(v)),
14101476
"build-std-features" => self.build_std_features = Some(parse_list(v)),
14111477
"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> | Compilation artifacts and [build script] output.
75+
76+
> **Note**: The build-dir layout was changed in Cargo 1.97.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
@@ -2017,14 +2016,6 @@ The following commands are available under `-Zbuild-analysis`:
20172016
- `cargo report rebuilds` --- Reports why crates were rebuilt,
20182017
helping diagnose unexpected recompilations.
20192018

2020-
## build-dir-new-layout
2021-
2022-
* Tracking Issue: [#15010](https://github.com/rust-lang/cargo/issues/15010)
2023-
2024-
Enables the new build-dir filesystem layout.
2025-
This layout change unblocks work towards caching and locking improvements.
2026-
2027-
20282019
## compile-time-deps
20292020

20302021
This permanently-unstable flag to only build proc-macros and build scripts (and their required dependencies),
@@ -2339,6 +2330,10 @@ Multi-package publishing has been stabilized in Rust 1.90.0.
23392330
Support for `build.build-dir` was stabilized in the 1.91 release.
23402331
See the [config documentation](config.md#buildbuild-dir) for information about changing the build-dir
23412332

2333+
## build-dir-new-layout
2334+
2335+
The new build-dir filesystem layout was stabilized in the 1.97.0 release.
2336+
23422337
## Build-plan
23432338

23442339
The `--build-plan` argument for the `build` command has been removed in 1.93.0-nightly.

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]
@@ -904,7 +904,7 @@ fn lib_with_selected_dashed_bin_artifact_and_lib_true() {
904904
!p.bin("bar").is_file(),
905905
"artifacts are located in their own directory, exclusively, and won't be lifted up"
906906
);
907-
assert_artifact_executable_output(&p, "debug", "bar", "baz_suffix");
907+
assert_artifact_executable_output(&p, "debug", "bar-baz", "baz_suffix");
908908
}
909909

910910
#[cargo_test]
@@ -947,7 +947,7 @@ fn allow_artifact_and_no_artifact_dep_to_same_package_within_different_dep_categ
947947
[COMPILING] bar v0.5.0 ([ROOT]/foo/bar)
948948
[COMPILING] foo v0.0.0 ([ROOT]/foo)
949949
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
950-
[RUNNING] unittests src/lib.rs (target/debug/deps/foo-[HASH][EXE])
950+
[RUNNING] unittests src/lib.rs (target/debug/build/foo/[HASH]/out/foo-[HASH][EXE])
951951
[DOCTEST] foo
952952
953953
"#]])
@@ -1296,7 +1296,7 @@ fn cross_doctests_works_with_artifacts() {
12961296
[COMPILING] bar v0.5.0 ([ROOT]/foo/bar)
12971297
[COMPILING] foo v0.0.1 ([ROOT]/foo)
12981298
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
1299-
[RUNNING] unittests src/lib.rs (target/[HOST_TARGET]/debug/deps/foo-[HASH][EXE])
1299+
[RUNNING] unittests src/lib.rs (target/[HOST_TARGET]/debug/build/foo/[HASH]/out/foo-[HASH][EXE])
13001300
[DOCTEST] foo
13011301
13021302
"#]])
@@ -1320,7 +1320,7 @@ fn cross_doctests_works_with_artifacts() {
13201320
[RUNNING] `rustc --crate-name foo [..]
13211321
[RUNNING] `rustc --crate-name foo [..]
13221322
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
1323-
[RUNNING] `[ROOT]/foo/target/[ALT_TARGET]/debug/deps/foo-[HASH][EXE]`
1323+
[RUNNING] `[ROOT]/foo/target/[ALT_TARGET]/debug/build/foo/[HASH]/out/foo-[HASH][EXE]`
13241324
[DOCTEST] foo
13251325
[RUNNING] `rustdoc [..]--test src/lib.rs --test-run-directory [ROOT]/foo --target [ALT_TARGET] [..]
13261326
@@ -1426,7 +1426,7 @@ fn profile_override_basic() {
14261426
[RUNNING] `rustc --crate-name bar --edition=2015 bar/src/lib.rs [..] -C opt-level=1 [..]`
14271427
[RUNNING] `rustc --crate-name bar --edition=2015 bar/src/lib.rs [..] -C opt-level=3 [..]`
14281428
[RUNNING] `rustc --crate-name foo [..] -C opt-level=3 [..]`
1429-
[RUNNING] `[ROOT]/foo/target/debug/build/foo-[HASH]/build-script-build`
1429+
[RUNNING] `[ROOT]/foo/target/debug/build/foo/[HASH]/out/build_script_build`
14301430
[FINISHED] `dev` profile [optimized + debuginfo] target(s) in [ELAPSED]s
14311431
[COMPILING] foo v0.0.1 ([ROOT]/foo)
14321432
@@ -2211,8 +2211,8 @@ fn env_vars_and_build_products_for_various_build_targets() {
22112211
[COMPILING] bar v0.5.0 ([ROOT]/foo/bar)
22122212
[COMPILING] foo v0.0.0 ([ROOT]/foo)
22132213
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
2214-
[RUNNING] unittests src/lib.rs (target/debug/deps/foo-[HASH][EXE])
2215-
[RUNNING] tests/main.rs (target/debug/deps/main-[HASH][EXE])
2214+
[RUNNING] unittests src/lib.rs (target/debug/build/foo/[HASH]/out/foo-[HASH][EXE])
2215+
[RUNNING] tests/main.rs (target/debug/build/foo/[HASH]/out/main-[HASH][EXE])
22162216
[DOCTEST] foo
22172217
22182218
"#]])
@@ -2420,7 +2420,11 @@ fn doc_lib_true() {
24202420

24212421
// Verify that it emits rmeta for the bin and lib dependency.
24222422
assert_eq!(p.glob("target/debug/artifact/*.rlib").count(), 0);
2423-
assert_eq!(p.glob("target/debug/deps/libbar-*.rmeta").count(), 2);
2423+
assert_eq!(
2424+
p.glob("target/debug/build/bar/*/out/libbar-*.rmeta")
2425+
.count(),
2426+
2
2427+
);
24242428

24252429
p.cargo("doc -Z bindeps")
24262430
.masquerade_as_nightly_cargo(&["bindeps"])
@@ -2512,7 +2516,7 @@ fn assert_artifact_executable_output(
25122516
if cfg!(target_env = "msvc") {
25132517
assert_eq!(
25142518
p.glob(format!(
2515-
"target/{}/deps/artifact/{}-*/bin/{}{}",
2519+
"target/{}/build/{}/*/artifact/bin/{}{}",
25162520
target_name,
25172521
dep_name,
25182522
bin_name,
@@ -2525,7 +2529,7 @@ fn assert_artifact_executable_output(
25252529
} else {
25262530
assert_eq!(
25272531
p.glob(format!(
2528-
"target/{}/deps/artifact/{}-*/bin/{}-*{}",
2532+
"target/{}/build/{}/*/artifact/bin/{}{}",
25292533
target_name,
25302534
dep_name,
25312535
bin_name,
@@ -2542,7 +2546,7 @@ fn assert_artifact_executable_output(
25422546

25432547
fn build_script_output_string(p: &Project, package_name: &str) -> String {
25442548
let paths = p
2545-
.glob(format!("target/debug/build/{}-*/output", package_name))
2549+
.glob(format!("target/debug/build/{}/*/run/stdout", package_name))
25462550
.collect::<Result<Vec<_>, _>>()
25472551
.unwrap();
25482552
assert_eq!(paths.len(), 1);
@@ -2826,7 +2830,7 @@ fn with_assumed_host_target_and_optional_build_dep() {
28262830
[COMPILING] d1 v0.0.1 ([ROOT]/foo/d1)
28272831
[RUNNING] `rustc --crate-name build_script_build --edition=2021 [..]--crate-type bin[..]
28282832
[RUNNING] `rustc --crate-name d1 --edition=2021 [..]--crate-type bin[..]
2829-
[RUNNING] `[ROOT]/foo/target/debug/build/foo-[HASH]/build-script-build`
2833+
[RUNNING] `[ROOT]/foo/target/debug/build/foo/[HASH]/out/build_script_build`
28302834
[RUNNING] `rustc --crate-name foo --edition=2021 [..]--cfg[..]d1[..]
28312835
[FINISHED] `dev` profile [..]
28322836
[COMPILING] foo v0.0.1 ([ROOT]/foo)
@@ -3493,7 +3497,7 @@ fn artifact_dep_target_does_not_propagate_to_deps_of_build_script() {
34933497
[COMPILING] artifact v0.0.1 ([ROOT]/foo/artifact)
34943498
[COMPILING] foo v0.0.1 ([ROOT]/foo)
34953499
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
3496-
[RUNNING] unittests src/main.rs (target/debug/deps/foo-[HASH][EXE])
3500+
[RUNNING] unittests src/main.rs (target/debug/build/foo/[HASH]/out/foo-[HASH][EXE])
34973501
34983502
"#]])
34993503
.masquerade_as_nightly_cargo(&["bindeps"])
@@ -3585,7 +3589,7 @@ fn artifact_dep_target_does_not_propagate_to_proc_macro() {
35853589
[COMPILING] artifact v0.0.1 ([ROOT]/foo/artifact)
35863590
[COMPILING] foo v0.0.1 ([ROOT]/foo)
35873591
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
3588-
[RUNNING] unittests src/main.rs (target/debug/deps/foo-[HASH][EXE])
3592+
[RUNNING] unittests src/main.rs (target/debug/build/foo/[HASH]/out/foo-[HASH][EXE])
35893593
35903594
"#]])
35913595
.masquerade_as_nightly_cargo(&["bindeps"])

0 commit comments

Comments
 (0)