diff --git a/build.zig b/build.zig index 2422a2a94c..3bb5474ce3 100644 --- a/build.zig +++ b/build.zig @@ -40,17 +40,12 @@ pub fn build(b: *Builder) !void { const docs_step = b.step("docs", "Build documentation"); docs_step.dependOn(&docgen_cmd.step); - var test_cases = b.addTest("src/test.zig"); + const test_cases = b.addTest("src/test.zig"); test_cases.stack_size = stack_size; test_cases.setBuildMode(mode); test_cases.addPackagePath("test_cases", "test/cases.zig"); test_cases.single_threaded = single_threaded; - const test_options = b.addOptions(); - test_options.addOption([]const u8, "zig_exe_path", b.zig_exe); - test_cases.addOptions("test_options", test_options); - test_cases.step.dependOn(&test_options.step); - const fmt_build_zig = b.addFmt(&[_][]const u8{"build.zig"}); const skip_debug = b.option(bool, "skip-debug", "Main test suite skips debug builds") orelse false; diff --git a/src/main.zig b/src/main.zig index a3b15c34af..4e24b3d789 100644 --- a/src/main.zig +++ b/src/main.zig @@ -3057,6 +3057,7 @@ fn buildOutputType( gpa, arena, test_exec_args.items, + self_exe_path, arg_mode, target_info, watch, @@ -3128,6 +3129,7 @@ fn buildOutputType( gpa, arena, test_exec_args.items, + self_exe_path, arg_mode, target_info, watch, @@ -3152,6 +3154,7 @@ fn buildOutputType( gpa, arena, test_exec_args.items, + self_exe_path, arg_mode, target_info, watch, @@ -3230,6 +3233,7 @@ fn runOrTest( gpa: Allocator, arena: Allocator, test_exec_args: []const ?[]const u8, + self_exe_path: []const u8, arg_mode: ArgMode, target_info: std.zig.system.NativeTargetInfo, watch: bool, @@ -3258,16 +3262,20 @@ fn runOrTest( if (runtime_args_start) |i| { try argv.appendSlice(all_args[i..]); } + var env_map = try std.process.getEnvMap(arena); + try env_map.put("ZIG_EXE", self_exe_path); + // We do not execve for tests because if the test fails we want to print // the error message and invocation below. if (std.process.can_execv and arg_mode == .run and !watch) { // execv releases the locks; no need to destroy the Compilation here. - const err = std.process.execv(gpa, argv.items); + const err = std.process.execve(gpa, argv.items, &env_map); try warnAboutForeignBinaries(arena, arg_mode, target_info, link_libc); const cmd = try std.mem.join(arena, " ", argv.items); fatal("the following command failed to execve with '{s}':\n{s}", .{ @errorName(err), cmd }); } else if (std.process.can_spawn) { var child = std.ChildProcess.init(argv.items, gpa); + child.env_map = &env_map; child.stdin_behavior = .Inherit; child.stdout_behavior = .Inherit; child.stderr_behavior = .Inherit; diff --git a/src/test.zig b/src/test.zig index 49f229d221..b95a66c11f 100644 --- a/src/test.zig +++ b/src/test.zig @@ -1214,6 +1214,7 @@ pub const TestContext = struct { fn run(self: *TestContext) !void { const host = try std.zig.system.NativeTargetInfo.detect(.{}); + const zig_exe_path = try std.process.getEnvVarOwned(self.arena, "ZIG_EXE"); var progress = std.Progress{}; const root_node = progress.start("compiler", self.cases.items.len); @@ -1272,6 +1273,7 @@ pub const TestContext = struct { &prg_node, case.*, zig_lib_directory, + zig_exe_path, &aux_thread_pool, global_cache_directory, host, @@ -1298,6 +1300,7 @@ pub const TestContext = struct { root_node: *std.Progress.Node, case: Case, zig_lib_directory: Compilation.Directory, + zig_exe_path: []const u8, thread_pool: *ThreadPool, global_cache_directory: Compilation.Directory, host: std.zig.system.NativeTargetInfo, @@ -1329,8 +1332,6 @@ pub const TestContext = struct { &[_][]const u8{ tmp_dir_path, "zig-cache" }, ); - const zig_exe_path = @import("test_options").zig_exe_path; - for (case.files.items) |file| { try tmp.dir.writeFile(file.path, file.src); }