authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-07-01 13:20:04-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-07-01 13:20:56-07:00
log23a4fc3db71c68c0ceea9ff56701fa6bffd3766c
tree805c5a502375355602e94b0b618d0c9ae543e5bc
parentfdf8e6df2becae5ffd8076cb3fb85d7b639c2cb8

std.Build: recognize error.LazyDependencyNeeded

when running user build functions. This makes control flow a lot easier to manage for lazy dependencies.

2 files changed, 16 insertions(+), 8 deletions(-)

lib/compiler/configurer.zig+1-1
...@@ -133,7 +133,7 @@ pub fn main(init: process.Init.Minimal) !void {...@@ -133,7 +133,7 @@ pub fn main(init: process.Init.Minimal) !void {
133 .off => .no_color,133 .off => .no_color,
134 };134 };
135135
136 builder.runBuild(root);136 builder.runPackageScript(root);
137137
138 if (builder.validateUserInputDidItFail()) {138 if (builder.validateUserInputDidItFail()) {
139 fatal(" access the help menu with 'zig build -h'", .{});139 fatal(" access the help menu with 'zig build -h'", .{});
lib/std/Build.zig+15-7
...@@ -2075,7 +2075,7 @@ fn findPkgHashOrFatal(b: *Build, name: []const u8) []const u8 {...@@ -2075,7 +2075,7 @@ fn findPkgHashOrFatal(b: *Build, name: []const u8) []const u8 {
2075 for (b.available_deps) |dep| {2075 for (b.available_deps) |dep| {
2076 if (mem.eql(u8, dep[0], name)) return dep[1];2076 if (mem.eql(u8, dep[0], name)) return dep[1];
2077 }2077 }
2078 std.log.info("all dependencies used by build.zig must be declared in corresponding build.zig.zon", .{});2078 log.info("all dependencies used by build.zig must be declared in corresponding build.zig.zon", .{});
2079 if (b.pkg_hash.len == 0) panic("no dependency named {s}", .{name});2079 if (b.pkg_hash.len == 0) panic("no dependency named {s}", .{name});
2080 panic("no dependency named {s} in {s} ({s})", .{ name, b.dep_prefix, b.pkg_hash });2080 panic("no dependency named {s} in {s} ({s})", .{ name, b.dep_prefix, b.pkg_hash });
2081}2081}
...@@ -2335,7 +2335,7 @@ fn dependencyInner(...@@ -2335,7 +2335,7 @@ fn dependencyInner(
23352335
2336 const sub_builder = b.createChild(name, dep_root, pkg_hash, pkg_deps, user_input_options) catch @panic("OOM");2336 const sub_builder = b.createChild(name, dep_root, pkg_hash, pkg_deps, user_input_options) catch @panic("OOM");
2337 if (build_zig) |bz| {2337 if (build_zig) |bz| {
2338 sub_builder.runBuild(bz);2338 sub_builder.runPackageScript(bz);
23392339
2340 if (sub_builder.validateUserInputDidItFail()) {2340 if (sub_builder.validateUserInputDidItFail()) {
2341 std.debug.dumpCurrentStackTrace(.{ .first_address = @returnAddress() });2341 std.debug.dumpCurrentStackTrace(.{ .first_address = @returnAddress() });
...@@ -2353,11 +2353,19 @@ fn dependencyInner(...@@ -2353,11 +2353,19 @@ fn dependencyInner(
2353}2353}
23542354
2355/// Build system implementation detail.2355/// Build system implementation detail.
2356pub fn runBuild(b: *Build, build_zig: anytype) void {2356pub inline fn runPackageScript(b: *Build, comptime build_zig: anytype) void {
2357 switch (@typeInfo(@typeInfo(@TypeOf(build_zig.build)).@"fn".return_type.?)) {2357 const result: anyerror!void = build_zig.build(b);
2358 .error_union => return build_zig.build(b) catch unreachable,2358 result catch |err| switch (err) {
2359 else => return build_zig.build(b),2359 error.LazyDependencyNeeded => assert(b.graph.needed_lazy_dependencies.count() != 0),
2360 }2360 else => {
2361 if (@errorReturnTrace()) |trace| std.debug.dumpErrorReturnTrace(trace);
2362 if (b.dep_prefix.len == 0) {
2363 process.fatal("package {q} configuration failed: {t}", .{ b.dep_prefix, err });
2364 } else {
2365 process.fatal("configuration failed: {t}", .{err});
2366 }
2367 },
2368 };
2361}2369}
23622370
2363// dirnameAllowEmpty is a variant of fs.path.dirname2371// dirnameAllowEmpty is a variant of fs.path.dirname