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 {
133133 .off => .no_color,
134134 };
135135
136 builder.runBuild(root);
136 builder.runPackageScript(root);
137137
138138 if (builder.validateUserInputDidItFail()) {
139139 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 {
20752075 for (b.available_deps) |dep| {
20762076 if (mem.eql(u8, dep[0], name)) return dep[1];
20772077 }
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", .{});
20792079 if (b.pkg_hash.len == 0) panic("no dependency named {s}", .{name});
20802080 panic("no dependency named {s} in {s} ({s})", .{ name, b.dep_prefix, b.pkg_hash });
20812081}
......@@ -2335,7 +2335,7 @@ fn dependencyInner(
23352335
23362336 const sub_builder = b.createChild(name, dep_root, pkg_hash, pkg_deps, user_input_options) catch @panic("OOM");
23372337 if (build_zig) |bz| {
2338 sub_builder.runBuild(bz);
2338 sub_builder.runPackageScript(bz);
23392339
23402340 if (sub_builder.validateUserInputDidItFail()) {
23412341 std.debug.dumpCurrentStackTrace(.{ .first_address = @returnAddress() });
......@@ -2353,11 +2353,19 @@ fn dependencyInner(
23532353}
23542354
23552355/// Build system implementation detail.
2356pub fn runBuild(b: *Build, build_zig: anytype) void {
2357 switch (@typeInfo(@typeInfo(@TypeOf(build_zig.build)).@"fn".return_type.?)) {
2358 .error_union => return build_zig.build(b) catch unreachable,
2359 else => return build_zig.build(b),
2360 }
2356pub inline fn runPackageScript(b: *Build, comptime build_zig: anytype) void {
2357 const result: anyerror!void = build_zig.build(b);
2358 result catch |err| switch (err) {
2359 error.LazyDependencyNeeded => assert(b.graph.needed_lazy_dependencies.count() != 0),
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 };
23612369}
23622370
23632371// dirnameAllowEmpty is a variant of fs.path.dirname