@@ -622,6 +622,7 @@ impl ProjectWorkspace {
622
622
sysroot. as_ref ( ) . ok ( ) ,
623
623
rustc_cfg. clone ( ) ,
624
624
cfg_overrides,
625
+ None ,
625
626
build_scripts,
626
627
match target_layout. as_ref ( ) {
627
628
Ok ( it) => Ok ( Arc :: from ( it. as_str ( ) ) ) ,
@@ -821,6 +822,8 @@ fn cargo_to_crate_graph(
821
822
sysroot : Option < & Sysroot > ,
822
823
rustc_cfg : Vec < CfgFlag > ,
823
824
override_cfg : & CfgOverrides ,
825
+ // Don't compute cfg and use this if present
826
+ forced_cfg : Option < CfgOptions > ,
824
827
build_scripts : & WorkspaceBuildScripts ,
825
828
target_layout : TargetLayoutLoadResult ,
826
829
channel : Option < ReleaseChannel > ,
@@ -858,7 +861,7 @@ fn cargo_to_crate_graph(
858
861
for pkg in cargo. packages ( ) {
859
862
has_private |= cargo[ pkg] . metadata . rustc_private ;
860
863
861
- let cfg_options = {
864
+ let cfg_options = forced_cfg . clone ( ) . unwrap_or_else ( || {
862
865
let mut cfg_options = cfg_options. clone ( ) ;
863
866
864
867
// Add test cfg for local crates
@@ -882,7 +885,7 @@ fn cargo_to_crate_graph(
882
885
cfg_options. apply_diff ( overrides. clone ( ) ) ;
883
886
} ;
884
887
cfg_options
885
- } ;
888
+ } ) ;
886
889
887
890
let mut lib_tgt = None ;
888
891
for & tgt in cargo[ pkg] . targets . iter ( ) {
@@ -1280,31 +1283,43 @@ fn sysroot_to_crate_graph(
1280
1283
) -> ( SysrootPublicDeps , Option < CrateId > ) {
1281
1284
let _p = profile:: span ( "sysroot_to_crate_graph" ) ;
1282
1285
let mut cfg_options = CfgOptions :: default ( ) ;
1283
- cfg_options. extend ( rustc_cfg) ;
1284
- let sysroot_crates: FxHashMap < SysrootCrate , CrateId > = sysroot
1285
- . crates ( )
1286
- . filter_map ( |krate| {
1287
- let file_id = load ( & sysroot[ krate] . root ) ?;
1288
-
1289
- let env = Env :: default ( ) ;
1290
- let display_name = CrateDisplayName :: from_canonical_name ( sysroot[ krate] . name . clone ( ) ) ;
1291
- let crate_id = crate_graph. add_crate_root (
1292
- file_id,
1293
- Edition :: CURRENT ,
1294
- Some ( display_name) ,
1295
- None ,
1296
- cfg_options. clone ( ) ,
1297
- None ,
1298
- env,
1299
- false ,
1300
- CrateOrigin :: Lang ( LangCrateOrigin :: from ( & * sysroot[ krate] . name ) ) ,
1301
- target_layout. clone ( ) ,
1302
- channel,
1303
- ) ;
1304
- Some ( ( krate, crate_id) )
1305
- } )
1306
- . collect ( ) ;
1307
-
1286
+ cfg_options. extend ( rustc_cfg. clone ( ) ) ;
1287
+ let sysroot_crates: FxHashMap < SysrootCrate , CrateId > = match & sysroot. hack_cargo_workspace {
1288
+ Some ( cargo) => handle_hack_cargo_workspace (
1289
+ load,
1290
+ cargo,
1291
+ rustc_cfg,
1292
+ cfg_options,
1293
+ target_layout,
1294
+ channel,
1295
+ crate_graph,
1296
+ sysroot,
1297
+ ) ,
1298
+ None => sysroot
1299
+ . crates ( )
1300
+ . filter_map ( |krate| {
1301
+ let file_id = load ( & sysroot[ krate] . root ) ?;
1302
+
1303
+ let env = Env :: default ( ) ;
1304
+ let display_name =
1305
+ CrateDisplayName :: from_canonical_name ( sysroot[ krate] . name . clone ( ) ) ;
1306
+ let crate_id = crate_graph. add_crate_root (
1307
+ file_id,
1308
+ Edition :: CURRENT ,
1309
+ Some ( display_name) ,
1310
+ None ,
1311
+ cfg_options. clone ( ) ,
1312
+ None ,
1313
+ env,
1314
+ false ,
1315
+ CrateOrigin :: Lang ( LangCrateOrigin :: from ( & * sysroot[ krate] . name ) ) ,
1316
+ target_layout. clone ( ) ,
1317
+ channel,
1318
+ ) ;
1319
+ Some ( ( krate, crate_id) )
1320
+ } )
1321
+ . collect ( ) ,
1322
+ } ;
1308
1323
for from in sysroot. crates ( ) {
1309
1324
for & to in sysroot[ from] . deps . iter ( ) {
1310
1325
let name = CrateName :: new ( & sysroot[ to] . name ) . unwrap ( ) ;
@@ -1325,6 +1340,63 @@ fn sysroot_to_crate_graph(
1325
1340
( public_deps, libproc_macro)
1326
1341
}
1327
1342
1343
+ fn handle_hack_cargo_workspace (
1344
+ load : & mut dyn FnMut ( & AbsPath ) -> Option < FileId > ,
1345
+ cargo : & CargoWorkspace ,
1346
+ rustc_cfg : Vec < CfgFlag > ,
1347
+ cfg_options : CfgOptions ,
1348
+ target_layout : Result < Arc < str > , Arc < str > > ,
1349
+ channel : Option < ReleaseChannel > ,
1350
+ crate_graph : & mut CrateGraph ,
1351
+ sysroot : & Sysroot ,
1352
+ ) -> FxHashMap < SysrootCrate , CrateId > {
1353
+ let ( cg, mut pm) = cargo_to_crate_graph (
1354
+ load,
1355
+ None ,
1356
+ cargo,
1357
+ None ,
1358
+ rustc_cfg,
1359
+ & CfgOverrides :: default ( ) ,
1360
+ Some ( cfg_options) ,
1361
+ & WorkspaceBuildScripts :: default ( ) ,
1362
+ target_layout,
1363
+ channel,
1364
+ ) ;
1365
+ crate_graph. extend ( cg, & mut pm) ;
1366
+ for crate_name in [ "std" , "alloc" , "core" ] {
1367
+ let original = crate_graph
1368
+ . iter ( )
1369
+ . find ( |x| {
1370
+ crate_graph[ * x]
1371
+ . display_name
1372
+ . as_ref ( )
1373
+ . map ( |x| x. canonical_name ( ) == crate_name)
1374
+ . unwrap_or ( false )
1375
+ } )
1376
+ . unwrap ( ) ;
1377
+ let fake_crate_name = format ! ( "rustc-std-workspace-{}" , crate_name) ;
1378
+ let fake = crate_graph
1379
+ . iter ( )
1380
+ . find ( |x| {
1381
+ crate_graph[ * x]
1382
+ . display_name
1383
+ . as_ref ( )
1384
+ . map ( |x| x. canonical_name ( ) == fake_crate_name)
1385
+ . unwrap_or ( false )
1386
+ } )
1387
+ . unwrap ( ) ;
1388
+ crate_graph. remove_and_replace ( fake, original) . unwrap ( ) ;
1389
+ }
1390
+ sysroot
1391
+ . crates ( )
1392
+ . filter_map ( |krate| {
1393
+ let file_id = load ( & sysroot[ krate] . root ) ?;
1394
+ let crate_id = crate_graph. crate_id_for_crate_root ( file_id) ?;
1395
+ Some ( ( krate, crate_id) )
1396
+ } )
1397
+ . collect ( )
1398
+ }
1399
+
1328
1400
fn add_dep ( graph : & mut CrateGraph , from : CrateId , name : CrateName , to : CrateId ) {
1329
1401
add_dep_inner ( graph, from, Dependency :: new ( name, to) )
1330
1402
}
0 commit comments