@@ -183,6 +183,7 @@ struct Crate {
183
183
deps : HashSet < String > ,
184
184
path : PathBuf ,
185
185
has_lib : bool ,
186
+ features : Vec < String > ,
186
187
}
187
188
188
189
impl Crate {
@@ -666,16 +667,24 @@ impl Build {
666
667
}
667
668
668
669
/// Gets the space-separated set of activated features for the compiler.
669
- fn rustc_features ( & self , kind : Kind , target : TargetSelection ) -> String {
670
+ fn rustc_features ( & self , kind : Kind , target : TargetSelection , crates : & [ String ] ) -> String {
671
+ let possible_features_by_crates: HashSet < _ > = crates
672
+ . iter ( )
673
+ . flat_map ( |krate| & self . crates [ krate] . features )
674
+ . map ( std:: ops:: Deref :: deref)
675
+ . collect ( ) ;
676
+ let check = |feature : & str | -> bool {
677
+ crates. is_empty ( ) || possible_features_by_crates. contains ( feature)
678
+ } ;
670
679
let mut features = vec ! [ ] ;
671
- if self . config . jemalloc {
680
+ if self . config . jemalloc && check ( "jemalloc" ) {
672
681
features. push ( "jemalloc" ) ;
673
682
}
674
- if self . config . llvm_enabled ( target) || kind == Kind :: Check {
683
+ if ( self . config . llvm_enabled ( target) || kind == Kind :: Check ) && check ( "llvm" ) {
675
684
features. push ( "llvm" ) ;
676
685
}
677
686
// keep in sync with `bootstrap/compile.rs:rustc_cargo_env`
678
- if self . config . rustc_parallel {
687
+ if self . config . rustc_parallel && check ( "rustc_use_parallel_compiler" ) {
679
688
features. push ( "rustc_use_parallel_compiler" ) ;
680
689
}
681
690
@@ -684,7 +693,7 @@ impl Build {
684
693
// which is everything (including debug/trace/etc.)
685
694
// if its unset, if debug_assertions is on, then debug_logging will also be on
686
695
// as well as tracing *ignoring* this feature when debug_assertions is on
687
- if !self . config . rust_debug_logging {
696
+ if !self . config . rust_debug_logging && check ( "max_level_info" ) {
688
697
features. push ( "max_level_info" ) ;
689
698
}
690
699
0 commit comments