@@ -305,8 +305,12 @@ impl ProjectWorkspace {
305
305
& |_| ( ) ,
306
306
) {
307
307
Ok ( ( meta, _error) ) => {
308
- let workspace =
309
- CargoWorkspace :: new ( meta, cargo_toml. clone ( ) , Env :: default ( ) ) ;
308
+ let workspace = CargoWorkspace :: new (
309
+ meta,
310
+ cargo_toml. clone ( ) ,
311
+ Env :: default ( ) ,
312
+ false ,
313
+ ) ;
310
314
let build_scripts = WorkspaceBuildScripts :: rustc_crates (
311
315
& workspace,
312
316
workspace_dir,
@@ -321,8 +325,8 @@ impl ProjectWorkspace {
321
325
"Failed to read Cargo metadata from rustc source at {rustc_dir}" ,
322
326
) ;
323
327
Err ( Some ( format ! (
324
- "Failed to read Cargo metadata from rustc source at {rustc_dir}: {e}"
325
- ) ) )
328
+ "Failed to read Cargo metadata from rustc source at {rustc_dir}: {e}"
329
+ ) ) )
326
330
}
327
331
}
328
332
} )
@@ -379,7 +383,7 @@ impl ProjectWorkspace {
379
383
"Failed to read Cargo metadata from Cargo.toml file {cargo_toml}, {toolchain:?}" ,
380
384
)
381
385
} ) ?;
382
- let cargo = CargoWorkspace :: new ( meta, cargo_toml. clone ( ) , cargo_config_extra_env) ;
386
+ let cargo = CargoWorkspace :: new ( meta, cargo_toml. clone ( ) , cargo_config_extra_env, false ) ;
383
387
if let Some ( loaded_sysroot) = loaded_sysroot {
384
388
sysroot. set_workspace ( loaded_sysroot) ;
385
389
}
@@ -515,7 +519,7 @@ impl ProjectWorkspace {
515
519
let cargo_config_extra_env =
516
520
cargo_config_env ( detached_file, & config. extra_env , & sysroot) ;
517
521
(
518
- CargoWorkspace :: new ( ws, detached_file. clone ( ) , cargo_config_extra_env) ,
522
+ CargoWorkspace :: new ( ws, detached_file. clone ( ) , cargo_config_extra_env, false ) ,
519
523
WorkspaceBuildScripts :: default ( ) ,
520
524
error. map ( Arc :: new) ,
521
525
)
@@ -866,6 +870,7 @@ impl ProjectWorkspace {
866
870
extra_env,
867
871
cfg_overrides,
868
872
self . set_test ,
873
+ false ,
869
874
crate_ws_data,
870
875
) ,
871
876
ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts, error : _ } => {
@@ -968,6 +973,7 @@ fn project_json_to_crate_graph(
968
973
extra_env : & FxHashMap < String , String > ,
969
974
override_cfg : & CfgOverrides ,
970
975
set_test : bool ,
976
+ is_sysroot : bool ,
971
977
crate_ws_data : Arc < CrateWorkspaceData > ,
972
978
) -> ( CrateGraphBuilder , ProcMacroPaths ) {
973
979
let mut res = ( CrateGraphBuilder :: default ( ) , ProcMacroPaths :: default ( ) ) ;
@@ -1023,7 +1029,7 @@ fn project_json_to_crate_graph(
1023
1029
target_cfgs. iter ( ) . chain ( cfg. iter ( ) ) . cloned ( ) . collect ( ) ;
1024
1030
1025
1031
if * is_workspace_member {
1026
- if set_test {
1032
+ if set_test && !is_sysroot {
1027
1033
// Add test cfg for local crates
1028
1034
cfg_options. insert_atom ( sym:: test. clone ( ) ) ;
1029
1035
}
@@ -1049,9 +1055,13 @@ fn project_json_to_crate_graph(
1049
1055
None ,
1050
1056
env,
1051
1057
if let Some ( name) = display_name. clone ( ) {
1052
- CrateOrigin :: Local {
1053
- repo : repository. clone ( ) ,
1054
- name : Some ( name. canonical_name ( ) . to_owned ( ) ) ,
1058
+ if is_sysroot {
1059
+ CrateOrigin :: Lang ( LangCrateOrigin :: from ( name. canonical_name ( ) . as_str ( ) ) )
1060
+ } else {
1061
+ CrateOrigin :: Local {
1062
+ repo : repository. clone ( ) ,
1063
+ name : Some ( name. canonical_name ( ) . to_owned ( ) ) ,
1064
+ }
1055
1065
}
1056
1066
} else {
1057
1067
CrateOrigin :: Local { repo : None , name : None }
@@ -1119,7 +1129,6 @@ fn cargo_to_crate_graph(
1119
1129
sysroot,
1120
1130
rustc_cfg. clone ( ) ,
1121
1131
load,
1122
- // FIXME: This looks incorrect but I don't think this causes problems.
1123
1132
crate_ws_data. clone ( ) ,
1124
1133
) ;
1125
1134
@@ -1139,7 +1148,7 @@ fn cargo_to_crate_graph(
1139
1148
let mut cfg_options = cfg_options. clone ( ) ;
1140
1149
1141
1150
if cargo[ pkg] . is_local {
1142
- if set_test {
1151
+ if set_test && !cargo . is_sysroot ( ) {
1143
1152
// Add test cfg for local crates
1144
1153
cfg_options. insert_atom ( sym:: test. clone ( ) ) ;
1145
1154
}
@@ -1152,7 +1161,9 @@ fn cargo_to_crate_graph(
1152
1161
1153
1162
let mut lib_tgt = None ;
1154
1163
for & tgt in cargo[ pkg] . targets . iter ( ) {
1155
- if !matches ! ( cargo[ tgt] . kind, TargetKind :: Lib { .. } ) && !cargo[ pkg] . is_member {
1164
+ if !matches ! ( cargo[ tgt] . kind, TargetKind :: Lib { .. } )
1165
+ && ( !cargo[ pkg] . is_member || cargo. is_sysroot ( ) )
1166
+ {
1156
1167
// For non-workspace-members, Cargo does not resolve dev-dependencies, so we don't
1157
1168
// add any targets except the library target, since those will not work correctly if
1158
1169
// they use dev-dependencies.
@@ -1177,9 +1188,13 @@ fn cargo_to_crate_graph(
1177
1188
name,
1178
1189
kind,
1179
1190
if pkg_data. is_local {
1180
- CrateOrigin :: Local {
1181
- repo : pkg_data. repository . clone ( ) ,
1182
- name : Some ( Symbol :: intern ( & pkg_data. name ) ) ,
1191
+ if cargo. is_sysroot ( ) {
1192
+ CrateOrigin :: Lang ( LangCrateOrigin :: from ( & * pkg_data. name ) )
1193
+ } else {
1194
+ CrateOrigin :: Local {
1195
+ repo : pkg_data. repository . clone ( ) ,
1196
+ name : Some ( Symbol :: intern ( & pkg_data. name ) ) ,
1197
+ }
1183
1198
}
1184
1199
} else {
1185
1200
CrateOrigin :: Library {
@@ -1516,10 +1531,8 @@ fn add_target_crate_root(
1516
1531
env,
1517
1532
origin,
1518
1533
matches ! ( kind, TargetKind :: Lib { is_proc_macro: true } ) ,
1519
- Some ( if pkg. is_member {
1520
- cargo. workspace_root ( ) . to_path_buf ( )
1521
- } else {
1522
- pkg. manifest . parent ( ) . to_path_buf ( )
1534
+ matches ! ( kind, TargetKind :: Lib { is_proc_macro: true } ) . then ( || {
1535
+ if pkg. is_member { cargo. workspace_root ( ) } else { pkg. manifest . parent ( ) } . to_path_buf ( )
1523
1536
} ) ,
1524
1537
crate_ws_data,
1525
1538
) ;
@@ -1561,16 +1574,8 @@ fn extend_crate_graph_with_sysroot(
1561
1574
) -> ( SysrootPublicDeps , Option < CrateBuilderId > ) {
1562
1575
let mut pub_deps = vec ! [ ] ;
1563
1576
let mut libproc_macro = None ;
1564
- let diff = CfgDiff :: new ( vec ! [ ] , vec ! [ CfgAtom :: Flag ( sym:: test. clone( ) ) ] ) ;
1565
- for ( cid, c) in sysroot_crate_graph. iter_mut ( ) {
1566
- // uninject `test` flag so `core` keeps working.
1567
- Arc :: make_mut ( & mut c. cfg_options ) . apply_diff ( diff. clone ( ) ) ;
1568
- // patch the origin
1569
- if c. basic . origin . is_local ( ) {
1570
- let lang_crate = LangCrateOrigin :: from (
1571
- c. extra . display_name . as_ref ( ) . map_or ( "" , |it| it. canonical_name ( ) . as_str ( ) ) ,
1572
- ) ;
1573
- c. basic . origin = CrateOrigin :: Lang ( lang_crate) ;
1577
+ for cid in sysroot_crate_graph. iter ( ) {
1578
+ if let CrateOrigin :: Lang ( lang_crate) = sysroot_crate_graph[ cid] . basic . origin {
1574
1579
match lang_crate {
1575
1580
LangCrateOrigin :: Test
1576
1581
| LangCrateOrigin :: Alloc
@@ -1627,7 +1632,7 @@ fn sysroot_to_crate_graph(
1627
1632
let _p = tracing:: info_span!( "sysroot_to_crate_graph" ) . entered ( ) ;
1628
1633
match sysroot. workspace ( ) {
1629
1634
RustLibSrcWorkspace :: Workspace ( cargo) => {
1630
- let ( cg , pm ) = cargo_to_crate_graph (
1635
+ let ( sysroot_cg , sysroot_pm ) = cargo_to_crate_graph (
1631
1636
load,
1632
1637
None ,
1633
1638
cargo,
@@ -1639,7 +1644,7 @@ fn sysroot_to_crate_graph(
1639
1644
CfgAtom :: Flag ( sym:: debug_assertions. clone( ) ) ,
1640
1645
CfgAtom :: Flag ( sym:: miri. clone( ) ) ,
1641
1646
] ,
1642
- vec ! [ ] ,
1647
+ vec ! [ CfgAtom :: Flag ( sym :: test . clone ( ) ) ] ,
1643
1648
) ,
1644
1649
..Default :: default ( )
1645
1650
} ,
@@ -1648,10 +1653,10 @@ fn sysroot_to_crate_graph(
1648
1653
crate_ws_data,
1649
1654
) ;
1650
1655
1651
- extend_crate_graph_with_sysroot ( crate_graph, cg , pm )
1656
+ extend_crate_graph_with_sysroot ( crate_graph, sysroot_cg , sysroot_pm )
1652
1657
}
1653
1658
RustLibSrcWorkspace :: Json ( project_json) => {
1654
- let ( cg , pm ) = project_json_to_crate_graph (
1659
+ let ( sysroot_cg , sysroot_pm ) = project_json_to_crate_graph (
1655
1660
rustc_cfg,
1656
1661
load,
1657
1662
project_json,
@@ -1668,10 +1673,11 @@ fn sysroot_to_crate_graph(
1668
1673
..Default :: default ( )
1669
1674
} ,
1670
1675
false ,
1676
+ true ,
1671
1677
crate_ws_data,
1672
1678
) ;
1673
1679
1674
- extend_crate_graph_with_sysroot ( crate_graph, cg , pm )
1680
+ extend_crate_graph_with_sysroot ( crate_graph, sysroot_cg , sysroot_pm )
1675
1681
}
1676
1682
RustLibSrcWorkspace :: Stitched ( stitched) => {
1677
1683
let cfg_options = Arc :: new ( {
0 commit comments