| ... | @@ -27,6 +27,10 @@ pub fn main() !void { | ... | @@ -27,6 +27,10 @@ pub fn main() !void { |
| 27 | var debug_dwarf = false; | 27 | var debug_dwarf = false; |
| 28 | var debug_link = false; | 28 | var debug_link = false; |
| 29 | var preserve_tmp = false; | 29 | var preserve_tmp = false; |
| | 30 | var enable_qemu: bool = false; |
| | 31 | var enable_wine: bool = false; |
| | 32 | var enable_wasmtime: bool = false; |
| | 33 | var enable_darling: bool = false; |
| 30 | | 34 | |
| 31 | var arg_it = try std.process.argsWithAllocator(arena); | 35 | var arg_it = try std.process.argsWithAllocator(arena); |
| 32 | _ = arg_it.skip(); | 36 | _ = arg_it.skip(); |
| ... | @@ -42,6 +46,14 @@ pub fn main() !void { | ... | @@ -42,6 +46,14 @@ pub fn main() !void { |
| 42 | debug_link = true; | 46 | debug_link = true; |
| 43 | } else if (std.mem.eql(u8, arg, "--preserve-tmp")) { | 47 | } else if (std.mem.eql(u8, arg, "--preserve-tmp")) { |
| 44 | preserve_tmp = true; | 48 | preserve_tmp = true; |
| | 49 | } else if (std.mem.eql(u8, arg, "-fqemu")) { |
| | 50 | enable_qemu = true; |
| | 51 | } else if (std.mem.eql(u8, arg, "-fwine")) { |
| | 52 | enable_wine = true; |
| | 53 | } else if (std.mem.eql(u8, arg, "-fwasmtime")) { |
| | 54 | enable_wasmtime = true; |
| | 55 | } else if (std.mem.eql(u8, arg, "-fdarling")) { |
| | 56 | enable_darling = true; |
| 45 | } else if (std.mem.eql(u8, arg, "--zig-cc-binary")) { | 57 | } else if (std.mem.eql(u8, arg, "--zig-cc-binary")) { |
| 46 | opt_cc_zig = arg_it.next() orelse fatal("expect arg after '--zig-cc-binary'\n{s}", .{usage}); | 58 | opt_cc_zig = arg_it.next() orelse fatal("expect arg after '--zig-cc-binary'\n{s}", .{usage}); |
| 47 | } else { | 59 | } else { |
| ... | @@ -196,6 +208,10 @@ pub fn main() !void { | ... | @@ -196,6 +208,10 @@ pub fn main() !void { |
| 196 | .allow_stderr = debug_log_verbose, | 208 | .allow_stderr = debug_log_verbose, |
| 197 | .preserve_tmp_on_fatal = preserve_tmp, | 209 | .preserve_tmp_on_fatal = preserve_tmp, |
| 198 | .cc_child_args = &cc_child_args, | 210 | .cc_child_args = &cc_child_args, |
| | 211 | .enable_qemu = enable_qemu, |
| | 212 | .enable_wine = enable_wine, |
| | 213 | .enable_wasmtime = enable_wasmtime, |
| | 214 | .enable_darling = enable_darling, |
| 199 | }; | 215 | }; |
| 200 | | 216 | |
| 201 | try child.spawn(io); | 217 | try child.spawn(io); |
| ... | @@ -243,6 +259,11 @@ const Eval = struct { | ... | @@ -243,6 +259,11 @@ const Eval = struct { |
| 243 | /// The arguments `out.c in.c` must be appended before spawning the subprocess. | 259 | /// The arguments `out.c in.c` must be appended before spawning the subprocess. |
| 244 | cc_child_args: *std.ArrayList([]const u8), | 260 | cc_child_args: *std.ArrayList([]const u8), |
| 245 | | 261 | |
| | 262 | enable_qemu: bool, |
| | 263 | enable_wine: bool, |
| | 264 | enable_wasmtime: bool, |
| | 265 | enable_darling: bool, |
| | 266 | |
| 246 | const StreamEnum = enum { stdout, stderr }; | 267 | const StreamEnum = enum { stdout, stderr }; |
| 247 | const Poller = Io.Poller(StreamEnum); | 268 | const Poller = Io.Poller(StreamEnum); |
| 248 | | 269 | |
| ... | @@ -439,7 +460,7 @@ const Eval = struct { | ... | @@ -439,7 +460,7 @@ const Eval = struct { |
| 439 | const io = eval.io; | 460 | const io = eval.io; |
| 440 | | 461 | |
| 441 | var argv_buf: [2][]const u8 = undefined; | 462 | var argv_buf: [2][]const u8 = undefined; |
| 442 | const argv: []const []const u8, const is_foreign: bool = switch (std.zig.system.getExternalExecutor( | 463 | const argv: []const []const u8, const is_foreign: bool = sw: switch (std.zig.system.getExternalExecutor( |
| 443 | io, | 464 | io, |
| 444 | &eval.host, | 465 | &eval.host, |
| 445 | &eval.target.resolved, | 466 | &eval.target.resolved, |
| ... | @@ -459,10 +480,41 @@ const Eval = struct { | ... | @@ -459,10 +480,41 @@ const Eval = struct { |
| 459 | argv_buf[0] = binary_path; | 480 | argv_buf[0] = binary_path; |
| 460 | break :argv .{ argv_buf[0..1], false }; | 481 | break :argv .{ argv_buf[0..1], false }; |
| 461 | }, | 482 | }, |
| 462 | .qemu, .wine, .wasmtime, .darling => |executor_cmd| argv: { | 483 | .qemu => |executor_cmd| argv: { |
| 463 | argv_buf[0] = executor_cmd; | 484 | if (eval.enable_qemu) { |
| 464 | argv_buf[1] = binary_path; | 485 | argv_buf[0] = executor_cmd; |
| 465 | break :argv .{ argv_buf[0..2], true }; | 486 | argv_buf[1] = binary_path; |
| | 487 | break :argv .{ argv_buf[0..2], true }; |
| | 488 | } else { |
| | 489 | continue :sw .bad_os_or_cpu; |
| | 490 | } |
| | 491 | }, |
| | 492 | .wine => |executor_cmd| argv: { |
| | 493 | if (eval.enable_wine) { |
| | 494 | argv_buf[0] = executor_cmd; |
| | 495 | argv_buf[1] = binary_path; |
| | 496 | break :argv .{ argv_buf[0..2], true }; |
| | 497 | } else { |
| | 498 | continue :sw .bad_os_or_cpu; |
| | 499 | } |
| | 500 | }, |
| | 501 | .wasmtime => |executor_cmd| argv: { |
| | 502 | if (eval.enable_wasmtime) { |
| | 503 | argv_buf[0] = executor_cmd; |
| | 504 | argv_buf[1] = binary_path; |
| | 505 | break :argv .{ argv_buf[0..2], true }; |
| | 506 | } else { |
| | 507 | continue :sw .bad_os_or_cpu; |
| | 508 | } |
| | 509 | }, |
| | 510 | .darling => |executor_cmd| argv: { |
| | 511 | if (eval.enable_darling) { |
| | 512 | argv_buf[0] = executor_cmd; |
| | 513 | argv_buf[1] = binary_path; |
| | 514 | break :argv .{ argv_buf[0..2], true }; |
| | 515 | } else { |
| | 516 | continue :sw .bad_os_or_cpu; |
| | 517 | } |
| 466 | }, | 518 | }, |
| 467 | }; | 519 | }; |
| 468 | | 520 | |