authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-03-09 23:56:12-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-03-15 10:48:14-07:00
log7d5bce56e16cd7661b79046d573427972bbb6cf5
treee1ed0d941eaa4a6813fad9ec2815c6d176f3e3f8
parent097bcca069c5c7abdf77f321182eb4a0c54b3a93

build runner: print to stderr in dumb terminals

Terminal progress is suppressed and instead there is an explicit handling of printing to stderr, one line per step make() function call. The output looks very similar to Ninja. A future commit should add a -q to quiet the output.

1 files changed, 34 insertions(+), 9 deletions(-)

lib/build_runner.zig+34-9
...@@ -278,8 +278,12 @@ pub fn main() !void {...@@ -278,8 +278,12 @@ pub fn main() !void {
278 .windows_api => {},278 .windows_api => {},
279 }279 }
280280
281 var progress: std.Progress = .{ .dont_print_on_dumb = true };281 var progress: std.Progress = .{};
282 const main_progress_node = progress.start("", 0);282 const main_progress_node = progress.start("", 0);
283 if (ttyconf == .no_color) {
284 progress.timer = null;
285 progress.terminal = null;
286 }
283287
284 builder.debug_log_scopes = debug_log_scopes.items;288 builder.debug_log_scopes = debug_log_scopes.items;
285 builder.resolveInstallPrefix(install_prefix, dir_list);289 builder.resolveInstallPrefix(install_prefix, dir_list);
...@@ -302,6 +306,9 @@ pub fn main() !void {...@@ -302,6 +306,9 @@ pub fn main() !void {
302 .enable_summary = enable_summary,306 .enable_summary = enable_summary,
303 .ttyconf = ttyconf,307 .ttyconf = ttyconf,
304 .stderr = stderr,308 .stderr = stderr,
309
310 .step_index = 0,
311 .step_count = undefined,
305 };312 };
306313
307 if (run.max_rss == 0) {314 if (run.max_rss == 0) {
...@@ -332,6 +339,9 @@ const Run = struct {...@@ -332,6 +339,9 @@ const Run = struct {
332 enable_summary: ?bool,339 enable_summary: ?bool,
333 ttyconf: std.debug.TTY.Config,340 ttyconf: std.debug.TTY.Config,
334 stderr: std.fs.File,341 stderr: std.fs.File,
342
343 step_count: usize,
344 step_index: usize,
335};345};
336346
337fn runStepNames(347fn runStepNames(
...@@ -395,7 +405,8 @@ fn runStepNames(...@@ -395,7 +405,8 @@ fn runStepNames(
395 {405 {
396 defer parent_prog_node.end();406 defer parent_prog_node.end();
397407
398 var step_prog = parent_prog_node.start("run steps", step_stack.count());408 run.step_count = step_stack.count();
409 var step_prog = parent_prog_node.start("run steps", run.step_count);
399 defer step_prog.end();410 defer step_prog.end();
400411
401 var wait_group: std.Thread.WaitGroup = .{};412 var wait_group: std.Thread.WaitGroup = .{};
...@@ -739,10 +750,27 @@ fn workerMakeOneStep(...@@ -739,10 +750,27 @@ fn workerMakeOneStep(
739 sub_prog_node.activate();750 sub_prog_node.activate();
740 defer sub_prog_node.end();751 defer sub_prog_node.end();
741752
742 // I suspect we will want to pass `b` to make() in a future modification.753 const stderr = run.stderr;
743 // For example, CompileStep does some sus things with modifying the saved754 const ttyconf = run.ttyconf;
744 // *Build object in install header steps that might be able to be removed755
745 // by passing the *Build object through the make() functions.756 // If we are unable to print a fancy terminal progress bar, then we resort
757 // to 1 line printed to stderr for each step, similar to Ninja.
758 if (ttyconf == .no_color) {
759 var buf: [120]u8 = undefined;
760 const step_index = @atomicRmw(usize, &run.step_index, .Add, 1, .Monotonic);
761 const text = std.fmt.bufPrint(&buf, "[{d}/{d}] Making {s}{s}\n", .{
762 step_index + 1, run.step_count, s.owner.dep_prefix, s.name,
763 }) catch |err| switch (err) {
764 error.NoSpaceLeft => blk: {
765 buf[buf.len - 4 ..].* = "...\n".*;
766 break :blk &buf;
767 },
768 };
769 std.debug.getStderrMutex().lock();
770 defer std.debug.getStderrMutex().unlock();
771 stderr.writeAll(text) catch {};
772 }
773
746 const make_result = s.make(&sub_prog_node);774 const make_result = s.make(&sub_prog_node);
747775
748 // No matter the result, we want to display error/warning messages.776 // No matter the result, we want to display error/warning messages.
...@@ -750,9 +778,6 @@ fn workerMakeOneStep(...@@ -750,9 +778,6 @@ fn workerMakeOneStep(
750 sub_prog_node.context.lock_stderr();778 sub_prog_node.context.lock_stderr();
751 defer sub_prog_node.context.unlock_stderr();779 defer sub_prog_node.context.unlock_stderr();
752780
753 const stderr = run.stderr;
754 const ttyconf = run.ttyconf;
755
756 for (s.result_error_msgs.items) |msg| {781 for (s.result_error_msgs.items) |msg| {
757 // Sometimes it feels like you just can't catch a break. Finally,782 // Sometimes it feels like you just can't catch a break. Finally,
758 // with Zig, you can.783 // with Zig, you can.