aboutsummaryrefslogtreecommitdiff
path: root/src/Compilation.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-11-19 13:48:32 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-11-22 20:57:56 -0700
commit21bd13626d66c36c327bb317bd09cad979d92327 (patch)
tree0339aef23b4655448e6a71cdfca1840f66c69092 /src/Compilation.zig
parent32ce2f91a92c23d46c6836a6dd68ae0f08bb04c5 (diff)
downloadzig-21bd13626d66c36c327bb317bd09cad979d92327.tar.gz
zig-21bd13626d66c36c327bb317bd09cad979d92327.zip
Cache: introduce prefixes to manifests
Before, cache manifest files would have absolute file paths. This is problematic for two reasons: * Absolute file paths are not portable. Some operating systems such as WASI have trouble with them. The files themselves are less portable; they cannot be migrated from one user's home directory to another's. And finally they can break due to file paths exceeding maximum path component size. * They would prevent some advanced use cases of Zig, where the lib dir has a different path in a different invocation but is ultimately the same Zig version and lib directory as before. This commit adds a new column that specifies the prefix directory for each file. 0 is an escape hatch and has the previous behavior. The other two prefixes introduced are zig lib directory, and the cache directory. This means files in zig-cache manifests can reference files local to these directories. In practice, this means it is possible to use a different file path for the zig lib directory in a subsequent run of zig and have it still take advantage of the global cache, provided that the files inside remain unchanged. closes #13050
Diffstat (limited to 'src/Compilation.zig')
-rw-r--r--src/Compilation.zig23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig
index 60064fefd1..2c94785618 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -1456,23 +1456,27 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
else => @as(u8, 3),
};
- // We put everything into the cache hash that *cannot be modified during an incremental update*.
- // For example, one cannot change the target between updates, but one can change source files,
- // so the target goes into the cache hash, but source files do not. This is so that we can
- // find the same binary and incrementally update it even if there are modified source files.
- // We do this even if outputting to the current directory because we need somewhere to store
- // incremental compilation metadata.
+ // We put everything into the cache hash that *cannot be modified
+ // during an incremental update*. For example, one cannot change the
+ // target between updates, but one can change source files, so the
+ // target goes into the cache hash, but source files do not. This is so
+ // that we can find the same binary and incrementally update it even if
+ // there are modified source files. We do this even if outputting to
+ // the current directory because we need somewhere to store incremental
+ // compilation metadata.
const cache = try arena.create(Cache);
cache.* = .{
.gpa = gpa,
.manifest_dir = try options.local_cache_directory.handle.makeOpenPath("h", .{}),
};
+ cache.addPrefix(.{ .path = null, .handle = fs.cwd() });
+ cache.addPrefix(options.zig_lib_directory);
+ cache.addPrefix(options.local_cache_directory);
errdefer cache.manifest_dir.close();
// This is shared hasher state common to zig source and all C source files.
cache.hash.addBytes(build_options.version);
cache.hash.add(builtin.zig_backend);
- cache.hash.addBytes(options.zig_lib_directory.path orelse ".");
cache.hash.add(options.optimize_mode);
cache.hash.add(options.target.cpu.arch);
cache.hash.addBytes(options.target.cpu.model.name);
@@ -2265,8 +2269,9 @@ pub fn update(comp: *Compilation) !void {
const is_hit = man.hit() catch |err| {
// TODO properly bubble these up instead of emitting a warning
const i = man.failed_file_index orelse return err;
- const file_path = man.files.items[i].path orelse return err;
- std.log.warn("{s}: {s}", .{ @errorName(err), file_path });
+ const pp = man.files.items[i].prefixed_path orelse return err;
+ const prefix = man.cache.prefixes()[pp.prefix].path orelse "";
+ std.log.warn("{s}: {s}{s}", .{ @errorName(err), prefix, pp.sub_path });
return err;
};
if (is_hit) {