@@ -42,7 +42,7 @@ Status* Status::factory(const BuildConfig& config) {
42
42
43
43
StatusPrinter::StatusPrinter (const BuildConfig& config)
44
44
: config_(config), started_edges_(0 ), finished_edges_(0 ), total_edges_(0 ),
45
- running_edges_(0 ), progress_status_format_(NULL ),
45
+ running_edges_(0 ), printer_( true ), err_printer_( false ), progress_status_format_(NULL ),
46
46
current_rate_(config.parallelism) {
47
47
// Don't do anything fancy in verbose mode.
48
48
if (config_.verbosity != BuildConfig::NORMAL)
@@ -90,8 +90,10 @@ void StatusPrinter::BuildEdgeStarted(const Edge* edge,
90
90
if (edge->use_console () || printer_.is_smart_terminal ())
91
91
PrintStatus (edge, start_time_millis);
92
92
93
- if (edge->use_console ())
93
+ if (edge->use_console ()) {
94
94
printer_.SetConsoleLocked (true );
95
+ err_printer_.SetConsoleLocked (true );
96
+ }
95
97
}
96
98
97
99
void StatusPrinter::RecalculateProgressPrediction () {
@@ -175,7 +177,7 @@ void StatusPrinter::RecalculateProgressPrediction() {
175
177
176
178
void StatusPrinter::BuildEdgeFinished (Edge* edge, int64_t start_time_millis,
177
179
int64_t end_time_millis, bool success,
178
- const string& output) {
180
+ const string& output, const std::string& error ) {
179
181
time_millis_ = end_time_millis;
180
182
++finished_edges_;
181
183
@@ -190,8 +192,10 @@ void StatusPrinter::BuildEdgeFinished(Edge* edge, int64_t start_time_millis,
190
192
} else
191
193
--eta_unpredictable_edges_remaining_;
192
194
193
- if (edge->use_console ())
195
+ if (edge->use_console ()) {
194
196
printer_.SetConsoleLocked (false );
197
+ err_printer_.SetConsoleLocked (false );
198
+ }
195
199
196
200
if (config_.verbosity == BuildConfig::QUIET)
197
201
return ;
@@ -208,12 +212,14 @@ void StatusPrinter::BuildEdgeFinished(Edge* edge, int64_t start_time_millis,
208
212
o != edge->outputs_ .end (); ++o)
209
213
outputs += (*o)->path () + " " ;
210
214
211
- if (printer_.supports_color ()) {
212
- printer_.PrintOnNewLine (" \x1B [31m" " FAILED: " " \x1B [0m" + outputs + " \n " );
215
+ printer_.CompleteLine ();
216
+
217
+ if (err_printer_.supports_color ()) {
218
+ err_printer_.PrintOnNewLine (" \x1B [31m" " FAILED: " " \x1B [0m" + outputs + " \n " );
213
219
} else {
214
- printer_ .PrintOnNewLine (" FAILED: " + outputs + " \n " );
220
+ err_printer_ .PrintOnNewLine (" FAILED: " + outputs + " \n " );
215
221
}
216
- printer_ .PrintOnNewLine (edge->EvaluateCommand () + " \n " );
222
+ err_printer_ .PrintOnNewLine (edge->EvaluateCommand () + " \n " );
217
223
}
218
224
219
225
if (!output.empty ()) {
@@ -247,6 +253,22 @@ void StatusPrinter::BuildEdgeFinished(Edge* edge, int64_t start_time_millis,
247
253
_setmode (_fileno (stdout), _O_TEXT); // End Windows extra CR fix
248
254
#endif
249
255
}
256
+
257
+ if (!error.empty ()) {
258
+ string::size_type begin = 0 ;
259
+ while (true ) {
260
+ const std::string::size_type crpos = error.find (' \xd ' , begin);
261
+ if (crpos == string::npos) {
262
+ fwrite (error.c_str () + begin, error.size () - begin, 1 , stderr);
263
+ break ;
264
+ }
265
+ const std::string::size_type size = crpos - begin;
266
+ if (size != 0 )
267
+ fwrite (error.c_str () + begin, crpos - begin, 1 , stderr);
268
+ begin = crpos + 1 ;
269
+ }
270
+ fflush (stderr);
271
+ }
250
272
}
251
273
252
274
void StatusPrinter::BuildStarted () {
0 commit comments