Skip to content

Commit 7ce7c2e

Browse files
authored
Merge pull request #20072 from Veykril/push-sorvvvzskywv
fix: Respect `.cargo/config.toml` `build.target-dir`
2 parents c751049 + c37994c commit 7ce7c2e

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

src/tools/rust-analyzer/crates/project-model/src/env.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Cargo-like environment variables injection.
22
use base_db::Env;
3-
use paths::Utf8Path;
3+
use paths::{Utf8Path, Utf8PathBuf};
44
use rustc_hash::FxHashMap;
55
use toolchain::Tool;
66

@@ -123,6 +123,26 @@ fn parse_output_cargo_config_env(manifest: &ManifestPath, stdout: &str) -> Env {
123123
env
124124
}
125125

126+
pub(crate) fn cargo_config_build_target_dir(
127+
manifest: &ManifestPath,
128+
extra_env: &FxHashMap<String, Option<String>>,
129+
sysroot: &Sysroot,
130+
) -> Option<Utf8PathBuf> {
131+
let mut cargo_config = sysroot.tool(Tool::Cargo, manifest.parent(), extra_env);
132+
cargo_config
133+
.args(["-Z", "unstable-options", "config", "get", "build.target-dir"])
134+
.env("RUSTC_BOOTSTRAP", "1");
135+
if manifest.is_rust_manifest() {
136+
cargo_config.arg("-Zscript");
137+
}
138+
utf8_stdout(&mut cargo_config)
139+
.map(|stdout| {
140+
Utf8Path::new(stdout.trim_start_matches("build.target-dir = ").trim_matches('"'))
141+
.to_owned()
142+
})
143+
.ok()
144+
}
145+
126146
#[test]
127147
fn parse_output_cargo_config_env_works() {
128148
let stdout = r#"

src/tools/rust-analyzer/crates/project-model/src/workspace.rs

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ use crate::{
2626
WorkspaceBuildScripts,
2727
build_dependencies::BuildScriptOutput,
2828
cargo_workspace::{CargoMetadataConfig, DepKind, PackageData, RustLibSource},
29-
env::{cargo_config_env, inject_cargo_env, inject_cargo_package_env, inject_rustc_tool_env},
29+
env::{
30+
cargo_config_build_target_dir, cargo_config_env, inject_cargo_env,
31+
inject_cargo_package_env, inject_rustc_tool_env,
32+
},
3033
project_json::{Crate, CrateArrayIdx},
3134
sysroot::RustLibSrcWorkspace,
3235
toolchain_info::{QueryConfig, rustc_cfg, target_data_layout, target_tuple, version},
@@ -280,8 +283,11 @@ impl ProjectWorkspace {
280283
.ok()
281284
.flatten();
282285

283-
let target_dir =
284-
config.target_dir.clone().unwrap_or_else(|| workspace_dir.join("target").into());
286+
let target_dir = config
287+
.target_dir
288+
.clone()
289+
.or_else(|| cargo_config_build_target_dir(cargo_toml, extra_env, &sysroot))
290+
.unwrap_or_else(|| workspace_dir.join("target").into());
285291

286292
// We spawn a bunch of processes to query various information about the workspace's
287293
// toolchain and sysroot
@@ -452,6 +458,14 @@ impl ProjectWorkspace {
452458
let targets = target_tuple::get(query_config, config.target.as_deref(), &config.extra_env)
453459
.unwrap_or_default();
454460
let toolchain = version::get(query_config, &config.extra_env).ok().flatten();
461+
let project_root = project_json.project_root();
462+
let target_dir = config
463+
.target_dir
464+
.clone()
465+
.or_else(|| {
466+
cargo_config_build_target_dir(project_json.manifest()?, &config.extra_env, &sysroot)
467+
})
468+
.unwrap_or_else(|| project_root.join("target").into());
455469

456470
// We spawn a bunch of processes to query various information about the workspace's
457471
// toolchain and sysroot
@@ -469,18 +483,13 @@ impl ProjectWorkspace {
469483
)
470484
});
471485
let loaded_sysroot = s.spawn(|| {
472-
let project_root = project_json.project_root();
473486
if let Some(sysroot_project) = sysroot_project {
474487
sysroot.load_workspace(
475488
&RustSourceWorkspaceConfig::Json(*sysroot_project),
476489
project_root,
477490
progress,
478491
)
479492
} else {
480-
let target_dir = config
481-
.target_dir
482-
.clone()
483-
.unwrap_or_else(|| project_root.join("target").into());
484493
sysroot.load_workspace(
485494
&RustSourceWorkspaceConfig::CargoMetadata(sysroot_metadata_config(
486495
config,
@@ -535,7 +544,12 @@ impl ProjectWorkspace {
535544
.unwrap_or_default();
536545
let rustc_cfg = rustc_cfg::get(query_config, None, &config.extra_env);
537546
let data_layout = target_data_layout::get(query_config, None, &config.extra_env);
538-
let target_dir = config.target_dir.clone().unwrap_or_else(|| dir.join("target").into());
547+
let target_dir = config
548+
.target_dir
549+
.clone()
550+
.or_else(|| cargo_config_build_target_dir(detached_file, &config.extra_env, &sysroot))
551+
.unwrap_or_else(|| dir.join("target").into());
552+
539553
let loaded_sysroot = sysroot.load_workspace(
540554
&RustSourceWorkspaceConfig::CargoMetadata(sysroot_metadata_config(
541555
config,

0 commit comments

Comments
 (0)