diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index 7f7114131fe..c13163af8b9 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -381,7 +381,21 @@ impl<'cfg> Workspace<'cfg> { pub fn target_dir(&self) -> Filesystem { self.target_dir .clone() - .unwrap_or_else(|| Filesystem::new(self.root().join("target"))) + .unwrap_or_else(|| self.default_target_dir()) + } + + fn default_target_dir(&self) -> Filesystem { + if self.root_maybe().is_embedded() { + let hash = crate::util::hex::short_hash(&self.root_manifest().to_string_lossy()); + let mut rel_path = PathBuf::new(); + rel_path.push("target"); + rel_path.push(&hash[0..2]); + rel_path.push(&hash[2..]); + + self.config().home().join(rel_path) + } else { + Filesystem::new(self.root().join("target")) + } } /// Returns the root `[replace]` section of this workspace. diff --git a/tests/testsuite/script.rs b/tests/testsuite/script.rs index d4f343be644..0b3ace7c503 100644 --- a/tests/testsuite/script.rs +++ b/tests/testsuite/script.rs @@ -35,7 +35,7 @@ args: [] [WARNING] `package.edition` is unspecifiead, defaulting to `2021` [COMPILING] echo v0.0.0 ([ROOT]/foo) [FINISHED] dev [unoptimized + debuginfo] target(s) in [..]s -[RUNNING] `[..]debug/echo[EXE]` +[RUNNING] `[..]/debug/echo[EXE]` ", ) .run(); @@ -537,3 +537,28 @@ fn main() { ) .run(); } + +#[cargo_test] +fn implicit_target_dir() { + let script = ECHO_SCRIPT; + let p = cargo_test_support::project() + .file("script.rs", script) + .build(); + + p.cargo("-Zscript script.rs") + .masquerade_as_nightly_cargo(&["script"]) + .with_stdout( + r#"bin: [ROOT]/home/.cargo/target/[..]/debug/script[EXE] +args: [] +"#, + ) + .with_stderr( + "\ +[WARNING] `package.edition` is unspecifiead, defaulting to `2021` +[COMPILING] script v0.0.0 ([ROOT]/foo) +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]s +[RUNNING] `[ROOT]/home/.cargo/target/[..]/debug/script[EXE]` +", + ) + .run(); +}