diff --git a/lib/std/Build/Step/Run.zig b/lib/std/Build/Step/Run.zig index 3d81873308..edb7cbeca4 100644 --- a/lib/std/Build/Step/Run.zig +++ b/lib/std/Build/Step/Run.zig @@ -112,12 +112,17 @@ pub const StdIo = union(enum) { pub const Arg = union(enum) { artifact: *Step.Compile, - file_source: std.Build.FileSource, - directory_source: std.Build.FileSource, + file_source: PrefixedFileSource, + directory_source: PrefixedFileSource, bytes: []u8, output: *Output, }; +pub const PrefixedFileSource = struct { + prefix: []const u8, + file_source: std.Build.FileSource, +}; + pub const Output = struct { generated_file: std.Build.GeneratedFile, prefix: []const u8, @@ -145,9 +150,9 @@ pub fn setName(self: *Run, name: []const u8) void { self.rename_step_with_output_arg = false; } -pub fn enableTestRunnerMode(rs: *Run) void { - rs.stdio = .zig_test; - rs.addArgs(&.{"--listen=-"}); +pub fn enableTestRunnerMode(self: *Run) void { + self.stdio = .zig_test; + self.addArgs(&.{"--listen=-"}); } pub fn addArtifactArg(self: *Run, artifact: *Step.Compile) void { @@ -158,43 +163,59 @@ pub fn addArtifactArg(self: *Run, artifact: *Step.Compile) void { /// This provides file path as a command line argument to the command being /// run, and returns a FileSource which can be used as inputs to other APIs /// throughout the build system. -pub fn addOutputFileArg(rs: *Run, basename: []const u8) std.Build.FileSource { - return addPrefixedOutputFileArg(rs, "", basename); +pub fn addOutputFileArg(self: *Run, basename: []const u8) std.Build.FileSource { + return self.addPrefixedOutputFileArg("", basename); } pub fn addPrefixedOutputFileArg( - rs: *Run, + self: *Run, prefix: []const u8, basename: []const u8, ) std.Build.FileSource { - const b = rs.step.owner; + const b = self.step.owner; const output = b.allocator.create(Output) catch @panic("OOM"); output.* = .{ .prefix = prefix, .basename = basename, - .generated_file = .{ .step = &rs.step }, + .generated_file = .{ .step = &self.step }, }; - rs.argv.append(.{ .output = output }) catch @panic("OOM"); + self.argv.append(.{ .output = output }) catch @panic("OOM"); - if (rs.rename_step_with_output_arg) { - rs.setName(b.fmt("{s} ({s})", .{ rs.step.name, basename })); + if (self.rename_step_with_output_arg) { + self.setName(b.fmt("{s} ({s})", .{ self.step.name, basename })); } return .{ .generated = &output.generated_file }; } pub fn addFileSourceArg(self: *Run, file_source: std.Build.FileSource) void { - self.argv.append(.{ - .file_source = file_source.dupe(self.step.owner), - }) catch @panic("OOM"); + self.addPrefixedFileSourceArg("", file_source); +} + +pub fn addPrefixedFileSourceArg(self: *Run, prefix: []const u8, file_source: std.Build.FileSource) void { + const b = self.step.owner; + + const prefixed_file_source: PrefixedFileSource = .{ + .prefix = b.dupe(prefix), + .file_source = file_source.dupe(b), + }; + self.argv.append(.{ .file_source = prefixed_file_source }) catch @panic("OOM"); file_source.addStepDependencies(&self.step); } pub fn addDirectorySourceArg(self: *Run, directory_source: std.Build.FileSource) void { - self.argv.append(.{ - .directory_source = directory_source.dupe(self.step.owner), - }) catch @panic("OOM"); + self.addPrefixedDirectorySourceArg("", directory_source); +} + +pub fn addPrefixedDirectorySourceArg(self: *Run, prefix: []const u8, directory_source: std.Build.FileSource) void { + const b = self.step.owner; + + const prefixed_directory_source: PrefixedFileSource = .{ + .prefix = b.dupe(prefix), + .file_source = directory_source.dupe(b), + }; + self.argv.append(.{ .directory_source = prefixed_directory_source }) catch @panic("OOM"); directory_source.addStepDependencies(&self.step); } @@ -395,13 +416,15 @@ fn make(step: *Step, prog_node: *std.Progress.Node) !void { man.hash.addBytes(bytes); }, .file_source => |file| { - const file_path = file.getPath(b); - try argv_list.append(file_path); + const file_path = file.file_source.getPath(b); + try argv_list.append(b.fmt("{s}{s}", .{ file.prefix, file_path })); + man.hash.addBytes(file.prefix); _ = try man.addFile(file_path, null); }, .directory_source => |file| { - const file_path = file.getPath(b); - try argv_list.append(file_path); + const file_path = file.file_source.getPath(b); + try argv_list.append(b.fmt("{s}{s}", .{ file.prefix, file_path })); + man.hash.addBytes(file.prefix); man.hash.addBytes(file_path); }, .artifact => |artifact| {