diff --git a/lib/std/Build/Step/Run.zig b/lib/std/Build/Step/Run.zig index 69d6b393fd..a03f794cd0 100644 --- a/lib/std/Build/Step/Run.zig +++ b/lib/std/Build/Step/Run.zig @@ -126,7 +126,7 @@ pub const StdIo = union(enum) { }; pub const Arg = union(enum) { - artifact: *Step.Compile, + artifact: PrefixedArtifact, lazy_path: PrefixedLazyPath, directory_source: PrefixedLazyPath, bytes: []u8, @@ -134,6 +134,11 @@ pub const Arg = union(enum) { output_directory: *Output, }; +pub const PrefixedArtifact = struct { + prefix: []const u8, + artifact: *Step.Compile, +}; + pub const PrefixedLazyPath = struct { prefix: []const u8, lazy_path: std.Build.LazyPath, @@ -185,10 +190,20 @@ pub fn enableTestRunnerMode(run: *Run) void { } pub fn addArtifactArg(run: *Run, artifact: *Step.Compile) void { + run.addPrefixedArtifactArg("", artifact); +} + +pub fn addPrefixedArtifactArg(run: *Run, prefix: []const u8, artifact: *Step.Compile) void { const b = run.step.owner; + + const prefixed_artifact: PrefixedArtifact = .{ + .prefix = b.dupe(prefix), + .artifact = artifact, + }; + run.argv.append(b.allocator, .{ .artifact = prefixed_artifact }) catch @panic("OOM"); + const bin_file = artifact.getEmittedBin(); bin_file.addStepDependencies(&run.step); - run.argv.append(b.allocator, Arg{ .artifact = artifact }) catch @panic("OOM"); } /// Provides a file path as a command line argument to the command being run. @@ -610,14 +625,16 @@ fn make(step: *Step, prog_node: std.Progress.Node) !void { man.hash.addBytes(file.prefix); man.hash.addBytes(file_path); }, - .artifact => |artifact| { + .artifact => |pa| { + const artifact = pa.artifact; + if (artifact.rootModuleTarget().os.tag == .windows) { // On Windows we don't have rpaths so we have to add .dll search paths to PATH run.addPathForDynLibs(artifact); } const file_path = artifact.installed_path orelse artifact.generated_bin.?.path.?; // the path is guaranteed to be set - try argv_list.append(file_path); + try argv_list.append(b.fmt("{s}{s}", .{ pa.prefix, file_path })); _ = try man.addFile(file_path, null); }, @@ -912,7 +929,7 @@ fn runCommand( // work even for the edge case that the binary was produced by a // third party. const exe = switch (run.argv.items[0]) { - .artifact => |exe| exe, + .artifact => |exe| exe.artifact, else => break :interpret, }; switch (exe.kind) {