authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-10 16:17:02-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-10 16:17:02-07:00
logf7d600675c548b4e45b24f8e10ebdd892a6b8dba
treebc2a7e0edb42edb304c5dc47f6206d1a78c245d6
parent26399b5249cbc8774e50856fed6d2336e396cb69

CLI: improved local cache directory logic

Previously, when choosing the local cache directory, if there was no root source file, an explicitly chosen path, or other clues, zig would choose cwd + zig-cache/ as the local cache directory. This can be problematic if Zig is invoked with the CWD set to a read-only directory, or a directory unrelated to the actual source files being compiled. In the real world, we see this when using `zig cc` with CGo, which for some reason changes the current working directory to the read-only go standard library path before running the C compiler. This commit conservatively chooses to use the global cache directory as the local cache directory when there is no other reasonable choice, and no longer will rely on the cwd path to choose a local cache directory. As a reminder, the --cache-dir CLI flag and ZIG_LOCAL_CACHE_DIR environment variable are available for overriding the decision. For the zig build system, it will always choose the directory that build.zig is + zig-cache/. Closes #7342

1 files changed, 12 insertions(+), 15 deletions(-)

src/main.zig+12-15
...@@ -1656,21 +1656,18 @@ fn buildOutputType(...@@ -1656,21 +1656,18 @@ fn buildOutputType(
1656 if (arg_mode == .run) {1656 if (arg_mode == .run) {
1657 break :l global_cache_directory;1657 break :l global_cache_directory;
1658 }1658 }
1659 const cache_dir_path = blk: {1659 if (root_pkg) |pkg| {
1660 if (root_pkg) |pkg| {1660 const cache_dir_path = try pkg.root_src_directory.join(arena, &[_][]const u8{"zig-cache"});
1661 if (pkg.root_src_directory.path) |p| {1661 const dir = try pkg.root_src_directory.handle.makeOpenPath("zig-cache", .{});
1662 break :blk try fs.path.join(arena, &[_][]const u8{ p, "zig-cache" });1662 cleanup_local_cache_dir = dir;
1663 }1663 break :l .{
1664 }1664 .handle = dir,
1665 break :blk "zig-cache";1665 .path = cache_dir_path,
1666 };1666 };
1667 const cache_parent_dir = if (root_pkg) |pkg| pkg.root_src_directory.handle else fs.cwd();1667 }
1668 const dir = try cache_parent_dir.makeOpenPath("zig-cache", .{});1668 // Otherwise we really don't have a reasonable place to put the local cache directory,
1669 cleanup_local_cache_dir = dir;1669 // so we utilize the global one.
1670 break :l .{1670 break :l global_cache_directory;
1671 .handle = dir,
1672 .path = cache_dir_path,
1673 };
1674 };1671 };
16751672
1676 if (build_options.have_llvm and emit_asm != .no) {1673 if (build_options.have_llvm and emit_asm != .no) {