@@ -11,12 +11,14 @@ use eyre::{bail, Context, OptionExt, Result};
11
11
use parse:: ParsedTargetInfoFile ;
12
12
use serde:: Deserialize ;
13
13
14
- /// Information about a target obtained from the target_info markdown file .
15
- struct TargetDocs {
14
+ /// Information about a target obtained from the markdown and rustc .
15
+ struct TargetInfo {
16
16
name : String ,
17
17
maintainers : Vec < String > ,
18
18
sections : Vec < ( String , String ) > ,
19
19
footnotes : Vec < String > ,
20
+ target_cfgs : Vec < ( String , String ) > ,
21
+ metadata : RustcTargetMetadata ,
20
22
}
21
23
22
24
/// All the sections that we want every doc page to have.
@@ -56,29 +58,48 @@ fn main() -> Result<()> {
56
58
. wrap_err ( "failed loading target_info" ) ?
57
59
. into_iter ( )
58
60
. map ( |info| {
59
- let footnotes_used =
60
- info. footnotes . iter ( ) . map ( |( target, _) | ( target. clone ( ) , false ) ) . collect ( ) ;
61
- TargetPatternEntry { info, used : false , footnotes_used }
61
+ let footnotes_used = info
62
+ . footnotes
63
+ . keys ( )
64
+ . map ( |target| ( target. clone ( ) , false ) )
65
+ . collect ( ) ;
66
+ TargetPatternEntry {
67
+ info,
68
+ used : false ,
69
+ footnotes_used,
70
+ }
62
71
} )
63
72
. collect :: < Vec < _ > > ( ) ;
64
73
65
74
eprintln ! ( "Collecting rustc information" ) ;
66
- let rustc_infos =
67
- targets. iter ( ) . map ( |target| rustc_target_info ( & rustc, target) ) . collect :: < Vec < _ > > ( ) ;
75
+ let rustc_infos = targets
76
+ . iter ( )
77
+ . map ( |target| rustc_target_info ( & rustc, target) )
78
+ . collect :: < Vec < _ > > ( ) ;
68
79
69
80
let targets = targets
70
81
. into_iter ( )
71
82
. map ( |target| target_doc_info ( & mut info_patterns, target) )
72
83
. zip ( rustc_infos)
84
+ . map ( |( md, rustc) | TargetInfo {
85
+ name : md. name ,
86
+ maintainers : md. maintainers ,
87
+ sections : md. sections ,
88
+ footnotes : md. footnotes ,
89
+ target_cfgs : rustc. target_cfgs ,
90
+ metadata : rustc. metadata ,
91
+ } )
73
92
. collect :: < Vec < _ > > ( ) ;
74
93
75
94
eprintln ! ( "Rendering targets check_only={check_only}" ) ;
76
- let targets_dir = Path :: new ( output_src) . join ( "platform-support" ) . join ( "targets" ) ;
95
+ let targets_dir = Path :: new ( output_src)
96
+ . join ( "platform-support" )
97
+ . join ( "targets" ) ;
77
98
if !check_only {
78
99
std:: fs:: create_dir_all ( & targets_dir) . wrap_err ( "creating platform-support/targets dir" ) ?;
79
100
}
80
- for ( info, rustc_info ) in & targets {
81
- let doc = render:: render_target_md ( info, rustc_info ) ;
101
+ for info in & targets {
102
+ let doc = render:: render_target_md ( info) ;
82
103
83
104
if !check_only {
84
105
std:: fs:: write ( targets_dir. join ( format ! ( "{}.md" , info. name) ) , doc)
@@ -88,7 +109,10 @@ fn main() -> Result<()> {
88
109
89
110
for target_pattern in info_patterns {
90
111
if !target_pattern. used {
91
- bail ! ( "target pattern `{}` was never used" , target_pattern. info. pattern) ;
112
+ bail ! (
113
+ "target pattern `{}` was never used" ,
114
+ target_pattern. info. pattern
115
+ ) ;
92
116
}
93
117
94
118
for footnote_target in target_pattern. info . footnotes . keys ( ) {
@@ -115,7 +139,15 @@ struct TargetPatternEntry {
115
139
footnotes_used : HashMap < String , bool > ,
116
140
}
117
141
118
- fn target_doc_info ( info_patterns : & mut [ TargetPatternEntry ] , target : & str ) -> TargetDocs {
142
+ /// Information about a target obtained from the target_info markdown file.
143
+ struct TargetInfoMd {
144
+ name : String ,
145
+ maintainers : Vec < String > ,
146
+ sections : Vec < ( String , String ) > ,
147
+ footnotes : Vec < String > ,
148
+ }
149
+
150
+ fn target_doc_info ( info_patterns : & mut [ TargetPatternEntry ] , target : & str ) -> TargetInfoMd {
119
151
let mut maintainers = Vec :: new ( ) ;
120
152
let mut sections = Vec :: new ( ) ;
121
153
@@ -128,7 +160,6 @@ fn target_doc_info(info_patterns: &mut [TargetPatternEntry], target: &str) -> Ta
128
160
129
161
maintainers. extend_from_slice ( & target_pattern. maintainers ) ;
130
162
131
-
132
163
for ( section_name, content) in & target_pattern. sections {
133
164
if sections. iter ( ) . any ( |( name, _) | name == section_name) {
134
165
panic ! (
@@ -139,7 +170,9 @@ fn target_doc_info(info_patterns: &mut [TargetPatternEntry], target: &str) -> Ta
139
170
}
140
171
141
172
if let Some ( target_footnotes) = target_pattern. footnotes . get ( target) {
142
- target_pattern_entry. footnotes_used . insert ( target. to_owned ( ) , true ) ;
173
+ target_pattern_entry
174
+ . footnotes_used
175
+ . insert ( target. to_owned ( ) , true ) ;
143
176
144
177
if !footnotes. is_empty ( ) {
145
178
panic ! ( "target {target} is assigned metadata from more than one pattern" ) ;
@@ -149,7 +182,12 @@ fn target_doc_info(info_patterns: &mut [TargetPatternEntry], target: &str) -> Ta
149
182
}
150
183
}
151
184
152
- TargetDocs { name : target. to_owned ( ) , maintainers, sections, footnotes }
185
+ TargetInfoMd {
186
+ name : target. to_owned ( ) ,
187
+ maintainers,
188
+ sections,
189
+ footnotes,
190
+ }
153
191
}
154
192
155
193
/// Information about a target obtained from rustc.
@@ -173,7 +211,7 @@ fn rustc_target_info(rustc: &Path, target: &str) -> RustcTargetInfo {
173
211
. lines ( )
174
212
. filter_map ( |line| {
175
213
if line. starts_with ( "target_" ) {
176
- let Some ( ( key, value) ) = line. split_once ( "=" ) else {
214
+ let Some ( ( key, value) ) = line. split_once ( '=' ) else {
177
215
// For example `unix`
178
216
return None ;
179
217
} ;
@@ -191,12 +229,21 @@ fn rustc_target_info(rustc: &Path, target: &str) -> RustcTargetInfo {
191
229
192
230
let json_spec = rustc_stdout (
193
231
rustc,
194
- & [ "-Zunstable-options" , "--print" , "target-spec-json" , "--target" , target] ,
232
+ & [
233
+ "-Zunstable-options" ,
234
+ "--print" ,
235
+ "target-spec-json" ,
236
+ "--target" ,
237
+ target,
238
+ ] ,
195
239
) ;
196
240
let spec = serde_json:: from_str :: < TargetJson > ( & json_spec)
197
241
. expect ( "parsing --print target-spec-json for metadata" ) ;
198
242
199
- RustcTargetInfo { target_cfgs, metadata : spec. metadata }
243
+ RustcTargetInfo {
244
+ target_cfgs,
245
+ metadata : spec. metadata ,
246
+ }
200
247
}
201
248
202
249
fn rustc_stdout ( rustc : & Path , args : & [ & str ] ) -> String {
0 commit comments