aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Build
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-12-12 19:04:35 -0800
committerAndrew Kelley <andrew@ziglang.org>2025-12-23 22:15:09 -0800
commit1925e0319f1337b4856bd5a181bf4f6d3ac7d428 (patch)
treeb38839cca2604368b01b4312119083a5cdf3d224 /lib/std/Build
parentec56696503e702e063af8740a77376b2e7694c29 (diff)
downloadzig-1925e0319f1337b4856bd5a181bf4f6d3ac7d428.tar.gz
zig-1925e0319f1337b4856bd5a181bf4f6d3ac7d428.zip
update lockStderrWriter sites
use the application's Io implementation where possible. This correctly makes writing to stderr cancelable, fallible, and participate in the application's event loop. It also removes one more hard-coded dependency on a secondary Io implementation.
Diffstat (limited to 'lib/std/Build')
-rw-r--r--lib/std/Build/Fuzz.zig21
-rw-r--r--lib/std/Build/Step/Compile.zig17
-rw-r--r--lib/std/Build/Step/Run.zig5
-rw-r--r--lib/std/Build/WebServer.zig2
4 files changed, 25 insertions, 20 deletions
diff --git a/lib/std/Build/Fuzz.zig b/lib/std/Build/Fuzz.zig
index c2b7d1e9e9..4770e03a0c 100644
--- a/lib/std/Build/Fuzz.zig
+++ b/lib/std/Build/Fuzz.zig
@@ -158,6 +158,7 @@ fn rebuildTestsWorkerRun(run: *Step.Run, gpa: Allocator, parent_prog_node: std.P
}
fn rebuildTestsWorkerRunFallible(run: *Step.Run, gpa: Allocator, parent_prog_node: std.Progress.Node) !void {
+ const io = run.step.owner.graph.io;
const compile = run.producer.?;
const prog_node = parent_prog_node.start(compile.step.name, 0);
defer prog_node.end();
@@ -170,8 +171,8 @@ fn rebuildTestsWorkerRunFallible(run: *Step.Run, gpa: Allocator, parent_prog_nod
if (show_error_msgs or show_compile_errors or show_stderr) {
var buf: [256]u8 = undefined;
- const stderr = std.debug.lockStderrWriter(&buf);
- defer std.debug.unlockStderrWriter();
+ const stderr = try io.lockStderrWriter(&buf);
+ defer io.unlockStderrWriter();
build_runner.printErrorMessages(gpa, &compile.step, .{}, &stderr.interface, stderr.mode, .verbose, .indent) catch {};
}
@@ -182,12 +183,10 @@ fn rebuildTestsWorkerRunFallible(run: *Step.Run, gpa: Allocator, parent_prog_nod
run.rebuilt_executable = try rebuilt_bin_path.join(gpa, compile.out_filename);
}
-fn fuzzWorkerRun(
- fuzz: *Fuzz,
- run: *Step.Run,
- unit_test_index: u32,
-) void {
- const gpa = run.step.owner.allocator;
+fn fuzzWorkerRun(fuzz: *Fuzz, run: *Step.Run, unit_test_index: u32) void {
+ const owner = run.step.owner;
+ const gpa = owner.allocator;
+ const io = owner.graph.io;
const test_name = run.cached_test_metadata.?.testName(unit_test_index);
const prog_node = fuzz.prog_node.start(test_name, 0);
@@ -196,8 +195,10 @@ fn fuzzWorkerRun(
run.rerunInFuzzMode(fuzz, unit_test_index, prog_node) catch |err| switch (err) {
error.MakeFailed => {
var buf: [256]u8 = undefined;
- const stderr = std.debug.lockStderrWriter(&buf);
- defer std.debug.unlockStderrWriter();
+ const stderr = io.lockStderrWriter(&buf) catch |e| switch (e) {
+ error.Canceled => return,
+ };
+ defer io.unlockStderrWriter();
build_runner.printErrorMessages(gpa, &run.step, .{}, &stderr.interface, stderr.mode, .verbose, .indent) catch {};
return;
},
diff --git a/lib/std/Build/Step/Compile.zig b/lib/std/Build/Step/Compile.zig
index d703e55b87..888775884d 100644
--- a/lib/std/Build/Step/Compile.zig
+++ b/lib/std/Build/Step/Compile.zig
@@ -922,20 +922,23 @@ const CliNamedModules = struct {
}
};
-fn getGeneratedFilePath(compile: *Compile, comptime tag_name: []const u8, asking_step: ?*Step) []const u8 {
+fn getGeneratedFilePath(compile: *Compile, comptime tag_name: []const u8, asking_step: ?*Step) ![]const u8 {
+ const step = &compile.step;
+ const b = step.owner;
+ const io = b.graph.io;
const maybe_path: ?*GeneratedFile = @field(compile, tag_name);
const generated_file = maybe_path orelse {
- const stderr = std.debug.lockStderrWriter(&.{});
+ const stderr = try io.lockStderrWriter(&.{});
std.Build.dumpBadGetPathHelp(&compile.step, &stderr.interface, stderr.mode, compile.step.owner, asking_step) catch {};
- std.debug.unlockStderrWriter();
+ io.unlockStderrWriter();
@panic("missing emit option for " ++ tag_name);
};
const path = generated_file.path orelse {
- const stderr = std.debug.lockStderrWriter(&.{});
+ const stderr = try io.lockStderrWriter(&.{});
std.Build.dumpBadGetPathHelp(&compile.step, &stderr.interface, stderr.mode, compile.step.owner, asking_step) catch {};
- std.debug.unlockStderrWriter();
+ io.unlockStderrWriter();
@panic(tag_name ++ " is null. Is there a missing step dependency?");
};
@@ -1149,9 +1152,9 @@ fn getZigArgs(compile: *Compile, fuzz: bool) ![][]const u8 {
// For everything else, we directly link
// against the library file.
const full_path_lib = if (other_produces_implib)
- other.getGeneratedFilePath("generated_implib", &compile.step)
+ try other.getGeneratedFilePath("generated_implib", &compile.step)
else
- other.getGeneratedFilePath("generated_bin", &compile.step);
+ try other.getGeneratedFilePath("generated_bin", &compile.step);
try zig_args.append(full_path_lib);
total_linker_objects += 1;
diff --git a/lib/std/Build/Step/Run.zig b/lib/std/Build/Step/Run.zig
index f1e5313905..67cf201374 100644
--- a/lib/std/Build/Step/Run.zig
+++ b/lib/std/Build/Step/Run.zig
@@ -1559,6 +1559,7 @@ fn spawnChildAndCollect(
) !?EvalGenericResult {
const b = run.step.owner;
const arena = b.allocator;
+ const io = b.graph.io;
if (fuzz_context != null) {
assert(!has_side_effects);
@@ -1625,10 +1626,10 @@ fn spawnChildAndCollect(
child.progress_node = options.progress_node;
}
if (inherit) {
- const stderr = std.debug.lockStderrWriter(&.{});
+ const stderr = try io.lockStderrWriter(&.{});
try setColorEnvironmentVariables(run, env_map, stderr.mode);
}
- defer if (inherit) std.debug.unlockStderrWriter();
+ defer if (inherit) io.unlockStderrWriter();
var timer = try std.time.Timer.start();
const res = try evalGeneric(run, &child);
run.step.result_duration_ns = timer.read();
diff --git a/lib/std/Build/WebServer.zig b/lib/std/Build/WebServer.zig
index ccb7159192..a2b35e3522 100644
--- a/lib/std/Build/WebServer.zig
+++ b/lib/std/Build/WebServer.zig
@@ -655,7 +655,7 @@ fn buildClientWasm(ws: *WebServer, arena: Allocator, optimize: std.builtin.Optim
}
if (result_error_bundle.errorMessageCount() > 0) {
- result_error_bundle.renderToStdErr(.{}, .auto);
+ try result_error_bundle.renderToStderr(io, .{}, .auto);
log.err("the following command failed with {d} compilation errors:\n{s}", .{
result_error_bundle.errorMessageCount(),
try Build.Step.allocPrintCmd(arena, null, argv.items),