authorgravatar for techatrix@mailbox.orgTechatrix <techatrix@mailbox.org> 2026-07-06 19:29:17+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-08-04 19:48:09+02:00
log988613be67133ce6f2de3ac8b3f2e63f610c4470
tree36d558617874cf08cdbb8d04a7669f95e37ccb16
parent2d100ec764cdf3a99f02c6273bd6aab2ca78f2f8

std.Build.Configuration: improve storage of preopens in run steps


4 files changed, 27 insertions(+), 14 deletions(-)

lib/compiler/Maker/Step/Run.zig+7-7
...@@ -64,9 +64,9 @@ pub fn make(...@@ -64,9 +64,9 @@ pub fn make(
64 }64 }
65 }65 }
6666
67 for (conf_run.preopen_names.slice, conf_run.preopen_paths.slice) |name, path| {67 for (conf_run.preopens.slice) |preopen| {
68 man.hash.addBytesZ(name.slice(conf));68 man.hash.addBytesZ(preopen.name.slice(conf));
69 const cwd_path = try maker.resolveLazyPathIndex(arena, path, run_index);69 const cwd_path = try maker.resolveLazyPathIndex(arena, preopen.path, run_index);
70 man.hash.addBytes(try cwd_path.toString(arena));70 man.hash.addBytes(try cwd_path.toString(arena));
71 }71 }
7272
...@@ -1917,14 +1917,14 @@ fn runCommand(...@@ -1917,14 +1917,14 @@ fn runCommand(
1917 },1917 },
1918 .wasmtime => |bin_name| {1918 .wasmtime => |bin_name| {
1919 if (graph.enable_wasmtime) {1919 if (graph.enable_wasmtime) {
1920 try interp_argv.ensureUnusedCapacity(arena, 3 + argv.len + conf_run.preopen_names.slice.len);1920 try interp_argv.ensureUnusedCapacity(arena, 3 + argv.len + conf_run.preopens.slice.len);
1921 interp_argv.appendAssumeCapacity(bin_name);1921 interp_argv.appendAssumeCapacity(bin_name);
1922 interp_argv.appendAssumeCapacity("--dir=.");1922 interp_argv.appendAssumeCapacity("--dir=.");
1923 for (conf_run.preopen_names.slice, conf_run.preopen_paths.slice) |name, lazy_path| {1923 for (conf_run.preopens.slice) |preopen| {
1924 const path = try maker.resolveLazyPath(arena, lazy_path.get(conf), run_index);1924 const path = try maker.resolveLazyPath(arena, preopen.path.get(conf), run_index);
1925 path.root_dir.handle.createDirPath(io, path.subPathOrDot()) catch |e|1925 path.root_dir.handle.createDirPath(io, path.subPathOrDot()) catch |e|
1926 return step.fail(maker, "failed creating directory {f}: {t}", .{ path, e });1926 return step.fail(maker, "failed creating directory {f}: {t}", .{ path, e });
1927 interp_argv.appendAssumeCapacity(try arena.print("--dir={f}::{s}", .{ path, name.slice(conf) }));1927 interp_argv.appendAssumeCapacity(try arena.print("--dir={f}::{s}", .{ path, preopen.name.slice(conf) }));
1928 }1928 }
1929 // Wasmtime doeesn't inherit environment variables from the parent process1929 // Wasmtime doeesn't inherit environment variables from the parent process
1930 // by default. '-S inherit-env' was added in Wasmtime version 20.1930 // by default. '-S inherit-env' was added in Wasmtime version 20.
lib/std/Build/Configuration.zig+8-3
...@@ -569,8 +569,7 @@ pub const Step = extern struct {...@@ -569,8 +569,7 @@ pub const Step = extern struct {
569 flags2: Flags2,569 flags2: Flags2,
570 args: Storage.LengthPrefixedList(Arg.Index),570 args: Storage.LengthPrefixedList(Arg.Index),
571 cwd: Storage.FlagOptional(.flags, .cwd, LazyPath.Index),571 cwd: Storage.FlagOptional(.flags, .cwd, LazyPath.Index),
572 preopen_names: Storage.LengthPrefixedList(String),572 preopens: Storage.FlagLengthPrefixedList(.flags, .preopens, Preopen),
573 preopen_paths: Storage.LengthPrefixedList(LazyPath.Index),
574 captured_stdout: Storage.FlagOptional(.flags, .captured_stdout, CapturedStream),573 captured_stdout: Storage.FlagOptional(.flags, .captured_stdout, CapturedStream),
575 captured_stderr: Storage.FlagOptional(.flags, .captured_stderr, CapturedStream),574 captured_stderr: Storage.FlagOptional(.flags, .captured_stderr, CapturedStream),
576 file_inputs: Storage.LengthPrefixedList(LazyPath.Index),575 file_inputs: Storage.LengthPrefixedList(LazyPath.Index),
...@@ -646,6 +645,11 @@ pub const Step = extern struct {...@@ -646,6 +645,11 @@ pub const Step = extern struct {
646 manual,645 manual,
647 };646 };
648647
648 pub const Preopen = extern struct {
649 name: String,
650 path: LazyPath.Index,
651 };
652
649 pub const StdIn = union(@This().Tag) {653 pub const StdIn = union(@This().Tag) {
650 none: void,654 none: void,
651 bytes: Bytes,655 bytes: Bytes,
...@@ -676,7 +680,8 @@ pub const Step = extern struct {...@@ -676,7 +680,8 @@ pub const Step = extern struct {
676 captured_stdout: bool,680 captured_stdout: bool,
677 captured_stderr: bool,681 captured_stderr: bool,
678 environ_map: bool,682 environ_map: bool,
679 _: u4 = 0,683 preopens: bool,
684 _: u3 = 0,
680 };685 };
681686
682 pub const Flags2 = packed struct(u32) {687 pub const Flags2 = packed struct(u32) {
lib/std/Build/Serialize.zig+9-2
...@@ -454,6 +454,13 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi...@@ -454,6 +454,13 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi
454 },454 },
455 else => {},455 else => {},
456 }456 }
457 const preopens = try arena.alloc(
458 Configuration.Step.Run.Preopen,
459 run.preopens.count(),
460 );
461 for (preopens, run.preopens.keys(), run.preopens.values()) |*dest, name, path| {
462 dest.* = .{ .name = name, .path = try s.addLazyPath(path) };
463 }
457464
458 break :e try wc.addExtraErased(Configuration.Step.Run, .{465 break :e try wc.addExtraErased(Configuration.Step.Run, .{
459 .flags = .{466 .flags = .{
...@@ -482,6 +489,7 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi...@@ -482,6 +489,7 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi
482 .captured_stdout = run.captured_stdout != null,489 .captured_stdout = run.captured_stdout != null,
483 .captured_stderr = run.captured_stderr != null,490 .captured_stderr = run.captured_stderr != null,
484 .environ_map = run.environ_map != null,491 .environ_map = run.environ_map != null,
492 .preopens = run.preopens.count() > 0,
485 },493 },
486 .flags2 = .{494 .flags2 = .{
487 .expect_stderr_exact = expect_stderr_exact != null,495 .expect_stderr_exact = expect_stderr_exact != null,
...@@ -496,8 +504,7 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi...@@ -496,8 +504,7 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi
496 .file_inputs = .{ .slice = try s.initLazyPathList(run.file_inputs.items) },504 .file_inputs = .{ .slice = try s.initLazyPathList(run.file_inputs.items) },
497 .args = .{ .slice = try s.initArgsList(run.argv.items) },505 .args = .{ .slice = try s.initArgsList(run.argv.items) },
498 .cwd = .{ .value = try s.addOptionalLazyPath(run.cwd) },506 .cwd = .{ .value = try s.addOptionalLazyPath(run.cwd) },
499 .preopen_names = .{ .slice = try s.initStringList(run.preopens.keys()) },507 .preopens = .{ .slice = preopens },
500 .preopen_paths = .{ .slice = try s.initLazyPathList(run.preopens.values()) },
501 .captured_stdout = .{ .value = if (run.captured_stdout) |cs| .{508 .captured_stdout = .{ .value = if (run.captured_stdout) |cs| .{
502 .basename = try wc.addString(cs.basename),509 .basename = try wc.addString(cs.basename),
503 .generated_file = cs.generated_file,510 .generated_file = cs.generated_file,
lib/std/Build/Step/Run.zig+3-2
...@@ -28,7 +28,7 @@ environ_map: ?*EnvMap,...@@ -28,7 +28,7 @@ environ_map: ?*EnvMap,
2828
29/// Named files that will be provided to the parent process.29/// Named files that will be provided to the parent process.
30/// See `std.process.Preopens`.30/// See `std.process.Preopens`.
31preopens: std.array_hash_map.String(Build.LazyPath),31preopens: std.array_hash_map.Auto(Configuration.String, Build.LazyPath),
3232
33/// Controls the `NO_COLOR` and `CLICOLOR_FORCE` environment variables.33/// Controls the `NO_COLOR` and `CLICOLOR_FORCE` environment variables.
34color: Color = .auto,34color: Color = .auto,
...@@ -624,11 +624,12 @@ pub fn removeEnvironmentVariable(run: *Run, key: []const u8) void {...@@ -624,11 +624,12 @@ pub fn removeEnvironmentVariable(run: *Run, key: []const u8) void {
624624
625pub fn setPreopen(run: *Run, name: []const u8, resource: Build.LazyPath) void {625pub fn setPreopen(run: *Run, name: []const u8, resource: Build.LazyPath) void {
626 const graph = run.step.owner.graph;626 const graph = run.step.owner.graph;
627 const wc = &graph.wip_configuration;
627 const arena = graph.arena;628 const arena = graph.arena;
628 resource.addStepDependencies(&run.step);629 resource.addStepDependencies(&run.step);
629 run.preopens.put(630 run.preopens.put(
630 arena,631 arena,
631 graph.dupeString(name),632 wc.addString(name) catch @panic("OOM"),
632 resource.dupe(graph),633 resource.dupe(graph),
633 ) catch @panic("OOM");634 ) catch @panic("OOM");
634}635}