@@ -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