@@ -41,9 +41,9 @@ use crate::core::compiler::{BuildConfig, BuildContext, Compilation, Context};
4141use  crate :: core:: compiler:: { CompileKind ,  CompileMode ,  CompileTarget ,  RustcTargetData ,  Unit } ; 
4242use  crate :: core:: compiler:: { DefaultExecutor ,  Executor ,  UnitInterner } ; 
4343use  crate :: core:: profiles:: Profiles ; 
44- use  crate :: core:: resolver:: features:: CliFeatures ; 
45- use  crate :: core:: resolver:: HasDevUnits ; 
46- use  crate :: core:: { SourceId ,  TargetKind ,  Workspace } ; 
44+ use  crate :: core:: resolver:: features:: { self ,   CliFeatures ,   FeaturesFor } ; 
45+ use  crate :: core:: resolver:: { HasDevUnits ,   Resolve } ; 
46+ use  crate :: core:: { PackageId ,   PackageSet ,   SourceId ,  TargetKind ,  Workspace } ; 
4747use  crate :: drop_println; 
4848use  crate :: ops; 
4949use  crate :: ops:: resolve:: WorkspaceResolve ; 
@@ -55,7 +55,6 @@ mod compile_filter;
5555pub  use  compile_filter:: { CompileFilter ,  FilterRule ,  LibRule } ; 
5656
5757mod  unit_generator; 
58- pub  use  unit_generator:: resolve_all_features; 
5958use  unit_generator:: UnitGenerator ; 
6059
6160mod  packages; 
@@ -817,3 +816,41 @@ fn override_rustc_crate_types(
817816
818817    Ok ( ( ) ) 
819818} 
819+ 
820+ /// Gets all of the features enabled for a package, plus its dependencies' 
821+ /// features. 
822+ /// 
823+ /// Dependencies are added as `dep_name/feat_name` because `required-features` 
824+ /// wants to support that syntax. 
825+ pub  fn  resolve_all_features ( 
826+     resolve_with_overrides :  & Resolve , 
827+     resolved_features :  & features:: ResolvedFeatures , 
828+     package_set :  & PackageSet < ' _ > , 
829+     package_id :  PackageId , 
830+ )  -> HashSet < String >  { 
831+     let  mut  features:  HashSet < String >  = resolved_features
832+         . activated_features ( package_id,  FeaturesFor :: NormalOrDev ) 
833+         . iter ( ) 
834+         . map ( |s| s. to_string ( ) ) 
835+         . collect ( ) ; 
836+ 
837+     // Include features enabled for use by dependencies so targets can also use them with the 
838+     // required-features field when deciding whether to be built or skipped. 
839+     for  ( dep_id,  deps)  in  resolve_with_overrides. deps ( package_id)  { 
840+         let  is_proc_macro = package_set
841+             . get_one ( dep_id) 
842+             . expect ( "packages downloaded" ) 
843+             . proc_macro ( ) ; 
844+         for  dep in  deps { 
845+             let  features_for = FeaturesFor :: from_for_host ( is_proc_macro || dep. is_build ( ) ) ; 
846+             for  feature in  resolved_features
847+                 . activated_features_unverified ( dep_id,  features_for) 
848+                 . unwrap_or_default ( ) 
849+             { 
850+                 features. insert ( format ! ( "{}/{}" ,  dep. name_in_toml( ) ,  feature) ) ; 
851+             } 
852+         } 
853+     } 
854+ 
855+     features
856+ } 
0 commit comments