aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Build
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-02-16 15:04:10 -0700
committerAndrew Kelley <andrew@ziglang.org>2023-03-15 10:48:12 -0700
commitc5edd8b7f87f8432bbf058b3456393793118906e (patch)
tree318aeac422d4af88f4e5f5d2696c0b6caa52e1c4 /lib/std/Build
parent7ebaa05bb138ea397859edf8ec96a9209482ae8e (diff)
downloadzig-c5edd8b7f87f8432bbf058b3456393793118906e.tar.gz
zig-c5edd8b7f87f8432bbf058b3456393793118906e.zip
std.Build: better handling of stderr of child processes
With this commit, the build runner now communicates progress towards completion of the step graph to the terminal, while also printing the stderr of child processes as soon as possible, without clobbering each other, and without clobbering the CLI progress output.
Diffstat (limited to 'lib/std/Build')
-rw-r--r--lib/std/Build/Step.zig26
1 files changed, 24 insertions, 2 deletions
diff --git a/lib/std/Build/Step.zig b/lib/std/Build/Step.zig
index 7bab2d9ae4..42698f2190 100644
--- a/lib/std/Build/Step.zig
+++ b/lib/std/Build/Step.zig
@@ -9,7 +9,7 @@ state: State,
/// Populated only if state is success.
result: struct {
err_code: anyerror,
- stderr: []u8,
+ error_msgs: std.ArrayListUnmanaged([]const u8),
},
/// The return addresss associated with creation of this step that can be useful
/// to print along with debugging messages.
@@ -96,7 +96,7 @@ pub fn init(allocator: Allocator, options: Options) Step {
.state = .precheck_unstarted,
.result = .{
.err_code = undefined,
- .stderr = &.{},
+ .error_msgs = .{},
},
.debug_stack_trace = addresses,
};
@@ -133,6 +133,28 @@ pub fn cast(step: *Step, comptime T: type) ?*T {
return null;
}
+/// For debugging purposes, prints identifying information about this Step.
+pub fn dump(step: *Step) void {
+ std.debug.getStderrMutex().lock();
+ defer std.debug.getStderrMutex().unlock();
+
+ const stderr = std.io.getStdErr();
+ const w = stderr.writer();
+ const tty_config = std.debug.detectTTYConfig(stderr);
+ const debug_info = std.debug.getSelfDebugInfo() catch |err| {
+ w.print("Unable to dump stack trace: Unable to open debug info: {s}\n", .{
+ @errorName(err),
+ }) catch {};
+ return;
+ };
+ const ally = debug_info.allocator;
+ w.print("name: '{s}'. creation stack trace:\n", .{step.name}) catch {};
+ std.debug.writeStackTrace(step.getStackTrace(), w, ally, debug_info, tty_config) catch |err| {
+ stderr.writer().print("Unable to dump stack trace: {s}\n", .{@errorName(err)}) catch {};
+ return;
+ };
+}
+
const Step = @This();
const std = @import("../std.zig");
const Build = std.Build;