| ... | @@ -164,12 +164,12 @@ pub fn main(init: process.Init.Minimal) !void { | ... | @@ -164,12 +164,12 @@ pub fn main(init: process.Init.Minimal) !void { |
| 164 | | 164 | |
| 165 | const cwd: Dir = .cwd(); | 165 | const cwd: Dir = .cwd(); |
| 166 | | 166 | |
| 167 | const zig_lib_directory: Cache.Directory = .{ | 167 | const zig_lib_directory: Cache.Directory = if (std.mem.eql(u8, zig_lib_arg, ".")) .cwd() else .{ |
| 168 | .path = zig_lib_arg, | 168 | .path = zig_lib_arg, |
| 169 | .handle = try cwd.openDir(io, zig_lib_arg, .{}), | 169 | .handle = try cwd.openDir(io, zig_lib_arg, .{}), |
| 170 | }; | 170 | }; |
| 171 | | 171 | |
| 172 | const global_cache_directory: Cache.Directory = .{ | 172 | const global_cache_directory: Cache.Directory = if (std.mem.eql(u8, global_cache_arg, ".")) .cwd() else .{ |
| 173 | .path = global_cache_arg, | 173 | .path = global_cache_arg, |
| 174 | .handle = try cwd.createDirPathOpen(io, global_cache_arg, .{}), | 174 | .handle = try cwd.createDirPathOpen(io, global_cache_arg, .{}), |
| 175 | }; | 175 | }; |
| ... | @@ -560,10 +560,11 @@ pub fn main(init: process.Init.Minimal) !void { | ... | @@ -560,10 +560,11 @@ pub fn main(init: process.Init.Minimal) !void { |
| 560 | const cwd_path = std.zig.getResolvedCwd(io, arena) catch |err| | 560 | const cwd_path = std.zig.getResolvedCwd(io, arena) catch |err| |
| 561 | fatal("resolving current directory path failed: {t}", .{err}); | 561 | fatal("resolving current directory path failed: {t}", .{err}); |
| 562 | | 562 | |
| 563 | const build_root = try findBuildRoot(arena, io, .{ | 563 | var build_root = try findBuildRoot(arena, io, .{ |
| 564 | .cwd_path = cwd_path, | 564 | .cwd_path = cwd_path, |
| 565 | .build_file = build_file, | 565 | .build_file = build_file, |
| 566 | }); | 566 | }); |
| | 567 | defer build_root.deinit(io); |
| 567 | | 568 | |
| 568 | graph.build_root_directory = build_root.directory; | 569 | graph.build_root_directory = build_root.directory; |
| 569 | graph.local_cache_root = if (override_local_cache_dir) |unresolved_path| std.zig.Directories.openUnresolved( | 570 | graph.local_cache_root = if (override_local_cache_dir) |unresolved_path| std.zig.Directories.openUnresolved( |
| ... | @@ -573,7 +574,7 @@ pub fn main(init: process.Init.Minimal) !void { | ... | @@ -573,7 +574,7 @@ pub fn main(init: process.Init.Minimal) !void { |
| 573 | unresolved_path, | 574 | unresolved_path, |
| 574 | .@"local cache", | 575 | .@"local cache", |
| 575 | ) else .{ | 576 | ) else .{ |
| 576 | .path = try Dir.path.join(arena, &.{ build_root.directory.path orelse ".", default_local_zig_cache_basename }), | 577 | .path = try build_root.directory.join(arena, &.{default_local_zig_cache_basename}), |
| 577 | .handle = try build_root.directory.handle.createDirPathOpen(io, default_local_zig_cache_basename, .{}), | 578 | .handle = try build_root.directory.handle.createDirPathOpen(io, default_local_zig_cache_basename, .{}), |
| 578 | }; | 579 | }; |
| 579 | graph.cache = .{ | 580 | graph.cache = .{ |
| ... | @@ -3335,22 +3336,21 @@ inline fn debugMakerLeaks() bool { | ... | @@ -3335,22 +3336,21 @@ inline fn debugMakerLeaks() bool { |
| 3335 | | 3336 | |
| 3336 | const BuildRoot = struct { | 3337 | const BuildRoot = struct { |
| 3337 | directory: Cache.Directory, | 3338 | directory: Cache.Directory, |
| | 3339 | close_directory: bool, |
| 3338 | build_zig_basename: []const u8, | 3340 | build_zig_basename: []const u8, |
| 3339 | cleanup_build_dir: ?Io.Dir, | | |
| 3340 | | 3341 | |
| 3341 | fn deinit(br: *BuildRoot, io: Io) void { | 3342 | fn deinit(br: *BuildRoot, io: Io) void { |
| 3342 | if (br.cleanup_build_dir) |*dir| dir.close(io); | 3343 | if (br.close_directory) br.directory.handle.close(io); |
| 3343 | br.* = undefined; | 3344 | br.* = undefined; |
| 3344 | } | 3345 | } |
| 3345 | }; | 3346 | }; |
| 3346 | | 3347 | |
| 3347 | const FindBuildRootOptions = struct { | 3348 | const FindBuildRootOptions = struct { |
| 3348 | build_file: ?[]const u8 = null, | 3349 | build_file: ?[]const u8 = null, |
| 3349 | cwd_path: ?[]const u8 = null, | 3350 | cwd_path: []const u8, |
| 3350 | }; | 3351 | }; |
| 3351 | | 3352 | |
| 3352 | fn findBuildRoot(arena: Allocator, io: Io, options: FindBuildRootOptions) !BuildRoot { | 3353 | fn findBuildRoot(arena: Allocator, io: Io, options: FindBuildRootOptions) !BuildRoot { |
| 3353 | const cwd_path = options.cwd_path orelse try std.zig.getResolvedCwd(io, arena); | | |
| 3354 | const build_zig_basename = if (options.build_file) |bf| | 3354 | const build_zig_basename = if (options.build_file) |bf| |
| 3355 | Dir.path.basename(bf) | 3355 | Dir.path.basename(bf) |
| 3356 | else | 3356 | else |
| ... | @@ -3364,35 +3364,41 @@ fn findBuildRoot(arena: Allocator, io: Io, options: FindBuildRootOptions) !Build | ... | @@ -3364,35 +3364,41 @@ fn findBuildRoot(arena: Allocator, io: Io, options: FindBuildRootOptions) !Build |
| 3364 | return .{ | 3364 | return .{ |
| 3365 | .build_zig_basename = build_zig_basename, | 3365 | .build_zig_basename = build_zig_basename, |
| 3366 | .directory = .{ .path = dirname, .handle = dir }, | 3366 | .directory = .{ .path = dirname, .handle = dir }, |
| 3367 | .cleanup_build_dir = dir, | 3367 | .close_directory = true, |
| 3368 | }; | 3368 | }; |
| 3369 | } | 3369 | } |
| 3370 | | 3370 | |
| 3371 | return .{ | 3371 | return .{ |
| 3372 | .build_zig_basename = build_zig_basename, | 3372 | .build_zig_basename = build_zig_basename, |
| 3373 | .directory = .{ .path = null, .handle = Io.Dir.cwd() }, | 3373 | .directory = .cwd(), |
| 3374 | .cleanup_build_dir = null, | 3374 | .close_directory = false, |
| 3375 | }; | 3375 | }; |
| 3376 | } | 3376 | } |
| 3377 | // Search up parent directories until we find build.zig. | 3377 | // Search up parent directories until we find build.zig. |
| 3378 | var dirname: []const u8 = cwd_path; | 3378 | var dirname: ?[]const u8 = null; |
| 3379 | while (true) { | 3379 | while (true) { |
| 3380 | const joined_path = try Dir.path.join(arena, &[_][]const u8{ dirname, build_zig_basename }); | 3380 | const joined_path = if (dirname) |d| |
| | 3381 | try Dir.path.join(arena, &.{ d, build_zig_basename }) |
| | 3382 | else |
| | 3383 | build_zig_basename; |
| 3381 | if (Io.Dir.cwd().access(io, joined_path, .{})) |_| { | 3384 | if (Io.Dir.cwd().access(io, joined_path, .{})) |_| { |
| 3382 | const dir = Io.Dir.cwd().openDir(io, dirname, .{}) catch |err| { | 3385 | const dir = if (dirname) |d| |
| 3383 | fatal("unable to open directory while searching for build.zig file, {q}: {t}", .{ dirname, err }); | 3386 | Io.Dir.cwd().openDir(io, d, .{}) catch |err| { |
| 3384 | }; | 3387 | fatal("unable to open directory while searching for build.zig file, {q}: {t}", .{ d, err }); |
| | 3388 | } |
| | 3389 | else |
| | 3390 | Io.Dir.cwd(); |
| 3385 | return .{ | 3391 | return .{ |
| 3386 | .build_zig_basename = build_zig_basename, | 3392 | .build_zig_basename = build_zig_basename, |
| 3387 | .directory = .{ | 3393 | .directory = .{ |
| 3388 | .path = dirname, | 3394 | .path = dirname, |
| 3389 | .handle = dir, | 3395 | .handle = dir, |
| 3390 | }, | 3396 | }, |
| 3391 | .cleanup_build_dir = dir, | 3397 | .close_directory = dirname != null, |
| 3392 | }; | 3398 | }; |
| 3393 | } else |err| switch (err) { | 3399 | } else |err| switch (err) { |
| 3394 | error.FileNotFound => { | 3400 | error.FileNotFound => { |
| 3395 | dirname = Dir.path.dirname(dirname) orelse { | 3401 | dirname = Dir.path.dirname(dirname orelse options.cwd_path) orelse { |
| 3396 | log.info("initialize {s} template file with \"zig init\"", .{std.zig.build_zig_basename}); | 3402 | log.info("initialize {s} template file with \"zig init\"", .{std.zig.build_zig_basename}); |
| 3397 | log.info("see \"zig --help\" for more options", .{}); | 3403 | log.info("see \"zig --help\" for more options", .{}); |
| 3398 | fatal("no build.zig file found, in the current directory or any parent directories", .{}); | 3404 | fatal("no build.zig file found, in the current directory or any parent directories", .{}); |