Unnamed repository; edit this file 'description' to name the repository.
fix: Canonicalize `custom-target.json` paths when fetching sysroot metadata
| -rw-r--r-- | crates/project-model/src/workspace.rs | 22 |
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, |