authorgravatar for sahnvour@pm.meSahnvour <sahnvour@pm.me> 2023-08-12 13:15:05+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-08-13 12:15:47-07:00
log2ceeade99a40c4c15798bc2878ae3318c5a3710f
tree964132c4d3861bd74cd62f8b52d66cbd718eae75
parent1c5c3f499a5144880feba9c24c51b0283a0e43c5

std.Build: add support for deps .d file in Step.Run


2 files changed, 35 insertions(+), 12 deletions(-)

lib/std/Build/Cache.zig+3-12
......@@ -778,20 +778,11 @@ pub const Manifest = struct {
778778
779779 var it: DepTokenizer = .{ .bytes = dep_file_contents };
780780
781 // Skip first token: target.
782 switch (it.next() orelse return) { // Empty dep file OK.
783 .target, .target_must_resolve, .prereq => {},
784 else => |err| {
785 try err.printError(error_buf.writer());
786 log.err("failed parsing {s}: {s}", .{ dep_file_basename, error_buf.items });
787 return error.InvalidDepFile;
788 },
789 }
790 // Process 0+ preqreqs.
791 // Clang is invoked in single-source mode so we never get more targets.
792781 while (true) {
793782 switch (it.next() orelse return) {
794 .target, .target_must_resolve => return,
783 // We don't care about targets, we only want the prereqs
784 // Clang is invoked in single-source mode but other programs may not
785 .target, .target_must_resolve => {},
795786 .prereq => |file_path| try self.addFilePost(file_path),
796787 else => |err| {
797788 try err.printError(error_buf.writer());
lib/std/Build/Step/Run.zig+32
......@@ -77,6 +77,8 @@ max_stdio_size: usize = 10 * 1024 * 1024,
7777captured_stdout: ?*Output = null,
7878captured_stderr: ?*Output = null,
7979
80dep_output_file: ?*Output = null,
81
8082has_side_effects: bool = false,
8183
8284pub const StdIn = union(enum) {
......@@ -240,6 +242,33 @@ pub fn addPrefixedDirectoryArg(self: *Run, prefix: []const u8, directory_source:
240242 directory_source.addStepDependencies(&self.step);
241243}
242244
245/// Add a path argument to a dep file (.d) for the child process to write its
246/// discovered additional dependencies.
247/// Only one dep file argument is allowed by instance.
248pub fn addDepFileOutputArg(self: *Run, basename: []const u8) std.Build.LazyPath {
249 return self.addPrefixedDepFileOutputArg("", basename);
250}
251
252/// Add a prefixed path argument to a dep file (.d) for the child process to
253/// write its discovered additional dependencies.
254/// Only one dep file argument is allowed by instance.
255pub fn addPrefixedDepFileOutputArg(self: *Run, prefix: []const u8, basename: []const u8) void {
256 assert(self.dep_output_file == null);
257
258 const b = self.step.owner;
259
260 const dep_file = b.allocator.create(Output) catch @panic("OOM");
261 dep_file.* = .{
262 .prefix = b.dupe(prefix),
263 .basename = b.dupe(basename),
264 .generated_file = .{ .step = &self.step },
265 };
266
267 self.dep_output_file = dep_file;
268
269 self.argv.append(.{ .output = dep_file }) catch @panic("OOM");
270}
271
243272pub fn addArg(self: *Run, arg: []const u8) void {
244273 self.argv.append(.{ .bytes = self.step.owner.dupe(arg) }) catch @panic("OOM");
245274}
......@@ -559,6 +588,9 @@ fn make(step: *Step, prog_node: *std.Progress.Node) !void {
559588
560589 try runCommand(self, argv_list.items, has_side_effects, &digest, prog_node);
561590
591 if (self.dep_output_file) |dep_output_file|
592 try man.addDepFilePost(std.fs.cwd(), dep_output_file.generated_file.getPath());
593
562594 try step.writeManifest(&man);
563595}
564596