authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-05-21 01:45:05+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-05-21 01:45:05+01:00
logfe855691f6f742a14678cb617422977c2a55be39
treef97c04ea5e57d3b85d6b61612c82f0ac89db8ca5
parenta63f7875f451bda975ddabcc0c1feed10a216516
signaturelock-open Commit is signed but in an unrecognized format.

std.Build.Step.Run: inherit build runner cwd

Right now, if you override the build root with `--build-root`, then `Run` steps can fail to execute because of incorrect path handling in the compiler: `std.process.Child` gets a cwd-relative path, but also has its cwd set to the build root. The latter behavior is really weird; it doesn't match my expectations, nor does it match how we spawn child `zig` processes. So, this commit makes the child process inherit the build runner's cwd, as `LazyPath.getPath2` *expects* it to. After investigating, this behavior dates all the way back to 2017; it was introduced in 4543413. So, there isn't any clear/documented reason for this; it should be safe to revert, since under the modern `LazyPath` system it is strictly a bug AFAICT.

1 files changed, 0 insertions(+), 3 deletions(-)

lib/std/Build/Step/Run.zig-3
...@@ -1334,9 +1334,6 @@ fn spawnChildAndCollect(...@@ -1334,9 +1334,6 @@ fn spawnChildAndCollect(
1334 var child = std.process.Child.init(argv, arena);1334 var child = std.process.Child.init(argv, arena);
1335 if (run.cwd) |lazy_cwd| {1335 if (run.cwd) |lazy_cwd| {
1336 child.cwd = lazy_cwd.getPath2(b, &run.step);1336 child.cwd = lazy_cwd.getPath2(b, &run.step);
1337 } else {
1338 child.cwd = b.build_root.path;
1339 child.cwd_dir = b.build_root.handle;
1340 }1337 }
1341 child.env_map = run.env_map orelse &b.graph.env_map;1338 child.env_map = run.env_map orelse &b.graph.env_map;
1342 child.request_resource_usage_statistics = true;1339 child.request_resource_usage_statistics = true;