@@ -692,8 +692,14 @@ fn resolve_dependencies<'a>(
692
692
693
693
let mut deps = BTreeMap :: new ( ) ;
694
694
for ( name_in_toml, v) in dependencies. iter ( ) {
695
- let mut resolved =
696
- dependency_inherit_with ( v. clone ( ) , name_in_toml, inherit, package_root, warnings) ?;
695
+ let mut resolved = dependency_inherit_with (
696
+ v. clone ( ) ,
697
+ name_in_toml,
698
+ inherit,
699
+ package_root,
700
+ edition,
701
+ warnings,
702
+ ) ?;
697
703
if let manifest:: TomlDependency :: Detailed ( ref mut d) = resolved {
698
704
deprecated_underscore (
699
705
& d. default_features2 ,
@@ -949,12 +955,13 @@ fn dependency_inherit_with<'a>(
949
955
name : & str ,
950
956
inherit : & dyn Fn ( ) -> CargoResult < & ' a InheritableFields > ,
951
957
package_root : & Path ,
958
+ edition : Edition ,
952
959
warnings : & mut Vec < String > ,
953
960
) -> CargoResult < manifest:: TomlDependency > {
954
961
match dependency {
955
962
manifest:: InheritableDependency :: Value ( value) => Ok ( value) ,
956
963
manifest:: InheritableDependency :: Inherit ( w) => {
957
- inner_dependency_inherit_with ( w, name, inherit, package_root, warnings) . with_context ( || {
964
+ inner_dependency_inherit_with ( w, name, inherit, package_root, edition , warnings) . with_context ( || {
958
965
format ! (
959
966
"error inheriting `{name}` from workspace root manifest's `workspace.dependencies.{name}`" ,
960
967
)
@@ -968,76 +975,87 @@ fn inner_dependency_inherit_with<'a>(
968
975
name : & str ,
969
976
inherit : & dyn Fn ( ) -> CargoResult < & ' a InheritableFields > ,
970
977
package_root : & Path ,
978
+ edition : Edition ,
971
979
warnings : & mut Vec < String > ,
972
980
) -> CargoResult < manifest:: TomlDependency > {
973
- fn default_features_msg ( label : & str , ws_def_feat : Option < bool > , warnings : & mut Vec < String > ) {
974
- let ws_def_feat = match ws_def_feat {
975
- Some ( true ) => "true" ,
976
- Some ( false ) => "false" ,
977
- None => "not specified" ,
978
- } ;
981
+ let ws_dep = inherit ( ) ?. get_dependency ( name, package_root) ?;
982
+ let mut merged_dep = match ws_dep {
983
+ manifest:: TomlDependency :: Simple ( ws_version) => manifest:: TomlDetailedDependency {
984
+ version : Some ( ws_version) ,
985
+ ..Default :: default ( )
986
+ } ,
987
+ manifest:: TomlDependency :: Detailed ( ws_dep) => ws_dep. clone ( ) ,
988
+ } ;
989
+ let manifest:: TomlInheritedDependency {
990
+ workspace : _,
991
+
992
+ features,
993
+ optional,
994
+ default_features,
995
+ default_features2,
996
+ public,
997
+
998
+ _unused_keys : _,
999
+ } = & pkg_dep;
1000
+ let default_features = default_features. or ( * default_features2) ;
1001
+
1002
+ match ( default_features, merged_dep. default_features ( ) ) {
1003
+ // member: default-features = true and
1004
+ // workspace: default-features = false should turn on
1005
+ // default-features
1006
+ ( Some ( true ) , Some ( false ) ) => {
1007
+ merged_dep. default_features = Some ( true ) ;
1008
+ }
1009
+ // member: default-features = false and
1010
+ // workspace: default-features = true should ignore member
1011
+ // default-features
1012
+ ( Some ( false ) , Some ( true ) ) => {
1013
+ deprecated_ws_default_features ( name, Some ( true ) , edition, warnings) ?;
1014
+ }
1015
+ // member: default-features = false and
1016
+ // workspace: dep = "1.0" should ignore member default-features
1017
+ ( Some ( false ) , None ) => {
1018
+ deprecated_ws_default_features ( name, None , edition, warnings) ?;
1019
+ }
1020
+ _ => { }
1021
+ }
1022
+ merged_dep. features = match ( merged_dep. features . clone ( ) , features. clone ( ) ) {
1023
+ ( Some ( dep_feat) , Some ( inherit_feat) ) => Some (
1024
+ dep_feat
1025
+ . into_iter ( )
1026
+ . chain ( inherit_feat)
1027
+ . collect :: < Vec < String > > ( ) ,
1028
+ ) ,
1029
+ ( Some ( dep_fet) , None ) => Some ( dep_fet) ,
1030
+ ( None , Some ( inherit_feat) ) => Some ( inherit_feat) ,
1031
+ ( None , None ) => None ,
1032
+ } ;
1033
+ merged_dep. optional = * optional;
1034
+ merged_dep. public = * public;
1035
+ Ok ( manifest:: TomlDependency :: Detailed ( merged_dep) )
1036
+ }
1037
+
1038
+ fn deprecated_ws_default_features (
1039
+ label : & str ,
1040
+ ws_def_feat : Option < bool > ,
1041
+ edition : Edition ,
1042
+ warnings : & mut Vec < String > ,
1043
+ ) -> CargoResult < ( ) > {
1044
+ let ws_def_feat = match ws_def_feat {
1045
+ Some ( true ) => "true" ,
1046
+ Some ( false ) => "false" ,
1047
+ None => "not specified" ,
1048
+ } ;
1049
+ if Edition :: Edition2024 <= edition {
1050
+ anyhow:: bail!( "`default-features = false` cannot override workspace's `default-features`" ) ;
1051
+ } else {
979
1052
warnings. push ( format ! (
980
1053
"`default-features` is ignored for {label}, since `default-features` was \
981
1054
{ws_def_feat} for `workspace.dependencies.{label}`, \
982
1055
this could become a hard error in the future"
983
- ) )
1056
+ ) ) ;
984
1057
}
985
- inherit ( ) ?. get_dependency ( name, package_root) . map ( |ws_dep| {
986
- let mut merged_dep = match ws_dep {
987
- manifest:: TomlDependency :: Simple ( ws_version) => manifest:: TomlDetailedDependency {
988
- version : Some ( ws_version) ,
989
- ..Default :: default ( )
990
- } ,
991
- manifest:: TomlDependency :: Detailed ( ws_dep) => ws_dep. clone ( ) ,
992
- } ;
993
- let manifest:: TomlInheritedDependency {
994
- workspace : _,
995
-
996
- features,
997
- optional,
998
- default_features,
999
- default_features2,
1000
- public,
1001
-
1002
- _unused_keys : _,
1003
- } = & pkg_dep;
1004
- let default_features = default_features. or ( * default_features2) ;
1005
-
1006
- match ( default_features, merged_dep. default_features ( ) ) {
1007
- // member: default-features = true and
1008
- // workspace: default-features = false should turn on
1009
- // default-features
1010
- ( Some ( true ) , Some ( false ) ) => {
1011
- merged_dep. default_features = Some ( true ) ;
1012
- }
1013
- // member: default-features = false and
1014
- // workspace: default-features = true should ignore member
1015
- // default-features
1016
- ( Some ( false ) , Some ( true ) ) => {
1017
- default_features_msg ( name, Some ( true ) , warnings) ;
1018
- }
1019
- // member: default-features = false and
1020
- // workspace: dep = "1.0" should ignore member default-features
1021
- ( Some ( false ) , None ) => {
1022
- default_features_msg ( name, None , warnings) ;
1023
- }
1024
- _ => { }
1025
- }
1026
- merged_dep. features = match ( merged_dep. features . clone ( ) , features. clone ( ) ) {
1027
- ( Some ( dep_feat) , Some ( inherit_feat) ) => Some (
1028
- dep_feat
1029
- . into_iter ( )
1030
- . chain ( inherit_feat)
1031
- . collect :: < Vec < String > > ( ) ,
1032
- ) ,
1033
- ( Some ( dep_fet) , None ) => Some ( dep_fet) ,
1034
- ( None , Some ( inherit_feat) ) => Some ( inherit_feat) ,
1035
- ( None , None ) => None ,
1036
- } ;
1037
- merged_dep. optional = * optional;
1038
- merged_dep. public = * public;
1039
- manifest:: TomlDependency :: Detailed ( merged_dep)
1040
- } )
1058
+ Ok ( ( ) )
1041
1059
}
1042
1060
1043
1061
#[ tracing:: instrument( skip_all) ]
0 commit comments