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(
6464 }
6565 }
6666
67 for (conf_run.preopen_names.slice, conf_run.preopen_paths.slice) |name, path| {
68 man.hash.addBytesZ(name.slice(conf));
69 const cwd_path = try maker.resolveLazyPathIndex(arena, path, run_index);
67 for (conf_run.preopens.slice) |preopen| {
68 man.hash.addBytesZ(preopen.name.slice(conf));
69 const cwd_path = try maker.resolveLazyPathIndex(arena, preopen.path, run_index);
7070 man.hash.addBytes(try cwd_path.toString(arena));
7171 }
7272
......@@ -1917,14 +1917,14 @@ fn runCommand(
19171917 },
19181918 .wasmtime => |bin_name| {
19191919 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);
19211921 interp_argv.appendAssumeCapacity(bin_name);
19221922 interp_argv.appendAssumeCapacity("--dir=.");
1923 for (conf_run.preopen_names.slice, conf_run.preopen_paths.slice) |name, lazy_path| {
1924 const path = try maker.resolveLazyPath(arena, lazy_path.get(conf), run_index);
1923 for (conf_run.preopens.slice) |preopen| {
1924 const path = try maker.resolveLazyPath(arena, preopen.path.get(conf), run_index);
19251925 path.root_dir.handle.createDirPath(io, path.subPathOrDot()) catch |e|
19261926 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) }));
19281928 }
19291929 // Wasmtime doeesn't inherit environment variables from the parent process
19301930 // 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 {
569569 flags2: Flags2,
570570 args: Storage.LengthPrefixedList(Arg.Index),
571571 cwd: Storage.FlagOptional(.flags, .cwd, LazyPath.Index),
572 preopen_names: Storage.LengthPrefixedList(String),
573 preopen_paths: Storage.LengthPrefixedList(LazyPath.Index),
572 preopens: Storage.FlagLengthPrefixedList(.flags, .preopens, Preopen),
574573 captured_stdout: Storage.FlagOptional(.flags, .captured_stdout, CapturedStream),
575574 captured_stderr: Storage.FlagOptional(.flags, .captured_stderr, CapturedStream),
576575 file_inputs: Storage.LengthPrefixedList(LazyPath.Index),
......@@ -646,6 +645,11 @@ pub const Step = extern struct {
646645 manual,
647646 };
648647
648 pub const Preopen = extern struct {
649 name: String,
650 path: LazyPath.Index,
651 };
652
649653 pub const StdIn = union(@This().Tag) {
650654 none: void,
651655 bytes: Bytes,
......@@ -676,7 +680,8 @@ pub const Step = extern struct {
676680 captured_stdout: bool,
677681 captured_stderr: bool,
678682 environ_map: bool,
679 _: u4 = 0,
683 preopens: bool,
684 _: u3 = 0,
680685 };
681686
682687 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
454454 },
455455 else => {},
456456 }
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
458465 break :e try wc.addExtraErased(Configuration.Step.Run, .{
459466 .flags = .{
......@@ -482,6 +489,7 @@ pub fn write(b: *std.Build, wc: *Configuration.Wip, writer: *std.Io.Writer) !voi
482489 .captured_stdout = run.captured_stdout != null,
483490 .captured_stderr = run.captured_stderr != null,
484491 .environ_map = run.environ_map != null,
492 .preopens = run.preopens.count() > 0,
485493 },
486494 .flags2 = .{
487495 .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
496504 .file_inputs = .{ .slice = try s.initLazyPathList(run.file_inputs.items) },
497505 .args = .{ .slice = try s.initArgsList(run.argv.items) },
498506 .cwd = .{ .value = try s.addOptionalLazyPath(run.cwd) },
499 .preopen_names = .{ .slice = try s.initStringList(run.preopens.keys()) },
500 .preopen_paths = .{ .slice = try s.initLazyPathList(run.preopens.values()) },
507 .preopens = .{ .slice = preopens },
501508 .captured_stdout = .{ .value = if (run.captured_stdout) |cs| .{
502509 .basename = try wc.addString(cs.basename),
503510 .generated_file = cs.generated_file,
lib/std/Build/Step/Run.zig+3-2
......@@ -28,7 +28,7 @@ environ_map: ?*EnvMap,
2828
2929/// Named files that will be provided to the parent process.
3030/// See `std.process.Preopens`.
31preopens: std.array_hash_map.String(Build.LazyPath),
31preopens: std.array_hash_map.Auto(Configuration.String, Build.LazyPath),
3232
3333/// Controls the `NO_COLOR` and `CLICOLOR_FORCE` environment variables.
3434color: Color = .auto,
......@@ -624,11 +624,12 @@ pub fn removeEnvironmentVariable(run: *Run, key: []const u8) void {
624624
625625pub fn setPreopen(run: *Run, name: []const u8, resource: Build.LazyPath) void {
626626 const graph = run.step.owner.graph;
627 const wc = &graph.wip_configuration;
627628 const arena = graph.arena;
628629 resource.addStepDependencies(&run.step);
629630 run.preopens.put(
630631 arena,
631 graph.dupeString(name),
632 wc.addString(name) catch @panic("OOM"),
632633 resource.dupe(graph),
633634 ) catch @panic("OOM");
634635}