@@ -499,17 +499,18 @@ impl<'gctx> PackageSet<'gctx> {
499
499
force_all_targets : ForceAllTargets ,
500
500
) -> CargoResult < ( ) > {
501
501
fn collect_used_deps (
502
- used : & mut BTreeSet < PackageId > ,
502
+ used : & mut BTreeSet < ( PackageId , CompileKind ) > ,
503
503
resolve : & Resolve ,
504
504
pkg_id : PackageId ,
505
505
has_dev_units : HasDevUnits ,
506
- requested_kinds : & [ CompileKind ] ,
506
+ requested_kind : CompileKind ,
507
507
target_data : & RustcTargetData < ' _ > ,
508
508
force_all_targets : ForceAllTargets ,
509
509
) -> CargoResult < ( ) > {
510
- if !used. insert ( pkg_id) {
510
+ if !used. insert ( ( pkg_id, requested_kind ) ) {
511
511
return Ok ( ( ) ) ;
512
512
}
513
+ let requested_kinds = & [ requested_kind] ;
513
514
let filtered_deps = PackageSet :: filter_deps (
514
515
pkg_id,
515
516
resolve,
@@ -518,16 +519,34 @@ impl<'gctx> PackageSet<'gctx> {
518
519
target_data,
519
520
force_all_targets,
520
521
) ;
521
- for ( pkg_id, _dep ) in filtered_deps {
522
+ for ( pkg_id, deps ) in filtered_deps {
522
523
collect_used_deps (
523
524
used,
524
525
resolve,
525
526
pkg_id,
526
527
has_dev_units,
527
- requested_kinds ,
528
+ requested_kind ,
528
529
target_data,
529
530
force_all_targets,
530
531
) ?;
532
+ let artifact_kinds = deps. iter ( ) . filter_map ( |dep| {
533
+ Some (
534
+ dep. artifact ( ) ?
535
+ . target ( ) ?
536
+ . to_resolved_compile_kind ( * requested_kinds. iter ( ) . next ( ) . unwrap ( ) ) ,
537
+ )
538
+ } ) ;
539
+ for artifact_kind in artifact_kinds {
540
+ collect_used_deps (
541
+ used,
542
+ resolve,
543
+ pkg_id,
544
+ has_dev_units,
545
+ artifact_kind,
546
+ target_data,
547
+ force_all_targets,
548
+ ) ?;
549
+ }
531
550
}
532
551
Ok ( ( ) )
533
552
}
@@ -538,16 +557,22 @@ impl<'gctx> PackageSet<'gctx> {
538
557
let mut to_download = BTreeSet :: new ( ) ;
539
558
540
559
for id in root_ids {
541
- collect_used_deps (
542
- & mut to_download,
543
- resolve,
544
- * id,
545
- has_dev_units,
546
- requested_kinds,
547
- target_data,
548
- force_all_targets,
549
- ) ?;
560
+ for requested_kind in requested_kinds {
561
+ collect_used_deps (
562
+ & mut to_download,
563
+ resolve,
564
+ * id,
565
+ has_dev_units,
566
+ * requested_kind,
567
+ target_data,
568
+ force_all_targets,
569
+ ) ?;
570
+ }
550
571
}
572
+ let to_download = to_download
573
+ . into_iter ( )
574
+ . map ( |( p, _) | p)
575
+ . collect :: < BTreeSet < _ > > ( ) ;
551
576
self . get_many ( to_download. into_iter ( ) ) ?;
552
577
Ok ( ( ) )
553
578
}
0 commit comments