diff --git a/src/link.cpp b/src/link.cpp index da9cff8ffb..7d5ae7dd94 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -573,6 +573,9 @@ static void get_darwin_platform(LinkJob *lj, DarwinPlatform *platform) { platform->kind = MacOS; } else if (g->mios_version_min) { platform->kind = IPhoneOS; + } else if (g->zig_target.os == ZigLLVM_MacOSX) { + platform->kind = MacOS; + g->mmacosx_version_min = buf_create_from_str("10.10"); } else { zig_panic("unable to infer -mmacosx-version-min or -mios-version-min"); } diff --git a/src/main.cpp b/src/main.cpp index b3fa234740..d3a0c800a7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -676,6 +676,16 @@ int main(int argc, char **argv) { } else if (cmd == CmdTest) { codegen_build(g); codegen_link(g, "./test"); + + ZigTarget native; + get_native_target(&native); + bool is_native_target = target == nullptr || (target->os == native.os && + target->arch.arch == native.arch.arch && target->arch.sub_arch == native.arch.sub_arch); + if (!is_native_target) { + fprintf(stderr, "Skipping execution of non-native test binary.\n"); + return 0; + } + ZigList args = {0}; Termination term; os_spawn_process("./test", args, &term); diff --git a/src/target.cpp b/src/target.cpp index 5aea3ce34d..e3dad05cf6 100644 --- a/src/target.cpp +++ b/src/target.cpp @@ -482,6 +482,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) { } case ZigLLVM_Linux: case ZigLLVM_Darwin: + case ZigLLVM_MacOSX: switch (id) { case CIntTypeShort: case CIntTypeUShort: @@ -521,7 +522,6 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) { case ZigLLVM_IOS: case ZigLLVM_KFreeBSD: case ZigLLVM_Lv2: - case ZigLLVM_MacOSX: case ZigLLVM_NetBSD: case ZigLLVM_OpenBSD: case ZigLLVM_Solaris: diff --git a/std/build.zig b/std/build.zig index 072a400b30..a42434da50 100644 --- a/std/build.zig +++ b/std/build.zig @@ -1027,6 +1027,7 @@ pub const TestStep = struct { link_libs: BufSet, name_prefix: []const u8, filter: ?[]const u8, + target: Target, pub fn init(builder: &Builder, root_src: []const u8) -> TestStep { const step_name = builder.fmt("test {}", root_src); @@ -1039,6 +1040,7 @@ pub const TestStep = struct { .name_prefix = "", .filter = null, .link_libs = BufSet.init(builder.allocator), + .target = Target.Native, } } @@ -1062,6 +1064,18 @@ pub const TestStep = struct { self.filter = text; } + pub fn setTarget(self: &TestStep, target_arch: builtin.Arch, target_os: builtin.Os, + target_environ: builtin.Environ) + { + self.target = Target.Cross { + CrossTarget { + .arch = target_arch, + .os = target_os, + .environ = target_environ, + } + }; + } + fn make(step: &Step) -> %void { const self = @fieldParentPtr(TestStep, "step", step); const builder = self.builder; @@ -1082,6 +1096,20 @@ pub const TestStep = struct { builtin.Mode.ReleaseFast => %%zig_args.append("--release-fast"), } + switch (self.target) { + Target.Native => {}, + Target.Cross => |cross_target| { + %%zig_args.append("--target-arch"); + %%zig_args.append(@enumTagName(cross_target.arch)); + + %%zig_args.append("--target-os"); + %%zig_args.append(@enumTagName(cross_target.os)); + + %%zig_args.append("--target-environ"); + %%zig_args.append(@enumTagName(cross_target.environ)); + }, + } + if (self.filter) |filter| { %%zig_args.append("--test-filter"); %%zig_args.append(filter); diff --git a/test/tests.zig b/test/tests.zig index 41f493c58d..fafbd436d6 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -9,7 +9,8 @@ const io = std.io; const mem = std.mem; const fmt = std.fmt; const ArrayList = std.ArrayList; -const Mode = @import("builtin").Mode; +const builtin = @import("builtin"); +const Mode = builtin.Mode; const compare_output = @import("compare_output.zig"); const build_examples = @import("build_examples.zig"); @@ -18,6 +19,25 @@ const assemble_and_link = @import("assemble_and_link.zig"); const debug_safety = @import("debug_safety.zig"); const parseh = @import("parseh.zig"); +const TestTarget = struct { + os: builtin.Os, + arch: builtin.Arch, + environ: builtin.Environ, +}; + +const test_targets = []TestTarget { + TestTarget { + .os = builtin.Os.linux, + .arch = builtin.Arch.x86_64, + .environ = builtin.Environ.gnu, + }, + TestTarget { + .os = builtin.Os.macosx, + .arch = builtin.Arch.x86_64, + .environ = builtin.Environ.unknown, + }, +}; + error TestFailed; pub fn addCompareOutputTests(b: &build.Builder, test_filter: ?[]const u8) -> &build.Step { @@ -121,17 +141,27 @@ pub fn addPkgTestsRaw(b: &build.Builder, test_filter: ?[]const u8, root_src: []c { const libc_bools = if (always_link_libc) []bool{true} else []bool{false, true}; const step = b.step(b.fmt("test-{}", name), desc); - for ([]Mode{Mode.Debug, Mode.ReleaseFast}) |mode| { - for (libc_bools) |link_libc| { - const these_tests = b.addTest(root_src); - these_tests.setNamePrefix(b.fmt("{}-{}-{} ", name, @enumTagName(mode), - if (link_libc) "c" else "bare")); - these_tests.setFilter(test_filter); - these_tests.setBuildMode(mode); - if (link_libc) { - these_tests.linkSystemLibrary("c"); + for (test_targets) |test_target| { + const is_native = (test_target.os == builtin.os and test_target.arch == builtin.arch); + for ([]Mode{Mode.Debug, Mode.ReleaseFast}) |mode| { + for (libc_bools) |link_libc| { + if (link_libc and !is_native) { + // don't assume we have a cross-compiling libc set up + continue; + } + const these_tests = b.addTest(root_src); + these_tests.setNamePrefix(b.fmt("{}-{}-{}-{}-{} ", name, @enumTagName(test_target.os), + @enumTagName(test_target.arch), @enumTagName(mode), if (link_libc) "c" else "bare")); + these_tests.setFilter(test_filter); + these_tests.setBuildMode(mode); + if (!is_native) { + these_tests.setTarget(test_target.arch, test_target.os, test_target.environ); + } + if (link_libc) { + these_tests.linkSystemLibrary("c"); + } + step.dependOn(&these_tests.step); } - step.dependOn(&these_tests.step); } } return step;