diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-05-25 15:44:38 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-25 15:44:38 -0400 |
| commit | 2f538f30fda59d259b2d3c890a7ade6d35085da0 (patch) | |
| tree | 378b9fc0f9e54475c02ed520d3d8c9096e10fa17 /test | |
| parent | 5c251604521868ccd0cb49beef59e5524869281a (diff) | |
| parent | acaa0b8f085b386fabeb0fb92a3cb5818d1f3061 (diff) | |
| download | zig-2f538f30fda59d259b2d3c890a7ade6d35085da0.tar.gz zig-2f538f30fda59d259b2d3c890a7ade6d35085da0.zip | |
Merge pull request #8894 from xxxbxxx/standalone_buildmodes
add standalone test for c compiler with build modes
Diffstat (limited to 'test')
| -rw-r--r-- | test/standalone.zig | 37 | ||||
| -rw-r--r-- | test/standalone/c_compiler/build.zig | 53 | ||||
| -rw-r--r-- | test/standalone/c_compiler/test.c | 25 | ||||
| -rw-r--r-- | test/standalone/c_compiler/test.cpp | 26 | ||||
| -rw-r--r-- | test/tests.zig | 36 |
5 files changed, 152 insertions, 25 deletions
diff --git a/test/standalone.zig b/test/standalone.zig index f2251e5204..43c68c3686 100644 --- a/test/standalone.zig +++ b/test/standalone.zig @@ -8,26 +8,27 @@ pub fn addCases(cases: *tests.StandaloneContext) void { cases.add("test/standalone/guess_number/main.zig"); cases.add("test/standalone/main_return_error/error_u8.zig"); cases.add("test/standalone/main_return_error/error_u8_non_zero.zig"); - cases.addBuildFile("test/standalone/main_pkg_path/build.zig"); - cases.addBuildFile("test/standalone/shared_library/build.zig"); - cases.addBuildFile("test/standalone/mix_o_files/build.zig"); - cases.addBuildFile("test/standalone/global_linkage/build.zig"); - cases.addBuildFile("test/standalone/static_c_lib/build.zig"); - cases.addBuildFile("test/standalone/link_interdependent_static_c_libs/build.zig"); - cases.addBuildFile("test/standalone/link_static_lib_as_system_lib/build.zig"); - cases.addBuildFile("test/standalone/issue_339/build.zig"); - cases.addBuildFile("test/standalone/issue_8550/build.zig"); - cases.addBuildFile("test/standalone/issue_794/build.zig"); - cases.addBuildFile("test/standalone/issue_5825/build.zig"); - 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/empty_env/build.zig"); - cases.addBuildFile("test/standalone/issue_7030/build.zig"); + cases.addBuildFile("test/standalone/main_pkg_path/build.zig", .{}); + cases.addBuildFile("test/standalone/shared_library/build.zig", .{}); + cases.addBuildFile("test/standalone/mix_o_files/build.zig", .{}); + cases.addBuildFile("test/standalone/global_linkage/build.zig", .{}); + cases.addBuildFile("test/standalone/static_c_lib/build.zig", .{}); + cases.addBuildFile("test/standalone/link_interdependent_static_c_libs/build.zig", .{}); + cases.addBuildFile("test/standalone/link_static_lib_as_system_lib/build.zig", .{}); + cases.addBuildFile("test/standalone/issue_339/build.zig", .{}); + cases.addBuildFile("test/standalone/issue_8550/build.zig", .{}); + cases.addBuildFile("test/standalone/issue_794/build.zig", .{}); + cases.addBuildFile("test/standalone/issue_5825/build.zig", .{}); + 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/empty_env/build.zig", .{}); + cases.addBuildFile("test/standalone/issue_7030/build.zig", .{}); if (std.Target.current.os.tag != .wasi) { - cases.addBuildFile("test/standalone/load_dynamic_library/build.zig"); + cases.addBuildFile("test/standalone/load_dynamic_library/build.zig", .{}); } if (std.Target.current.cpu.arch == .x86_64) { // TODO add C ABI support for other architectures - cases.addBuildFile("test/stage1/c_abi/build.zig"); + cases.addBuildFile("test/stage1/c_abi/build.zig", .{}); } + cases.addBuildFile("test/standalone/c_compiler/build.zig", .{ .build_modes = true, .cross_targets = true }); } diff --git a/test/standalone/c_compiler/build.zig b/test/standalone/c_compiler/build.zig new file mode 100644 index 0000000000..1026f2ca50 --- /dev/null +++ b/test/standalone/c_compiler/build.zig @@ -0,0 +1,53 @@ +const std = @import("std"); +const Builder = std.build.Builder; +const CrossTarget = std.zig.CrossTarget; + +fn isRunnableTarget(t: CrossTarget) bool { + if (t.isNative()) return true; + + return (t.getOsTag() == std.Target.current.os.tag and + t.getCpuArch() == std.Target.current.cpu.arch); +} + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + const target = b.standardTargetOptions(.{}); + + const test_step = b.step("test", "Test the program"); + + const exe_c = b.addExecutable("test_c", null); + b.default_step.dependOn(&exe_c.step); + exe_c.addCSourceFile("test.c", &[0][]const u8{}); + exe_c.setBuildMode(mode); + exe_c.setTarget(target); + exe_c.linkLibC(); + + const exe_cpp = b.addExecutable("test_cpp", null); + b.default_step.dependOn(&exe_cpp.step); + exe_cpp.addCSourceFile("test.cpp", &[0][]const u8{}); + exe_cpp.setBuildMode(mode); + exe_cpp.setTarget(target); + exe_cpp.linkSystemLibrary("c++"); + + // disable broken LTO links: + switch(target.getOsTag()) { + .windows => { + exe_cpp.want_lto = false; + }, + .macos => { + exe_cpp.want_lto = false; + exe_c.want_lto = false; + }, + else => {}, + } + + if (isRunnableTarget(target)) { + const run_c_cmd = exe_c.run(); + test_step.dependOn(&run_c_cmd.step); + const run_cpp_cmd = exe_cpp.run(); + test_step.dependOn(&run_cpp_cmd.step); + } else { + test_step.dependOn(&exe_c.step); + test_step.dependOn(&exe_cpp.step); + } +} diff --git a/test/standalone/c_compiler/test.c b/test/standalone/c_compiler/test.c new file mode 100644 index 0000000000..842a63fc67 --- /dev/null +++ b/test/standalone/c_compiler/test.c @@ -0,0 +1,25 @@ +#include <assert.h> +#include <stdio.h> + +typedef struct { + int val; +} STest; + +int getVal(STest* data) { return data->val; } + +int main (int argc, char *argv[]) +{ + STest* data = (STest*)malloc(sizeof(STest)); + data->val = 123; + + assert(getVal(data) != 456); + int ok = (getVal(data) == 123); + + if (argc>1) fprintf(stdout, "val=%d\n", data->val); + + free(data); + + if (!ok) abort(); + + return 0; +} diff --git a/test/standalone/c_compiler/test.cpp b/test/standalone/c_compiler/test.cpp new file mode 100644 index 0000000000..f10a9e0c00 --- /dev/null +++ b/test/standalone/c_compiler/test.cpp @@ -0,0 +1,26 @@ +#include <iostream> +#include <cassert> + +class CTest { +public: + CTest(int val) : m_val(val) {}; + virtual ~CTest() {} + + virtual int getVal() const { return m_val; } + virtual void printVal() { std::cout << "val=" << m_val << std::endl; } +private: + int m_val; +}; + +int main (int argc, char *argv[]) +{ + auto* t = new CTest(123); + assert(t->getVal()!=456); + if (argc>1) t->printVal(); + bool ok = t->getVal() == 123; + delete t; + + if (!ok) abort(); + + return 0; +} diff --git a/test/tests.zig b/test/tests.zig index 243428a537..63b851e90b 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -399,7 +399,7 @@ pub fn addCompileErrorTests(b: *build.Builder, test_filter: ?[]const u8, modes: return cases.step; } -pub fn addStandaloneTests(b: *build.Builder, test_filter: ?[]const u8, modes: []const Mode) *build.Step { +pub fn addStandaloneTests(b: *build.Builder, test_filter: ?[]const u8, modes: []const Mode, skip_non_native: bool, target: std.zig.CrossTarget) *build.Step { const cases = b.allocator.create(StandaloneContext) catch unreachable; cases.* = StandaloneContext{ .b = b, @@ -407,6 +407,8 @@ pub fn addStandaloneTests(b: *build.Builder, test_filter: ?[]const u8, modes: [] .test_index = 0, .test_filter = test_filter, .modes = modes, + .skip_non_native = skip_non_native, + .target = target, }; standalone.addCases(cases); @@ -1136,6 +1138,8 @@ pub const StandaloneContext = struct { test_index: usize, test_filter: ?[]const u8, modes: []const Mode, + skip_non_native: bool, + target: std.zig.CrossTarget, pub fn addC(self: *StandaloneContext, root_src: []const u8) void { self.addAllArgs(root_src, true); @@ -1145,10 +1149,10 @@ pub const StandaloneContext = struct { self.addAllArgs(root_src, false); } - pub fn addBuildFile(self: *StandaloneContext, build_file: []const u8) void { + pub fn addBuildFile(self: *StandaloneContext, build_file: []const u8, features: struct { build_modes: bool = false, cross_targets: bool = false }) void { const b = self.b; - const annotated_case_name = b.fmt("build {s} (Debug)", .{build_file}); + const annotated_case_name = b.fmt("build {s}", .{build_file}); if (self.test_filter) |filter| { if (mem.indexOf(u8, annotated_case_name, filter) == null) return; } @@ -1167,12 +1171,30 @@ pub const StandaloneContext = struct { zig_args.append("--verbose") catch unreachable; } - const run_cmd = b.addSystemCommand(zig_args.items); + if (features.cross_targets and !self.target.isNative()) { + const target_arg = fmt.allocPrint(b.allocator, "-Dtarget={s}", .{self.target.zigTriple(b.allocator) catch unreachable}) catch unreachable; + zig_args.append(target_arg) catch unreachable; + } + + const modes = if (features.build_modes) self.modes else &[1]Mode{.Debug}; + for (modes) |mode| { + const arg = switch (mode) { + .Debug => "", + .ReleaseFast => "-Drelease-fast", + .ReleaseSafe => "-Drelease-safe", + .ReleaseSmall => "-Drelease-small", + }; + const zig_args_base_len = zig_args.items.len; + if (arg.len > 0) + zig_args.append(arg) catch unreachable; + defer zig_args.resize(zig_args_base_len) catch unreachable; - const log_step = b.addLog("PASS {s}\n", .{annotated_case_name}); - log_step.step.dependOn(&run_cmd.step); + const run_cmd = b.addSystemCommand(zig_args.items); + const log_step = b.addLog("PASS {s} ({s})\n", .{ annotated_case_name, @tagName(mode) }); + log_step.step.dependOn(&run_cmd.step); - self.step.dependOn(&log_step.step); + self.step.dependOn(&log_step.step); + } } pub fn addAllArgs(self: *StandaloneContext, root_src: []const u8, link_libc: bool) void { |
