diff --git a/lib/std/special/test_runner.zig b/lib/std/special/test_runner.zig index 4bb9202858..e8996e3ef1 100644 --- a/lib/std/special/test_runner.zig +++ b/lib/std/special/test_runner.zig @@ -11,7 +11,15 @@ pub const io_mode: io.Mode = builtin.test_io_mode; var log_err_count: usize = 0; +var args_buffer: [std.fs.MAX_PATH_BYTES + std.mem.page_size]u8 = undefined; +var args_allocator = std.heap.FixedBufferAllocator.init(&args_buffer); + pub fn main() anyerror!void { + const args = std.process.argsAlloc(&args_allocator.allocator) catch { + @panic("Too many bytes passed over the CLI to the test runner"); + }; + std.testing.zig_exe_path = args[1]; + const test_fn_list = builtin.test_functions; var ok_count: usize = 0; var skip_count: usize = 0; diff --git a/lib/std/testing.zig b/lib/std/testing.zig index 8e17c4e9f8..9b7010a08e 100644 --- a/lib/std/testing.zig +++ b/lib/std/testing.zig @@ -21,6 +21,10 @@ pub var base_allocator_instance = std.heap.FixedBufferAllocator.init(""); /// TODO https://github.com/ziglang/zig/issues/5738 pub var log_level = std.log.Level.warn; +/// This is available to any test that wants to execute Zig in a child process. +/// It will be the same executable that is running `zig test`. +pub var zig_exe_path: []const u8 = undefined; + /// This function is intended to be used only in tests. It prints diagnostics to stderr /// and then aborts when actual_error_union is not expected_error. pub fn expectError(expected_error: anyerror, actual_error_union: anytype) void { diff --git a/src/main.zig b/src/main.zig index 15bb3be602..6c32529a5e 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1828,7 +1828,9 @@ fn buildOutputType( else => unreachable, } } - try argv.append(exe_path); + try argv.appendSlice(&[_][]const u8{ + exe_path, self_exe_path, + }); } else { for (test_exec_args.items) |arg| { try argv.append(arg orelse exe_path);