@@ -98,7 +98,7 @@ impl ProjectJson {
98
98
crates : data
99
99
. crates
100
100
. into_iter ( )
101
- . map ( |crate_data| {
101
+ . map ( |mut crate_data| {
102
102
let root_module = absolutize_on_base ( crate_data. root_module ) ;
103
103
let is_workspace_member = crate_data
104
104
. is_workspace_member
@@ -122,6 +122,27 @@ impl ProjectJson {
122
122
None => None ,
123
123
} ;
124
124
125
+ crate_data. cfg_groups . sort_unstable ( ) ;
126
+ crate_data. cfg_groups . dedup ( ) ;
127
+ let cfg = crate_data
128
+ . cfg_groups
129
+ . iter ( )
130
+ . flat_map ( |cfg_extend| {
131
+ let cfg_group = data. cfg_groups . get ( cfg_extend) ;
132
+ match cfg_group {
133
+ Some ( cfg_group) => cfg_group. 0 . iter ( ) . cloned ( ) ,
134
+ None => {
135
+ tracing:: error!(
136
+ "Unknown cfg group `{cfg_extend}` in crate `{}`" ,
137
+ crate_data. display_name. as_deref( ) . unwrap_or( "<unknown>" ) ,
138
+ ) ;
139
+ [ ] . iter ( ) . cloned ( )
140
+ }
141
+ }
142
+ } )
143
+ . chain ( crate_data. cfg . 0 )
144
+ . collect ( ) ;
145
+
125
146
Crate {
126
147
display_name : crate_data
127
148
. display_name
@@ -131,7 +152,7 @@ impl ProjectJson {
131
152
edition : crate_data. edition . into ( ) ,
132
153
version : crate_data. version . as_ref ( ) . map ( ToString :: to_string) ,
133
154
deps : crate_data. deps ,
134
- cfg : crate_data . cfg ,
155
+ cfg,
135
156
target : crate_data. target ,
136
157
env : crate_data. env ,
137
158
proc_macro_dylib_path : crate_data
@@ -306,11 +327,17 @@ pub enum RunnableKind {
306
327
pub struct ProjectJsonData {
307
328
sysroot : Option < Utf8PathBuf > ,
308
329
sysroot_src : Option < Utf8PathBuf > ,
330
+ #[ serde( default ) ]
331
+ cfg_groups : FxHashMap < String , CfgList > ,
309
332
crates : Vec < CrateData > ,
310
333
#[ serde( default ) ]
311
334
runnables : Vec < RunnableData > ,
312
335
}
313
336
337
+ #[ derive( Serialize , Deserialize , Debug , Clone , Eq , PartialEq , Default ) ]
338
+ #[ serde( transparent) ]
339
+ struct CfgList ( #[ serde( with = "cfg_" ) ] Vec < CfgAtom > ) ;
340
+
314
341
#[ derive( Serialize , Deserialize , Debug , Clone , Eq , PartialEq ) ]
315
342
struct CrateData {
316
343
display_name : Option < String > ,
@@ -319,9 +346,11 @@ struct CrateData {
319
346
#[ serde( default ) ]
320
347
version : Option < semver:: Version > ,
321
348
deps : Vec < Dep > ,
349
+ // Cannot be a hashset because that would mean an inconsistent order.
350
+ #[ serde( default ) ]
351
+ cfg_groups : Vec < String > ,
322
352
#[ serde( default ) ]
323
- #[ serde( with = "cfg_" ) ]
324
- cfg : Vec < CfgAtom > ,
353
+ cfg : CfgList ,
325
354
target : Option < String > ,
326
355
#[ serde( default ) ]
327
356
env : FxHashMap < String , String > ,
0 commit comments