std.Build: implement --host-target, --host-cpu, --host-dynamic-linker
This also makes a long-overdue change of extracting common state from Build into a shared Graph object. Getting the semantics right for these flags turned out to be quite tricky. In the end it works like this: * The override only happens when the target is fully native, with no additional query parameters, such as versions or CPU features added. * The override affects the resolved Target but leaves the original Query unmodified. * The "is native?" detection logic operates on the original, unmodified query. This makes it possible to provide invalid host target information, causing confusing errors to occur. Don't do that. There are some minor breaking changes to std.Build API such as the fact that `b.zig_exe` is now moved to `b.graph.zig_exe`, as well as a handful of other similar flags.
This commit is contained in:
@@ -796,7 +796,7 @@ pub fn addCliTests(b: *std.Build) *Step {
|
||||
{
|
||||
// Test `zig init`.
|
||||
const tmp_path = b.makeTempPath();
|
||||
const init_exe = b.addSystemCommand(&.{ b.zig_exe, "init" });
|
||||
const init_exe = b.addSystemCommand(&.{ b.graph.zig_exe, "init" });
|
||||
init_exe.setCwd(.{ .cwd_relative = tmp_path });
|
||||
init_exe.setName("zig init");
|
||||
init_exe.expectStdOutEqual("");
|
||||
@@ -810,20 +810,20 @@ pub fn addCliTests(b: *std.Build) *Step {
|
||||
const bad_out_arg = "-femit-bin=does" ++ s ++ "not" ++ s ++ "exist" ++ s ++ "foo.exe";
|
||||
const ok_src_arg = "src" ++ s ++ "main.zig";
|
||||
const expected = "error: unable to open output directory 'does" ++ s ++ "not" ++ s ++ "exist': FileNotFound\n";
|
||||
const run_bad = b.addSystemCommand(&.{ b.zig_exe, "build-exe", ok_src_arg, bad_out_arg });
|
||||
const run_bad = b.addSystemCommand(&.{ b.graph.zig_exe, "build-exe", ok_src_arg, bad_out_arg });
|
||||
run_bad.setName("zig build-exe error message for bad -femit-bin arg");
|
||||
run_bad.expectExitCode(1);
|
||||
run_bad.expectStdErrEqual(expected);
|
||||
run_bad.expectStdOutEqual("");
|
||||
run_bad.step.dependOn(&init_exe.step);
|
||||
|
||||
const run_test = b.addSystemCommand(&.{ b.zig_exe, "build", "test" });
|
||||
const run_test = b.addSystemCommand(&.{ b.graph.zig_exe, "build", "test" });
|
||||
run_test.setCwd(.{ .cwd_relative = tmp_path });
|
||||
run_test.setName("zig build test");
|
||||
run_test.expectStdOutEqual("");
|
||||
run_test.step.dependOn(&init_exe.step);
|
||||
|
||||
const run_run = b.addSystemCommand(&.{ b.zig_exe, "build", "run" });
|
||||
const run_run = b.addSystemCommand(&.{ b.graph.zig_exe, "build", "run" });
|
||||
run_run.setCwd(.{ .cwd_relative = tmp_path });
|
||||
run_run.setName("zig build run");
|
||||
run_run.expectStdOutEqual("Run `zig build test` to run the tests.\n");
|
||||
@@ -857,7 +857,7 @@ pub fn addCliTests(b: *std.Build) *Step {
|
||||
|
||||
// This is intended to be the exact CLI usage used by godbolt.org.
|
||||
const run = b.addSystemCommand(&.{
|
||||
b.zig_exe, "build-obj",
|
||||
b.graph.zig_exe, "build-obj",
|
||||
"--cache-dir", tmp_path,
|
||||
"--name", "example",
|
||||
"-fno-emit-bin", "-fno-emit-h",
|
||||
@@ -900,7 +900,7 @@ pub fn addCliTests(b: *std.Build) *Step {
|
||||
subdir.writeFile("fmt3.zig", unformatted_code) catch @panic("unhandled");
|
||||
|
||||
// Test zig fmt affecting only the appropriate files.
|
||||
const run1 = b.addSystemCommand(&.{ b.zig_exe, "fmt", "fmt1.zig" });
|
||||
const run1 = b.addSystemCommand(&.{ b.graph.zig_exe, "fmt", "fmt1.zig" });
|
||||
run1.setName("run zig fmt one file");
|
||||
run1.setCwd(.{ .cwd_relative = tmp_path });
|
||||
run1.has_side_effects = true;
|
||||
@@ -908,7 +908,7 @@ pub fn addCliTests(b: *std.Build) *Step {
|
||||
run1.expectStdOutEqual("fmt1.zig\n");
|
||||
|
||||
// Test excluding files and directories from a run
|
||||
const run2 = b.addSystemCommand(&.{ b.zig_exe, "fmt", "--exclude", "fmt2.zig", "--exclude", "subdir", "." });
|
||||
const run2 = b.addSystemCommand(&.{ b.graph.zig_exe, "fmt", "--exclude", "fmt2.zig", "--exclude", "subdir", "." });
|
||||
run2.setName("run zig fmt on directory with exclusions");
|
||||
run2.setCwd(.{ .cwd_relative = tmp_path });
|
||||
run2.has_side_effects = true;
|
||||
@@ -916,7 +916,7 @@ pub fn addCliTests(b: *std.Build) *Step {
|
||||
run2.step.dependOn(&run1.step);
|
||||
|
||||
// Test excluding non-existent file
|
||||
const run3 = b.addSystemCommand(&.{ b.zig_exe, "fmt", "--exclude", "fmt2.zig", "--exclude", "nonexistent.zig", "." });
|
||||
const run3 = b.addSystemCommand(&.{ b.graph.zig_exe, "fmt", "--exclude", "fmt2.zig", "--exclude", "nonexistent.zig", "." });
|
||||
run3.setName("run zig fmt on directory with non-existent exclusion");
|
||||
run3.setCwd(.{ .cwd_relative = tmp_path });
|
||||
run3.has_side_effects = true;
|
||||
@@ -924,7 +924,7 @@ pub fn addCliTests(b: *std.Build) *Step {
|
||||
run3.step.dependOn(&run2.step);
|
||||
|
||||
// running it on the dir, only the new file should be changed
|
||||
const run4 = b.addSystemCommand(&.{ b.zig_exe, "fmt", "." });
|
||||
const run4 = b.addSystemCommand(&.{ b.graph.zig_exe, "fmt", "." });
|
||||
run4.setName("run zig fmt the directory");
|
||||
run4.setCwd(.{ .cwd_relative = tmp_path });
|
||||
run4.has_side_effects = true;
|
||||
@@ -932,7 +932,7 @@ pub fn addCliTests(b: *std.Build) *Step {
|
||||
run4.step.dependOn(&run3.step);
|
||||
|
||||
// both files have been formatted, nothing should change now
|
||||
const run5 = b.addSystemCommand(&.{ b.zig_exe, "fmt", "." });
|
||||
const run5 = b.addSystemCommand(&.{ b.graph.zig_exe, "fmt", "." });
|
||||
run5.setName("run zig fmt with nothing to do");
|
||||
run5.setCwd(.{ .cwd_relative = tmp_path });
|
||||
run5.has_side_effects = true;
|
||||
@@ -946,7 +946,7 @@ pub fn addCliTests(b: *std.Build) *Step {
|
||||
write6.step.dependOn(&run5.step);
|
||||
|
||||
// Test `zig fmt` handling UTF-16 decoding.
|
||||
const run6 = b.addSystemCommand(&.{ b.zig_exe, "fmt", "." });
|
||||
const run6 = b.addSystemCommand(&.{ b.graph.zig_exe, "fmt", "." });
|
||||
run6.setName("run zig fmt convert UTF-16 to UTF-8");
|
||||
run6.setCwd(.{ .cwd_relative = tmp_path });
|
||||
run6.has_side_effects = true;
|
||||
|
||||
Reference in New Issue
Block a user