diff --git a/lib/compiler/Maker.zig b/lib/compiler/Maker.zig index 62c6e879277916637d910cdb1861e4393446f73e..ad73ac16272d6848bbe4234f88ba833bb4bbaa7e 100644 --- a/lib/compiler/Maker.zig +++ b/lib/compiler/Maker.zig @@ -560,10 +560,11 @@ pub fn main(init: process.Init.Minimal) !void { const cwd_path = std.zig.getResolvedCwd(io, arena) catch |err| fatal("resolving current directory path failed: {t}", .{err}); - const build_root = try findBuildRoot(arena, io, .{ + var build_root = try findBuildRoot(arena, io, .{ .cwd_path = cwd_path, .build_file = build_file, }); + defer build_root.deinit(io); graph.build_root_directory = build_root.directory; graph.local_cache_root = if (override_local_cache_dir) |unresolved_path| std.zig.Directories.openUnresolved( @@ -3335,22 +3336,21 @@ inline fn debugMakerLeaks() bool { const BuildRoot = struct { directory: Cache.Directory, + close_directory: bool, build_zig_basename: []const u8, - cleanup_build_dir: ?Io.Dir, fn deinit(br: *BuildRoot, io: Io) void { - if (br.cleanup_build_dir) |*dir| dir.close(io); + if (br.close_directory) br.directory.handle.close(io); br.* = undefined; } }; const FindBuildRootOptions = struct { build_file: ?[]const u8 = null, - cwd_path: ?[]const u8 = null, + cwd_path: []const u8, }; fn findBuildRoot(arena: Allocator, io: Io, options: FindBuildRootOptions) !BuildRoot { - const cwd_path = options.cwd_path orelse try std.zig.getResolvedCwd(io, arena); const build_zig_basename = if (options.build_file) |bf| Dir.path.basename(bf) else @@ -3364,35 +3364,41 @@ fn findBuildRoot(arena: Allocator, io: Io, options: FindBuildRootOptions) !Build return .{ .build_zig_basename = build_zig_basename, .directory = .{ .path = dirname, .handle = dir }, - .cleanup_build_dir = dir, + .close_directory = true, }; } return .{ .build_zig_basename = build_zig_basename, - .directory = .{ .path = null, .handle = Io.Dir.cwd() }, - .cleanup_build_dir = null, + .directory = .cwd(), + .close_directory = false, }; } // Search up parent directories until we find build.zig. - var dirname: []const u8 = cwd_path; + var dirname: ?[]const u8 = null; while (true) { - const joined_path = try Dir.path.join(arena, &[_][]const u8{ dirname, build_zig_basename }); + const joined_path = if (dirname) |d| + try Dir.path.join(arena, &.{ d, build_zig_basename }) + else + build_zig_basename; if (Io.Dir.cwd().access(io, joined_path, .{})) |_| { - const dir = Io.Dir.cwd().openDir(io, dirname, .{}) catch |err| { - fatal("unable to open directory while searching for build.zig file, {q}: {t}", .{ dirname, err }); - }; + const dir = if (dirname) |d| + Io.Dir.cwd().openDir(io, d, .{}) catch |err| { + fatal("unable to open directory while searching for build.zig file, {q}: {t}", .{ d, err }); + } + else + Io.Dir.cwd(); return .{ .build_zig_basename = build_zig_basename, .directory = .{ .path = dirname, .handle = dir, }, - .cleanup_build_dir = dir, + .close_directory = dirname != null, }; } else |err| switch (err) { error.FileNotFound => { - dirname = Dir.path.dirname(dirname) orelse { + dirname = Dir.path.dirname(dirname orelse options.cwd_path) orelse { log.info("initialize {s} template file with \"zig init\"", .{std.zig.build_zig_basename}); log.info("see \"zig --help\" for more options", .{}); fatal("no build.zig file found, in the current directory or any parent directories", .{});