authorgravatar for techatrix@mailbox.orgTechatrix <techatrix@mailbox.org> 2026-06-14 03:44:09+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-06-24 21:10:43+02:00
log5f78220dbe17133ece22e4f6a7e5e6337bfd7800
tree26fd55c84f2cdec2a3058b18e73a128e3a73b6cc
parentd95dcb2a6238787e18c60f4ae4bfcf8fd757bd0c

std.Build.Step.Run: add support specifying preopens


4 files changed, 33 insertions(+), 1 deletions(-)

lib/compiler/Maker/Step/Run.zig+13-1
...@@ -65,6 +65,12 @@ pub fn make(...@@ -65,6 +65,12 @@ pub fn make(
65 }65 }
66 }66 }
6767
68 for (conf_run.preopen_names.slice, conf_run.preopen_paths.slice) |name, path| {
69 man.hash.addBytesZ(name.slice(conf));
70 const cwd_path = try maker.resolveLazyPathIndex(arena, path, run_index);
71 man.hash.addBytes(try cwd_path.toString(arena));
72 }
73
68 man.hash.add(graph.fuzzing);74 man.hash.add(graph.fuzzing);
69 man.hash.add(conf_run.flags.color);75 man.hash.add(conf_run.flags.color);
70 man.hash.add(conf_run.flags.disable_zig_progress);76 man.hash.add(conf_run.flags.disable_zig_progress);
...@@ -1912,9 +1918,15 @@ fn runCommand(...@@ -1912,9 +1918,15 @@ fn runCommand(
1912 },1918 },
1913 .wasmtime => |bin_name| {1919 .wasmtime => |bin_name| {
1914 if (graph.enable_wasmtime) {1920 if (graph.enable_wasmtime) {
1915 try interp_argv.ensureUnusedCapacity(arena, 3 + argv.len);1921 try interp_argv.ensureUnusedCapacity(arena, 3 + argv.len + conf_run.preopen_names.slice.len);
1916 interp_argv.appendAssumeCapacity(bin_name);1922 interp_argv.appendAssumeCapacity(bin_name);
1917 interp_argv.appendAssumeCapacity("--dir=.");1923 interp_argv.appendAssumeCapacity("--dir=.");
1924 for (conf_run.preopen_names.slice, conf_run.preopen_paths.slice) |name, lazy_path| {
1925 const path = try maker.resolveLazyPath(arena, lazy_path.get(conf), run_index);
1926 path.root_dir.handle.createDirPath(io, path.subPathOrDot()) catch |e|
1927 return step.fail(maker, "failed creating directory {f}: {t}", .{ path, e });
1928 interp_argv.appendAssumeCapacity(try allocPrint(arena, "--dir={f}::{s}", .{ path, name.slice(conf) }));
1929 }
1918 // Wasmtime doeesn't inherit environment variables from the parent process1930 // Wasmtime doeesn't inherit environment variables from the parent process
1919 // by default. '-S inherit-env' was added in Wasmtime version 20.1931 // by default. '-S inherit-env' was added in Wasmtime version 20.
1920 interp_argv.appendAssumeCapacity("-Sinherit-env");1932 interp_argv.appendAssumeCapacity("-Sinherit-env");
lib/compiler/configurer.zig+2
...@@ -1070,6 +1070,8 @@ fn serialize(b: *std.Build, wc: *Configuration.Wip, writer: *Io.Writer) !void {...@@ -1070,6 +1070,8 @@ fn serialize(b: *std.Build, wc: *Configuration.Wip, writer: *Io.Writer) !void {
1070 .file_inputs = .{ .slice = try s.initLazyPathList(run.file_inputs.items) },1070 .file_inputs = .{ .slice = try s.initLazyPathList(run.file_inputs.items) },
1071 .args = .{ .slice = try s.initArgsList(run.argv.items) },1071 .args = .{ .slice = try s.initArgsList(run.argv.items) },
1072 .cwd = .{ .value = try s.addOptionalLazyPath(run.cwd) },1072 .cwd = .{ .value = try s.addOptionalLazyPath(run.cwd) },
1073 .preopen_names = .{ .slice = try s.initStringList(run.preopens.keys()) },
1074 .preopen_paths = .{ .slice = try s.initLazyPathList(run.preopens.values()) },
1073 .captured_stdout = .{ .value = if (run.captured_stdout) |cs| .{1075 .captured_stdout = .{ .value = if (run.captured_stdout) |cs| .{
1074 .basename = try wc.addString(cs.basename),1076 .basename = try wc.addString(cs.basename),
1075 .generated_file = cs.generated_file,1077 .generated_file = cs.generated_file,
lib/std/Build/Configuration.zig+2
...@@ -571,6 +571,8 @@ pub const Step = extern struct {...@@ -571,6 +571,8 @@ pub const Step = extern struct {
571 flags2: Flags2,571 flags2: Flags2,
572 args: Storage.LengthPrefixedList(Arg.Index),572 args: Storage.LengthPrefixedList(Arg.Index),
573 cwd: Storage.FlagOptional(.flags, .cwd, LazyPath.Index),573 cwd: Storage.FlagOptional(.flags, .cwd, LazyPath.Index),
574 preopen_names: Storage.LengthPrefixedList(String),
575 preopen_paths: Storage.LengthPrefixedList(LazyPath.Index),
574 captured_stdout: Storage.FlagOptional(.flags, .captured_stdout, CapturedStream),576 captured_stdout: Storage.FlagOptional(.flags, .captured_stdout, CapturedStream),
575 captured_stderr: Storage.FlagOptional(.flags, .captured_stderr, CapturedStream),577 captured_stderr: Storage.FlagOptional(.flags, .captured_stderr, CapturedStream),
576 file_inputs: Storage.LengthPrefixedList(LazyPath.Index),578 file_inputs: Storage.LengthPrefixedList(LazyPath.Index),
lib/std/Build/Step/Run.zig+16
...@@ -26,6 +26,10 @@ cwd: ?Build.LazyPath,...@@ -26,6 +26,10 @@ cwd: ?Build.LazyPath,
26/// Override this field to modify the environment, or use setEnvironmentVariable26/// Override this field to modify the environment, or use setEnvironmentVariable
27environ_map: ?*EnvMap,27environ_map: ?*EnvMap,
2828
29/// Named files that will be provided to the parent process.
30/// See `std.process.Preopens`.
31preopens: std.array_hash_map.String(Build.LazyPath),
32
29/// Controls the `NO_COLOR` and `CLICOLOR_FORCE` environment variables.33/// Controls the `NO_COLOR` and `CLICOLOR_FORCE` environment variables.
30color: Color = .auto,34color: Color = .auto,
3135
...@@ -200,6 +204,7 @@ pub fn create(owner: *std.Build, name: []const u8) *Run {...@@ -200,6 +204,7 @@ pub fn create(owner: *std.Build, name: []const u8) *Run {
200 .argv = .empty,204 .argv = .empty,
201 .cwd = null,205 .cwd = null,
202 .environ_map = null,206 .environ_map = null,
207 .preopens = .empty,
203 .disable_zig_progress = false,208 .disable_zig_progress = false,
204 .stdio = .infer_from_args,209 .stdio = .infer_from_args,
205 .stdin = .none,210 .stdin = .none,
...@@ -615,6 +620,17 @@ pub fn removeEnvironmentVariable(run: *Run, key: []const u8) void {...@@ -615,6 +620,17 @@ pub fn removeEnvironmentVariable(run: *Run, key: []const u8) void {
615 _ = run.getEnvMap().swapRemove(key);620 _ = run.getEnvMap().swapRemove(key);
616}621}
617622
623pub fn setPreopen(run: *Run, name: []const u8, resource: Build.LazyPath) void {
624 const graph = run.step.owner.graph;
625 const arena = graph.arena;
626 resource.addStepDependencies(&run.step);
627 run.preopens.put(
628 arena,
629 graph.dupeString(name),
630 resource.dupe(graph),
631 ) catch @panic("OOM");
632}
633
618/// Adds a check for exact stderr match. Does not add any other checks.634/// Adds a check for exact stderr match. Does not add any other checks.
619pub fn expectStdErrEqual(run: *Run, bytes: []const u8) void {635pub fn expectStdErrEqual(run: *Run, bytes: []const u8) void {
620 const graph = run.step.owner.graph;636 const graph = run.step.owner.graph;