@@ -573,10 +573,17 @@ fn merge_profile(profile: &mut Profile, toml: &TomlProfile) {
573
573
profile. trim_paths = Some ( trim_paths. clone ( ) ) ;
574
574
}
575
575
profile. strip = match toml. strip {
576
- Some ( StringOrBool :: Bool ( true ) ) => Strip :: Named ( InternedString :: new ( "symbols" ) ) ,
577
- None | Some ( StringOrBool :: Bool ( false ) ) => Strip :: None ,
578
- Some ( StringOrBool :: String ( ref n) ) if n. as_str ( ) == "none" => Strip :: None ,
579
- Some ( StringOrBool :: String ( ref n) ) => Strip :: Named ( InternedString :: new ( n) ) ,
576
+ Some ( StringOrBool :: Bool ( true ) ) => {
577
+ Strip :: Resolved ( StripInner :: Named ( InternedString :: new ( "symbols" ) ) )
578
+ }
579
+ Some ( StringOrBool :: Bool ( false ) ) => Strip :: Resolved ( StripInner :: None ) ,
580
+ Some ( StringOrBool :: String ( ref n) ) if n. as_str ( ) == "none" => {
581
+ Strip :: Resolved ( StripInner :: None )
582
+ }
583
+ Some ( StringOrBool :: String ( ref n) ) => {
584
+ Strip :: Resolved ( StripInner :: Named ( InternedString :: new ( n) ) )
585
+ }
586
+ None => Strip :: Deferred ( StripInner :: None ) ,
580
587
} ;
581
588
}
582
589
@@ -636,7 +643,7 @@ impl Default for Profile {
636
643
rpath : false ,
637
644
incremental : false ,
638
645
panic : PanicStrategy :: Unwind ,
639
- strip : Strip :: None ,
646
+ strip : Strip :: Resolved ( StripInner :: None ) ,
640
647
rustflags : vec ! [ ] ,
641
648
trim_paths : None ,
642
649
}
@@ -873,28 +880,78 @@ impl fmt::Display for PanicStrategy {
873
880
}
874
881
}
875
882
876
- /// The setting for choosing which symbols to strip
877
883
#[ derive(
878
884
Clone , Copy , PartialEq , Eq , Debug , Hash , PartialOrd , Ord , serde:: Serialize , serde:: Deserialize ,
879
885
) ]
880
- #[ serde( rename_all = "lowercase" ) ]
881
- pub enum Strip {
886
+ pub enum StripInner {
882
887
/// Don't remove any symbols
883
888
None ,
884
889
/// Named Strip settings
885
890
Named ( InternedString ) ,
886
891
}
887
892
888
- impl fmt:: Display for Strip {
893
+ impl fmt:: Display for StripInner {
889
894
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
890
895
match * self {
891
- Strip :: None => "none" ,
892
- Strip :: Named ( s) => s. as_str ( ) ,
896
+ StripInner :: None => "none" ,
897
+ StripInner :: Named ( s) => s. as_str ( ) ,
893
898
}
894
899
. fmt ( f)
895
900
}
896
901
}
897
902
903
+ /// The setting for choosing which symbols to strip.
904
+ ///
905
+ /// This is semantically a [`StripInner`], and should be used as so via the
906
+ /// [`Strip::into_inner`] method for all intents and purposes.
907
+ ///
908
+ /// Internally, it's used to model a strip option whose value can be deferred
909
+ /// for optimization purposes: when no package being compiled requires debuginfo,
910
+ /// then we can strip debuginfo to remove pre-existing debug symbols from the
911
+ /// standard library.
912
+ #[ derive( Clone , Copy , Debug , Eq , serde:: Serialize , serde:: Deserialize ) ]
913
+ #[ serde( rename_all = "lowercase" ) ]
914
+ pub enum Strip {
915
+ /// A strip option that is fixed and will not change.
916
+ Resolved ( StripInner ) ,
917
+ /// A strip option that might be overridden by Cargo for optimization
918
+ /// purposes.
919
+ Deferred ( StripInner ) ,
920
+ }
921
+
922
+ impl Strip {
923
+ /// The main way to interact with this strip option, turning it into a [`StripInner`].
924
+ pub fn into_inner ( self ) -> StripInner {
925
+ match self {
926
+ Strip :: Resolved ( v) | Strip :: Deferred ( v) => v,
927
+ }
928
+ }
929
+ }
930
+
931
+ impl PartialEq for Strip {
932
+ fn eq ( & self , other : & Self ) -> bool {
933
+ self . into_inner ( ) . eq ( & other. into_inner ( ) )
934
+ }
935
+ }
936
+
937
+ impl Hash for Strip {
938
+ fn hash < H : std:: hash:: Hasher > ( & self , state : & mut H ) {
939
+ self . into_inner ( ) . hash ( state) ;
940
+ }
941
+ }
942
+
943
+ impl PartialOrd for Strip {
944
+ fn partial_cmp ( & self , other : & Self ) -> Option < std:: cmp:: Ordering > {
945
+ self . into_inner ( ) . partial_cmp ( & other. into_inner ( ) )
946
+ }
947
+ }
948
+
949
+ impl Ord for Strip {
950
+ fn cmp ( & self , other : & Self ) -> std:: cmp:: Ordering {
951
+ self . into_inner ( ) . cmp ( & other. into_inner ( ) )
952
+ }
953
+ }
954
+
898
955
/// Flags used in creating `Unit`s to indicate the purpose for the target, and
899
956
/// to ensure the target's dependencies have the correct settings.
900
957
///
0 commit comments