7
7
//! here, but it covers procedural macros as well.
8
8
9
9
use std:: {
10
+ cell:: RefCell ,
10
11
io,
11
12
path:: PathBuf ,
12
13
process:: { Command , Stdio } ,
@@ -107,15 +108,15 @@ impl WorkspaceBuildScripts {
107
108
by_id. insert ( workspace[ package] . id . clone ( ) , package) ;
108
109
}
109
110
110
- let mut cfg_err = None ;
111
- let mut stderr = String :: new ( ) ;
111
+ let errors = RefCell :: new ( String :: new ( ) ) ;
112
+ let push_err = |err : & str | {
113
+ let mut e = errors. borrow_mut ( ) ;
114
+ e. push_str ( err) ;
115
+ e. push ( '\n' ) ;
116
+ } ;
112
117
let output = stdx:: process:: streaming_output (
113
118
cmd,
114
119
& mut |line| {
115
- if cfg_err. is_some ( ) {
116
- return ;
117
- }
118
-
119
120
// Copy-pasted from existing cargo_metadata. It seems like we
120
121
// should be using serde_stacker here?
121
122
let mut deserializer = serde_json:: Deserializer :: from_str ( line) ;
@@ -135,7 +136,7 @@ impl WorkspaceBuildScripts {
135
136
match cfg. parse :: < CfgFlag > ( ) {
136
137
Ok ( it) => acc. push ( it) ,
137
138
Err ( err) => {
138
- cfg_err = Some ( format ! (
139
+ push_err ( & format ! (
139
140
"invalid cfg from cargo-metadata: {}" ,
140
141
err
141
142
) ) ;
@@ -177,15 +178,18 @@ impl WorkspaceBuildScripts {
177
178
}
178
179
Message :: CompilerMessage ( message) => {
179
180
progress ( message. target . name ) ;
181
+
182
+ if let Some ( diag) = message. message . rendered . as_deref ( ) {
183
+ push_err ( diag) ;
184
+ }
180
185
}
181
186
Message :: BuildFinished ( _) => { }
182
187
Message :: TextLine ( _) => { }
183
188
_ => { }
184
189
}
185
190
} ,
186
191
& mut |line| {
187
- stderr. push_str ( line) ;
188
- stderr. push ( '\n' ) ;
192
+ push_err ( line) ;
189
193
} ,
190
194
) ?;
191
195
@@ -205,16 +209,12 @@ impl WorkspaceBuildScripts {
205
209
}
206
210
}
207
211
208
- if let Some ( cfg_err) = cfg_err {
209
- stderr. push_str ( & cfg_err) ;
210
- stderr. push ( '\n' ) ;
211
- }
212
-
212
+ let mut errors = errors. into_inner ( ) ;
213
213
if !output. status . success ( ) {
214
- if stderr . is_empty ( ) {
215
- stderr = "cargo check failed" . to_string ( ) ;
214
+ if errors . is_empty ( ) {
215
+ errors = "cargo check failed" . to_string ( ) ;
216
216
}
217
- res. error = Some ( stderr )
217
+ res. error = Some ( errors ) ;
218
218
}
219
219
220
220
Ok ( res)
0 commit comments