aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Build/Cache.zig
diff options
context:
space:
mode:
authorBen Crist <github@magicmoremagic.com>2024-06-06 13:40:10 -0500
committerGitHub <noreply@github.com>2024-06-06 18:40:10 +0000
commita9e9c9965daa8a6d26fd1d4baf4f31f558b0d5fa (patch)
tree4f8972c047e97a092004c25ce9f6ed05b473156b /lib/std/Build/Cache.zig
parent63754916c598a3be41171abb708dc6434f93c63e (diff)
downloadzig-a9e9c9965daa8a6d26fd1d4baf4f31f558b0d5fa.tar.gz
zig-a9e9c9965daa8a6d26fd1d4baf4f31f558b0d5fa.zip
Build system: Support Windows depfiles with unquoted, backslash escaped spaces (#20100)
Diffstat (limited to 'lib/std/Build/Cache.zig')
-rw-r--r--lib/std/Build/Cache.zig13
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/std/Build/Cache.zig b/lib/std/Build/Cache.zig
index 3efd7315ac..2977801cb5 100644
--- a/lib/std/Build/Cache.zig
+++ b/lib/std/Build/Cache.zig
@@ -860,14 +860,23 @@ pub const Manifest = struct {
var it: DepTokenizer = .{ .bytes = dep_file_contents };
- while (true) {
- switch (it.next() orelse return) {
+ while (it.next()) |token| {
+ switch (token) {
// We don't care about targets, we only want the prereqs
// Clang is invoked in single-source mode but other programs may not
.target, .target_must_resolve => {},
.prereq => |file_path| if (self.manifest_file == null) {
_ = try self.addFile(file_path, null);
} else try self.addFilePost(file_path),
+ .prereq_must_resolve => {
+ var resolve_buf = std.ArrayList(u8).init(self.cache.gpa);
+ defer resolve_buf.deinit();
+
+ try token.resolve(resolve_buf.writer());
+ if (self.manifest_file == null) {
+ _ = try self.addFile(resolve_buf.items, null);
+ } else try self.addFilePost(resolve_buf.items);
+ },
else => |err| {
try err.printError(error_buf.writer());
log.err("failed parsing {s}: {s}", .{ dep_file_basename, error_buf.items });