@@ -505,6 +505,7 @@ impl<'cfg> PackageSet<'cfg> {
505
505
requested_kinds : & [ CompileKind ] ,
506
506
target_data : & RustcTargetData < ' _ > ,
507
507
force_all_targets : ForceAllTargets ,
508
+ additional_kinds : Vec < CompileKind > ,
508
509
) -> CargoResult < ( ) > {
509
510
if !used. insert ( pkg_id) {
510
511
return Ok ( ( ) ) ;
@@ -516,8 +517,9 @@ impl<'cfg> PackageSet<'cfg> {
516
517
requested_kinds,
517
518
target_data,
518
519
force_all_targets,
520
+ & additional_kinds,
519
521
) ;
520
- for ( pkg_id, _dep) in filtered_deps {
522
+ for ( pkg_id, _dep, additional_kinds ) in filtered_deps {
521
523
collect_used_deps (
522
524
used,
523
525
resolve,
@@ -526,6 +528,7 @@ impl<'cfg> PackageSet<'cfg> {
526
528
requested_kinds,
527
529
target_data,
528
530
force_all_targets,
531
+ additional_kinds,
529
532
) ?;
530
533
}
531
534
Ok ( ( ) )
@@ -545,6 +548,7 @@ impl<'cfg> PackageSet<'cfg> {
545
548
requested_kinds,
546
549
target_data,
547
550
force_all_targets,
551
+ Vec :: new ( ) ,
548
552
) ?;
549
553
}
550
554
self . get_many ( to_download. into_iter ( ) ) ?;
@@ -573,13 +577,14 @@ impl<'cfg> PackageSet<'cfg> {
573
577
requested_kinds,
574
578
target_data,
575
579
force_all_targets,
580
+ & [ ] ,
576
581
)
577
582
. collect ( ) ;
578
583
579
584
let dep_pkgs_and_deps = dep_pkgs_to_deps
580
585
. into_iter ( )
581
- . filter ( |( _id, deps) | deps. iter ( ) . any ( |dep| dep. maybe_lib ( ) ) )
582
- . filter_map ( |( dep_package_id, deps) | {
586
+ . filter ( |( _id, deps, _additional_kinds ) | deps. iter ( ) . any ( |dep| dep. maybe_lib ( ) ) )
587
+ . filter_map ( |( dep_package_id, deps, _additional_kinds ) | {
583
588
self . get_one ( dep_package_id) . ok ( ) . and_then ( |dep_pkg| {
584
589
( !dep_pkg. targets ( ) . iter ( ) . any ( |t| t. is_lib ( ) ) ) . then ( || ( dep_pkg, deps) )
585
590
} )
@@ -607,32 +612,53 @@ impl<'cfg> PackageSet<'cfg> {
607
612
Ok ( ( ) )
608
613
}
609
614
615
+ /// Returns an iterator over the dependencies of `pkg_id`, while filtering out target-specific
616
+ /// dependencies that are not enabled. Additionally returns a list of additional targets
617
+ /// specified through an artifact dependency.
610
618
fn filter_deps < ' a > (
611
619
pkg_id : PackageId ,
612
620
resolve : & ' a Resolve ,
613
621
has_dev_units : HasDevUnits ,
614
622
requested_kinds : & ' a [ CompileKind ] ,
615
623
target_data : & ' a RustcTargetData < ' _ > ,
616
624
force_all_targets : ForceAllTargets ,
617
- ) -> impl Iterator < Item = ( PackageId , & ' a HashSet < Dependency > ) > + ' a {
625
+ additional_kinds : & ' a [ CompileKind ] ,
626
+ ) -> impl Iterator < Item = ( PackageId , & ' a HashSet < Dependency > , Vec < CompileKind > ) > + ' a {
618
627
resolve
619
628
. deps ( pkg_id)
620
- . filter ( move |& ( _id, deps) | {
621
- deps. iter ( ) . any ( |dep| {
622
- if dep. kind ( ) == DepKind :: Development && has_dev_units == HasDevUnits :: No {
623
- return false ;
624
- }
625
- if force_all_targets == ForceAllTargets :: No {
626
- let activated = requested_kinds
627
- . iter ( )
628
- . chain ( Some ( & CompileKind :: Host ) )
629
- . any ( |kind| target_data. dep_platform_activated ( dep, * kind) ) ;
630
- if !activated {
629
+ . filter_map ( move |( id, deps) | {
630
+ let mut deps_iter = deps
631
+ . iter ( )
632
+ . filter ( |dep| {
633
+ if dep. kind ( ) == DepKind :: Development && has_dev_units == HasDevUnits :: No {
631
634
return false ;
632
635
}
633
- }
634
- true
635
- } )
636
+ if force_all_targets == ForceAllTargets :: No {
637
+ let activated = requested_kinds
638
+ . iter ( )
639
+ . chain ( Some ( & CompileKind :: Host ) )
640
+ . chain ( additional_kinds)
641
+ . any ( |kind| target_data. dep_platform_activated ( dep, * kind) ) ;
642
+ if !activated {
643
+ return false ;
644
+ }
645
+ }
646
+ true
647
+ } )
648
+ . peekable ( ) ;
649
+
650
+ if deps_iter. peek ( ) . is_some ( ) {
651
+ Some ( (
652
+ id,
653
+ deps,
654
+ deps_iter. filter_map ( |dep| dep. artifact ( ) )
655
+ . filter_map ( |artifact| artifact. target ( ) )
656
+ . filter_map ( |target| target. to_compile_kind ( ) )
657
+ . collect ( ) ,
658
+ ) )
659
+ } else {
660
+ None
661
+ }
636
662
} )
637
663
. into_iter ( )
638
664
}
0 commit comments