Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #20964 from ShoyuVanilla/canonicalize-tgts
fix: Canonicalize `custom-target.json` paths when fetching sysroot metadata
Lukas Wirth 6 months ago
parent 00b627d · parent f09b0a8 · commit 5b884c4
-rw-r--r--crates/project-model/src/workspace.rs22
1 files changed, 21 insertions, 1 deletions
diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs
index 3c69625685..aa2e15930c 100644
--- a/crates/project-model/src/workspace.rs
+++ b/crates/project-model/src/workspace.rs
@@ -374,6 +374,7 @@ impl ProjectWorkspace {
sysroot.load_workspace(
&RustSourceWorkspaceConfig::CargoMetadata(sysroot_metadata_config(
config,
+ workspace_dir,
&targets,
toolchain.clone(),
)),
@@ -480,6 +481,7 @@ impl ProjectWorkspace {
sysroot.load_workspace(
&RustSourceWorkspaceConfig::CargoMetadata(sysroot_metadata_config(
config,
+ project_json.project_root(),
&targets,
toolchain.clone(),
)),
@@ -535,6 +537,7 @@ impl ProjectWorkspace {
let loaded_sysroot = sysroot.load_workspace(
&RustSourceWorkspaceConfig::CargoMetadata(sysroot_metadata_config(
config,
+ dir,
&targets,
toolchain.clone(),
)),
@@ -1864,12 +1867,29 @@ fn add_dep_inner(graph: &mut CrateGraphBuilder, from: CrateBuilderId, dep: Depen
fn sysroot_metadata_config(
config: &CargoConfig,
+ current_dir: &AbsPath,
targets: &[String],
toolchain_version: Option<Version>,
) -> CargoMetadataConfig {
+ // We run `cargo metadata` on sysroot with sysroot dir as a working directory, but still pass
+ // the `targets` from the cargo config evaluated from the workspace's `current_dir`.
+ // So, we need to *canonicalize* those *might-be-relative-paths-to-custom-target-json-files*.
+ //
+ // See https://github.com/rust-lang/cargo/blob/f7acf448fc127df9a77c52cc2bba027790ac4931/src/cargo/core/compiler/compile_kind.rs#L171-L192
+ let targets = targets
+ .iter()
+ .map(|target| {
+ if target.ends_with(".json") {
+ current_dir.join(target).to_string()
+ } else {
+ target.to_owned()
+ }
+ })
+ .collect();
+
CargoMetadataConfig {
features: Default::default(),
- targets: targets.to_vec(),
+ targets,
extra_args: Default::default(),
extra_env: config.extra_env.clone(),
toolchain_version,