From acdb5679ba51c2e55798dee39999932443a9af3b Mon Sep 17 00:00:00 2001 From: dweiller <4678790+dweiller@users.noreply.github.com> Date: Tue, 30 Jul 2024 18:41:22 +1000 Subject: [PATCH] zig build: add env_map entries to hash for Step.Run This change fixes false-positive cache hits for run steps that get run with different sets of environment variables due the the environment map being excluded from the cache hash. --- lib/std/Build/Step/Run.zig | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/lib/std/Build/Step/Run.zig b/lib/std/Build/Step/Run.zig index c35ba00b79aa..17451037cad5 100644 --- a/lib/std/Build/Step/Run.zig +++ b/lib/std/Build/Step/Run.zig @@ -630,6 +630,35 @@ fn make(step: *Step, options: Step.MakeOptions) !void { var man = b.graph.cache.obtain(); defer man.deinit(); + if (run.env_map) |env_map| { + const KV = struct { []const u8, []const u8 }; + var kv_pairs = try std.ArrayList(KV).initCapacity(arena, env_map.count()); + var iter = env_map.iterator(); + while (iter.next()) |entry| { + kv_pairs.appendAssumeCapacity(.{ entry.key_ptr.*, entry.value_ptr.* }); + } + + std.mem.sortUnstable(KV, kv_pairs.items, {}, struct { + fn lessThan(_: void, kv1: KV, kv2: KV) bool { + const k1 = kv1[0]; + const k2 = kv2[0]; + + if (k1.len != k2.len) return k1.len < k2.len; + + for (k1, k2) |c1, c2| { + if (c1 == c2) continue; + return c1 < c2; + } + unreachable; // two keys cannot be equal + } + }.lessThan); + + for (kv_pairs.items) |kv| { + man.hash.addBytes(kv[0]); + man.hash.addBytes(kv[1]); + } + } + for (run.argv.items) |arg| { switch (arg) { .bytes => |bytes| {