authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-08-17 18:56:27-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-08-17 18:56:27-07:00
log4462c60639807502eca8a2db2bcf6adafea496ef
treeb3af84ac22492e4b426068e3252a58f160fd93c4
parenta916f63940ed0cf039ab5f70fbee022f604995ea

stage2: implement compiler id hash and add it to `zig env`


2 files changed, 56 insertions(+), 3 deletions(-)

src-self-hosted/introspect.zig+49-3
...@@ -3,8 +3,7 @@...@@ -3,8 +3,7 @@
3const std = @import("std");3const std = @import("std");
4const mem = std.mem;4const mem = std.mem;
5const fs = std.fs;5const fs = std.fs;
66const CacheHash = std.cache_hash.CacheHash;
7const warn = std.debug.warn;
87
9/// Caller must free result8/// Caller must free result
10pub fn testZigInstallPrefix(allocator: *mem.Allocator, test_path: []const u8) ![]u8 {9pub fn testZigInstallPrefix(allocator: *mem.Allocator, test_path: []const u8) ![]u8 {
...@@ -63,7 +62,7 @@ pub fn findZigLibDir(allocator: *mem.Allocator) ![]u8 {...@@ -63,7 +62,7 @@ pub fn findZigLibDir(allocator: *mem.Allocator) ![]u8 {
6362
64pub fn resolveZigLibDir(allocator: *mem.Allocator) ![]u8 {63pub fn resolveZigLibDir(allocator: *mem.Allocator) ![]u8 {
65 return findZigLibDir(allocator) catch |err| {64 return findZigLibDir(allocator) catch |err| {
66 warn(65 std.debug.print(
67 \\Unable to find zig lib directory: {}.66 \\Unable to find zig lib directory: {}.
68 \\Reinstall Zig or use --zig-install-prefix.67 \\Reinstall Zig or use --zig-install-prefix.
69 \\68 \\
...@@ -87,3 +86,50 @@ pub fn resolveGlobalCacheDir(allocator: *mem.Allocator) ![]u8 {...@@ -87,3 +86,50 @@ pub fn resolveGlobalCacheDir(allocator: *mem.Allocator) ![]u8 {
8786
88 return fs.getAppDataDir(allocator, appname);87 return fs.getAppDataDir(allocator, appname);
89}88}
89
90var compiler_id_mutex = std.Mutex{};
91var compiler_id: [16]u8 = undefined;
92var compiler_id_computed = false;
93
94pub fn resolveCompilerId(gpa: *mem.Allocator) ![16]u8 {
95 const held = compiler_id_mutex.acquire();
96 defer held.release();
97
98 if (compiler_id_computed)
99 return compiler_id;
100 compiler_id_computed = true;
101
102 const global_cache_dir = try resolveGlobalCacheDir(gpa);
103 defer gpa.free(global_cache_dir);
104
105 // TODO Introduce openGlobalCacheDir which returns a dir handle rather than a string.
106 var cache_dir = try fs.cwd().openDir(global_cache_dir, .{});
107 defer cache_dir.close();
108
109 var ch = try CacheHash.init(gpa, cache_dir, "exe");
110 defer ch.release();
111
112 const self_exe_path = try fs.selfExePathAlloc(gpa);
113 defer gpa.free(self_exe_path);
114
115 _ = try ch.addFile(self_exe_path, null);
116
117 if (try ch.hit()) |digest| {
118 compiler_id = digest[0..16].*;
119 return compiler_id;
120 }
121
122 const libs = try std.process.getSelfExeSharedLibPaths(gpa);
123 defer {
124 for (libs) |lib| gpa.free(lib);
125 gpa.free(libs);
126 }
127
128 for (libs) |lib| {
129 try ch.addFilePost(lib);
130 }
131
132 const digest = ch.final();
133 compiler_id = digest[0..16].*;
134 return compiler_id;
135}
src-self-hosted/print_env.zig+7
...@@ -16,6 +16,10 @@ pub fn cmdEnv(gpa: *Allocator, args: []const []const u8, stdout: anytype) !void...@@ -16,6 +16,10 @@ pub fn cmdEnv(gpa: *Allocator, args: []const []const u8, stdout: anytype) !void
16 const global_cache_dir = try introspect.resolveGlobalCacheDir(gpa);16 const global_cache_dir = try introspect.resolveGlobalCacheDir(gpa);
17 defer gpa.free(global_cache_dir);17 defer gpa.free(global_cache_dir);
1818
19 const compiler_id_digest = try introspect.resolveCompilerId(gpa);
20 var compiler_id_buf: [compiler_id_digest.len * 2]u8 = undefined;
21 const compiler_id = std.fmt.bufPrint(&compiler_id_buf, "{x}", .{compiler_id_digest}) catch unreachable;
22
19 var bos = std.io.bufferedOutStream(stdout);23 var bos = std.io.bufferedOutStream(stdout);
20 const bos_stream = bos.outStream();24 const bos_stream = bos.outStream();
2125
...@@ -28,6 +32,9 @@ pub fn cmdEnv(gpa: *Allocator, args: []const []const u8, stdout: anytype) !void...@@ -28,6 +32,9 @@ pub fn cmdEnv(gpa: *Allocator, args: []const []const u8, stdout: anytype) !void
28 try jws.objectField("std_dir");32 try jws.objectField("std_dir");
29 try jws.emitString(zig_std_dir);33 try jws.emitString(zig_std_dir);
3034
35 try jws.objectField("id");
36 try jws.emitString(compiler_id);
37
31 try jws.objectField("global_cache_dir");38 try jws.objectField("global_cache_dir");
32 try jws.emitString(global_cache_dir);39 try jws.emitString(global_cache_dir);
3340