From deebee3aebddad51a7f06b50d10c8430af3d3569 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Sun, 10 Jun 2018 20:13:53 +0200 Subject: [PATCH] add cross compilation regression test Verify that it's possible to build for the host architecture and a different target architecture from a single build.zig. The test doubles as a basic WebAssembly smoke test. --- test/build_examples.zig | 1 + test/standalone/cross_compile/add.zig | 3 +++ test/standalone/cross_compile/build.zig | 18 ++++++++++++++++++ test/standalone/cross_compile/lib.zig | 1 + test/standalone/cross_compile/test.zig | 15 +++++++++++++++ 5 files changed, 38 insertions(+) create mode 100644 test/standalone/cross_compile/add.zig create mode 100644 test/standalone/cross_compile/build.zig create mode 100644 test/standalone/cross_compile/lib.zig create mode 100644 test/standalone/cross_compile/test.zig diff --git a/test/build_examples.zig b/test/build_examples.zig index 1ba0ca46cf8f..7a9cd817efe0 100644 --- a/test/build_examples.zig +++ b/test/build_examples.zig @@ -18,4 +18,5 @@ pub fn addCases(cases: *tests.BuildExamplesContext) void { cases.addBuildFile("test/standalone/pkg_import/build.zig"); cases.addBuildFile("test/standalone/use_alias/build.zig"); cases.addBuildFile("test/standalone/brace_expansion/build.zig"); + cases.addBuildFile("test/standalone/cross_compile/build.zig"); } diff --git a/test/standalone/cross_compile/add.zig b/test/standalone/cross_compile/add.zig new file mode 100644 index 000000000000..a04ec1544dc8 --- /dev/null +++ b/test/standalone/cross_compile/add.zig @@ -0,0 +1,3 @@ +export fn add(a: i32, b: i32) i32 { + return a + b; +} diff --git a/test/standalone/cross_compile/build.zig b/test/standalone/cross_compile/build.zig new file mode 100644 index 000000000000..ff4756f36ff6 --- /dev/null +++ b/test/standalone/cross_compile/build.zig @@ -0,0 +1,18 @@ +const builtin = @import("builtin"); +const std = @import("std"); + +pub fn build(b: *std.build.Builder) void { + const exe = b.addExecutable("test", "test.zig"); + exe.setBuildMode(b.standardReleaseOptions()); + + const lib = b.addStaticLibrary("lib", "lib.zig"); + lib.setBuildMode(builtin.Mode.ReleaseSmall); + lib.setTarget(builtin.Arch.wasm32, builtin.Os.freestanding, builtin.Environ.unknown); + + const run = b.addCommand(".", b.env_map, [][]const u8{exe.getOutputPath()}); + run.step.dependOn(&exe.step); + run.step.dependOn(&lib.step); + + const test_step = b.step("test", "Test it"); + test_step.dependOn(&run.step); +} diff --git a/test/standalone/cross_compile/lib.zig b/test/standalone/cross_compile/lib.zig new file mode 100644 index 000000000000..bf3a7b9d4fa5 --- /dev/null +++ b/test/standalone/cross_compile/lib.zig @@ -0,0 +1 @@ +pub use @import("add.zig"); diff --git a/test/standalone/cross_compile/test.zig b/test/standalone/cross_compile/test.zig new file mode 100644 index 000000000000..b6029680bfb6 --- /dev/null +++ b/test/standalone/cross_compile/test.zig @@ -0,0 +1,15 @@ +const std = @import("std"); +const assert = std.debug.assert; +const mem = std.mem; + +pub fn main() !void { + var direct = std.heap.DirectAllocator.init(); + defer direct.deinit(); + + const bytes = try std.io.readFileAlloc(&direct.allocator, "zig-cache/liblib.a"); + defer direct.allocator.free(bytes); + + // Verify that it is a wasm file and has the symbol "add" somewhere in it. + assert(mem.indexOf(u8, bytes, "\x00asm").? == 0); + assert(mem.indexOf(u8, bytes, "\x03add") != null); +}