From 38edef35bfcba5789ea50adc7c76dec504079812 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Sat, 28 May 2022 11:44:53 +0200 Subject: [PATCH] test: introduce link(er) tests - builds on standalone tests --- build.zig | 1 + lib/std/build/RunStep.zig | 1 + test/link.zig | 52 +++++++++++++++++++ test/link/bss/build.zig | 14 +++++ test/link/bss/main.zig | 13 +++++ .../common_symbols}/a.c | 0 .../common_symbols}/b.c | 0 .../common_symbols}/build.zig | 0 .../common_symbols}/c.c | 0 .../common_symbols}/main.zig | 0 .../common_symbols_alignment}/a.c | 0 .../common_symbols_alignment}/build.zig | 0 .../common_symbols_alignment}/main.zig | 0 test/link/dylib/a.c | 7 +++ test/link/dylib/build.zig | 29 +++++++++++ test/link/dylib/main.c | 9 ++++ .../frameworks}/build.zig | 18 +------ .../frameworks}/main.c | 0 .../interdependent_static_c_libs}/a.c | 0 .../interdependent_static_c_libs}/a.h | 0 .../interdependent_static_c_libs}/b.c | 0 .../interdependent_static_c_libs}/b.h | 0 .../interdependent_static_c_libs}/build.zig | 0 .../interdependent_static_c_libs}/main.zig | 0 test/{standalone => link}/objc/Foo.h | 0 test/{standalone => link}/objc/Foo.m | 0 test/{standalone => link}/objc/build.zig | 18 +------ test/{standalone => link}/objc/test.m | 0 test/{standalone => link}/objcpp/Foo.h | 0 test/{standalone => link}/objcpp/Foo.mm | 0 test/{standalone => link}/objcpp/build.zig | 20 ++----- test/{standalone => link}/objcpp/test.mm | 0 .../static_lib_as_system_lib}/a.c | 0 .../static_lib_as_system_lib}/a.h | 0 .../static_lib_as_system_lib}/build.zig | 0 .../static_lib_as_system_lib}/main.zig | 0 test/link/tls/a.c | 5 ++ .../tls}/build.zig | 2 + test/link/tls/main.zig | 15 ++++++ test/standalone.zig | 37 ++----------- test/standalone/link_import_tls_dylib/a.c | 1 - .../standalone/link_import_tls_dylib/main.zig | 7 --- test/tests.zig | 22 ++++++++ 43 files changed, 182 insertions(+), 89 deletions(-) create mode 100644 test/link.zig create mode 100644 test/link/bss/build.zig create mode 100644 test/link/bss/main.zig rename test/{standalone/link_common_symbols => link/common_symbols}/a.c (100%) rename test/{standalone/link_common_symbols => link/common_symbols}/b.c (100%) rename test/{standalone/link_common_symbols => link/common_symbols}/build.zig (100%) rename test/{standalone/link_common_symbols => link/common_symbols}/c.c (100%) rename test/{standalone/link_common_symbols => link/common_symbols}/main.zig (100%) rename test/{standalone/link_common_symbols_alignment => link/common_symbols_alignment}/a.c (100%) rename test/{standalone/link_common_symbols_alignment => link/common_symbols_alignment}/build.zig (100%) rename test/{standalone/link_common_symbols_alignment => link/common_symbols_alignment}/main.zig (100%) create mode 100644 test/link/dylib/a.c create mode 100644 test/link/dylib/build.zig create mode 100644 test/link/dylib/main.c rename test/{standalone/link_frameworks => link/frameworks}/build.zig (50%) rename test/{standalone/link_frameworks => link/frameworks}/main.c (100%) rename test/{standalone/link_interdependent_static_c_libs => link/interdependent_static_c_libs}/a.c (100%) rename test/{standalone/link_interdependent_static_c_libs => link/interdependent_static_c_libs}/a.h (100%) rename test/{standalone/link_interdependent_static_c_libs => link/interdependent_static_c_libs}/b.c (100%) rename test/{standalone/link_interdependent_static_c_libs => link/interdependent_static_c_libs}/b.h (100%) rename test/{standalone/link_interdependent_static_c_libs => link/interdependent_static_c_libs}/build.zig (100%) rename test/{standalone/link_interdependent_static_c_libs => link/interdependent_static_c_libs}/main.zig (100%) rename test/{standalone => link}/objc/Foo.h (100%) rename test/{standalone => link}/objc/Foo.m (100%) rename test/{standalone => link}/objc/build.zig (54%) rename test/{standalone => link}/objc/test.m (100%) rename test/{standalone => link}/objcpp/Foo.h (100%) rename test/{standalone => link}/objcpp/Foo.mm (100%) rename test/{standalone => link}/objcpp/build.zig (54%) rename test/{standalone => link}/objcpp/test.mm (100%) rename test/{standalone/link_static_lib_as_system_lib => link/static_lib_as_system_lib}/a.c (100%) rename test/{standalone/link_static_lib_as_system_lib => link/static_lib_as_system_lib}/a.h (100%) rename test/{standalone/link_static_lib_as_system_lib => link/static_lib_as_system_lib}/build.zig (100%) rename test/{standalone/link_static_lib_as_system_lib => link/static_lib_as_system_lib}/main.zig (100%) create mode 100644 test/link/tls/a.c rename test/{standalone/link_import_tls_dylib => link/tls}/build.zig (91%) create mode 100644 test/link/tls/main.zig delete mode 100644 test/standalone/link_import_tls_dylib/a.c delete mode 100644 test/standalone/link_import_tls_dylib/main.zig diff --git a/build.zig b/build.zig index fc97fc91bd..0ca2e0d7d7 100644 --- a/build.zig +++ b/build.zig @@ -489,6 +489,7 @@ pub fn build(b: *Builder) !void { toolchain_step.dependOn(tests.addCompareOutputTests(b, test_filter, modes)); toolchain_step.dependOn(tests.addStandaloneTests(b, test_filter, modes, skip_non_native, enable_macos_sdk, target)); + toolchain_step.dependOn(tests.addLinkTests(b, test_filter, modes, enable_macos_sdk)); toolchain_step.dependOn(tests.addStackTraceTests(b, test_filter, modes)); toolchain_step.dependOn(tests.addCliTests(b, test_filter, modes)); toolchain_step.dependOn(tests.addAssembleAndLinkTests(b, test_filter, modes)); diff --git a/lib/std/build/RunStep.zig b/lib/std/build/RunStep.zig index e8cf87a441..0b8c233bfa 100644 --- a/lib/std/build/RunStep.zig +++ b/lib/std/build/RunStep.zig @@ -149,6 +149,7 @@ fn make(step: *Step) !void { const cwd = if (self.cwd) |cwd| self.builder.pathFromRoot(cwd) else self.builder.build_root; var argv_list = ArrayList([]const u8).init(self.builder.allocator); + for (self.argv.items) |arg| { switch (arg) { .bytes => |bytes| try argv_list.append(bytes), diff --git a/test/link.zig b/test/link.zig new file mode 100644 index 0000000000..3c1b268d86 --- /dev/null +++ b/test/link.zig @@ -0,0 +1,52 @@ +const std = @import("std"); +const builtin = @import("builtin"); +const tests = @import("tests.zig"); + +pub fn addCases(cases: *tests.StandaloneContext) void { + cases.addBuildFile("test/link/bss/build.zig", .{ + .build_modes = false, // we only guarantee zerofill for undefined in Debug + }); + + cases.addBuildFile("test/link/dylib/build.zig", .{ + .build_modes = true, + }); + + cases.addBuildFile("test/link/common_symbols/build.zig", .{ + .build_modes = true, + }); + + cases.addBuildFile("test/link/common_symbols_alignment/build.zig", .{ + .build_modes = true, + }); + + cases.addBuildFile("test/link/interdependent_static_c_libs/build.zig", .{ + .build_modes = true, + }); + + cases.addBuildFile("test/link/static_lib_as_system_lib/build.zig", .{ + .build_modes = true, + }); + + cases.addBuildFile("test/link/tls/build.zig", .{ + .build_modes = true, + }); + + if (builtin.os.tag == .macos) { + cases.addBuildFile("test/link/frameworks/build.zig", .{ + .build_modes = true, + .requires_macos_sdk = true, + }); + + // Try to build and run an Objective-C executable. + cases.addBuildFile("test/link/objc/build.zig", .{ + .build_modes = true, + .requires_macos_sdk = true, + }); + + // Try to build and run an Objective-C++ executable. + cases.addBuildFile("test/link/objcpp/build.zig", .{ + .build_modes = true, + .requires_macos_sdk = true, + }); + } +} diff --git a/test/link/bss/build.zig b/test/link/bss/build.zig new file mode 100644 index 0000000000..76e9bdb305 --- /dev/null +++ b/test/link/bss/build.zig @@ -0,0 +1,14 @@ +const Builder = @import("std").build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + const test_step = b.step("test", "Test"); + + const exe = b.addExecutable("bss", "main.zig"); + b.default_step.dependOn(&exe.step); + exe.setBuildMode(mode); + + const run = exe.run(); + run.expectStdOutEqual("0, 1, 0\n"); + test_step.dependOn(&run.step); +} diff --git a/test/link/bss/main.zig b/test/link/bss/main.zig new file mode 100644 index 0000000000..c901f0bb27 --- /dev/null +++ b/test/link/bss/main.zig @@ -0,0 +1,13 @@ +const std = @import("std"); + +// Stress test zerofill layout +var buffer: [0x1000000]u64 = undefined; + +pub fn main() anyerror!void { + buffer[0x10] = 1; + try std.io.getStdOut().writer().print("{d}, {d}, {d}\n", .{ + buffer[0], + buffer[0x10], + buffer[0x1000000 - 1], + }); +} diff --git a/test/standalone/link_common_symbols/a.c b/test/link/common_symbols/a.c similarity index 100% rename from test/standalone/link_common_symbols/a.c rename to test/link/common_symbols/a.c diff --git a/test/standalone/link_common_symbols/b.c b/test/link/common_symbols/b.c similarity index 100% rename from test/standalone/link_common_symbols/b.c rename to test/link/common_symbols/b.c diff --git a/test/standalone/link_common_symbols/build.zig b/test/link/common_symbols/build.zig similarity index 100% rename from test/standalone/link_common_symbols/build.zig rename to test/link/common_symbols/build.zig diff --git a/test/standalone/link_common_symbols/c.c b/test/link/common_symbols/c.c similarity index 100% rename from test/standalone/link_common_symbols/c.c rename to test/link/common_symbols/c.c diff --git a/test/standalone/link_common_symbols/main.zig b/test/link/common_symbols/main.zig similarity index 100% rename from test/standalone/link_common_symbols/main.zig rename to test/link/common_symbols/main.zig diff --git a/test/standalone/link_common_symbols_alignment/a.c b/test/link/common_symbols_alignment/a.c similarity index 100% rename from test/standalone/link_common_symbols_alignment/a.c rename to test/link/common_symbols_alignment/a.c diff --git a/test/standalone/link_common_symbols_alignment/build.zig b/test/link/common_symbols_alignment/build.zig similarity index 100% rename from test/standalone/link_common_symbols_alignment/build.zig rename to test/link/common_symbols_alignment/build.zig diff --git a/test/standalone/link_common_symbols_alignment/main.zig b/test/link/common_symbols_alignment/main.zig similarity index 100% rename from test/standalone/link_common_symbols_alignment/main.zig rename to test/link/common_symbols_alignment/main.zig diff --git a/test/link/dylib/a.c b/test/link/dylib/a.c new file mode 100644 index 0000000000..199b31e1a0 --- /dev/null +++ b/test/link/dylib/a.c @@ -0,0 +1,7 @@ +#include + +char world[] = "world"; + +char* hello() { + return "Hello"; +} diff --git a/test/link/dylib/build.zig b/test/link/dylib/build.zig new file mode 100644 index 0000000000..a9dee4aafb --- /dev/null +++ b/test/link/dylib/build.zig @@ -0,0 +1,29 @@ +const std = @import("std"); +const Builder = std.build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + + const test_step = b.step("test", "Test"); + + const dylib = b.addSharedLibrary("a", null, b.version(1, 0, 0)); + dylib.setBuildMode(mode); + dylib.addCSourceFile("a.c", &.{}); + dylib.linkLibC(); + dylib.install(); + + const exe = b.addExecutable("main", null); + exe.setBuildMode(mode); + exe.addCSourceFile("main.c", &.{}); + exe.linkSystemLibrary("a"); + exe.linkLibC(); + exe.addLibraryPath(b.pathFromRoot("zig-out/lib/")); + exe.addRPath(b.pathFromRoot("zig-out/lib")); + + const run = exe.run(); + run.cwd = b.pathFromRoot("."); + run.expectStdOutEqual("Hello world"); + + test_step.dependOn(b.getInstallStep()); + test_step.dependOn(&run.step); +} diff --git a/test/link/dylib/main.c b/test/link/dylib/main.c new file mode 100644 index 0000000000..be1647ddad --- /dev/null +++ b/test/link/dylib/main.c @@ -0,0 +1,9 @@ +#include + +char* hello(); +extern char world[]; + +int main() { + printf("%s %s", hello(), world); + return 0; +} diff --git a/test/standalone/link_frameworks/build.zig b/test/link/frameworks/build.zig similarity index 50% rename from test/standalone/link_frameworks/build.zig rename to test/link/frameworks/build.zig index 460e1675e0..5700422a41 100644 --- a/test/standalone/link_frameworks/build.zig +++ b/test/link/frameworks/build.zig @@ -1,19 +1,8 @@ const std = @import("std"); const Builder = std.build.Builder; -const CrossTarget = std.zig.CrossTarget; - -fn isRunnableTarget(t: CrossTarget) bool { - // TODO I think we might be able to run this on Linux via Darling. - // Add a check for that here, and return true if Darling is available. - if (t.isNative() and t.getOsTag() == .macos) - return true - else - return false; -} pub fn build(b: *Builder) void { const mode = b.standardReleaseOptions(); - const target = b.standardTargetOptions(.{}); const test_step = b.step("test", "Test the program"); @@ -21,14 +10,11 @@ pub fn build(b: *Builder) void { b.default_step.dependOn(&exe.step); exe.addCSourceFile("main.c", &[0][]const u8{}); exe.setBuildMode(mode); - exe.setTarget(target); exe.linkLibC(); // TODO when we figure out how to ship framework stubs for cross-compilation, // populate paths to the sysroot here. exe.linkFramework("Cocoa"); - if (isRunnableTarget(target)) { - const run_cmd = exe.run(); - test_step.dependOn(&run_cmd.step); - } + const run_cmd = exe.run(); + test_step.dependOn(&run_cmd.step); } diff --git a/test/standalone/link_frameworks/main.c b/test/link/frameworks/main.c similarity index 100% rename from test/standalone/link_frameworks/main.c rename to test/link/frameworks/main.c diff --git a/test/standalone/link_interdependent_static_c_libs/a.c b/test/link/interdependent_static_c_libs/a.c similarity index 100% rename from test/standalone/link_interdependent_static_c_libs/a.c rename to test/link/interdependent_static_c_libs/a.c diff --git a/test/standalone/link_interdependent_static_c_libs/a.h b/test/link/interdependent_static_c_libs/a.h similarity index 100% rename from test/standalone/link_interdependent_static_c_libs/a.h rename to test/link/interdependent_static_c_libs/a.h diff --git a/test/standalone/link_interdependent_static_c_libs/b.c b/test/link/interdependent_static_c_libs/b.c similarity index 100% rename from test/standalone/link_interdependent_static_c_libs/b.c rename to test/link/interdependent_static_c_libs/b.c diff --git a/test/standalone/link_interdependent_static_c_libs/b.h b/test/link/interdependent_static_c_libs/b.h similarity index 100% rename from test/standalone/link_interdependent_static_c_libs/b.h rename to test/link/interdependent_static_c_libs/b.h diff --git a/test/standalone/link_interdependent_static_c_libs/build.zig b/test/link/interdependent_static_c_libs/build.zig similarity index 100% rename from test/standalone/link_interdependent_static_c_libs/build.zig rename to test/link/interdependent_static_c_libs/build.zig diff --git a/test/standalone/link_interdependent_static_c_libs/main.zig b/test/link/interdependent_static_c_libs/main.zig similarity index 100% rename from test/standalone/link_interdependent_static_c_libs/main.zig rename to test/link/interdependent_static_c_libs/main.zig diff --git a/test/standalone/objc/Foo.h b/test/link/objc/Foo.h similarity index 100% rename from test/standalone/objc/Foo.h rename to test/link/objc/Foo.h diff --git a/test/standalone/objc/Foo.m b/test/link/objc/Foo.m similarity index 100% rename from test/standalone/objc/Foo.m rename to test/link/objc/Foo.m diff --git a/test/standalone/objc/build.zig b/test/link/objc/build.zig similarity index 54% rename from test/standalone/objc/build.zig rename to test/link/objc/build.zig index 1b3a90f90f..e41fd48e71 100644 --- a/test/standalone/objc/build.zig +++ b/test/link/objc/build.zig @@ -1,19 +1,8 @@ const std = @import("std"); const Builder = std.build.Builder; -const CrossTarget = std.zig.CrossTarget; - -fn isRunnableTarget(t: CrossTarget) bool { - // TODO I think we might be able to run this on Linux via Darling. - // Add a check for that here, and return true if Darling is available. - if (t.isNative() and t.getOsTag() == .macos) - return true - else - return false; -} pub fn build(b: *Builder) void { const mode = b.standardReleaseOptions(); - const target = b.standardTargetOptions(.{}); const test_step = b.step("test", "Test the program"); @@ -23,14 +12,11 @@ pub fn build(b: *Builder) void { exe.addCSourceFile("Foo.m", &[0][]const u8{}); exe.addCSourceFile("test.m", &[0][]const u8{}); exe.setBuildMode(mode); - exe.setTarget(target); exe.linkLibC(); // TODO when we figure out how to ship framework stubs for cross-compilation, // populate paths to the sysroot here. exe.linkFramework("Foundation"); - if (isRunnableTarget(target)) { - const run_cmd = exe.run(); - test_step.dependOn(&run_cmd.step); - } + const run_cmd = exe.run(); + test_step.dependOn(&run_cmd.step); } diff --git a/test/standalone/objc/test.m b/test/link/objc/test.m similarity index 100% rename from test/standalone/objc/test.m rename to test/link/objc/test.m diff --git a/test/standalone/objcpp/Foo.h b/test/link/objcpp/Foo.h similarity index 100% rename from test/standalone/objcpp/Foo.h rename to test/link/objcpp/Foo.h diff --git a/test/standalone/objcpp/Foo.mm b/test/link/objcpp/Foo.mm similarity index 100% rename from test/standalone/objcpp/Foo.mm rename to test/link/objcpp/Foo.mm diff --git a/test/standalone/objcpp/build.zig b/test/link/objcpp/build.zig similarity index 54% rename from test/standalone/objcpp/build.zig rename to test/link/objcpp/build.zig index 688592793a..767578e225 100644 --- a/test/standalone/objcpp/build.zig +++ b/test/link/objcpp/build.zig @@ -1,19 +1,8 @@ const std = @import("std"); const Builder = std.build.Builder; -const CrossTarget = std.zig.CrossTarget; - -fn isRunnableTarget(t: CrossTarget) bool { - // TODO I think we might be able to run this on Linux via Darling. - // Add a check for that here, and return true if Darling is available. - if (t.isNative() and t.getOsTag() == .macos) - return true - else - return false; -} pub fn build(b: *Builder) void { const mode = b.standardReleaseOptions(); - const target = b.standardTargetOptions(.{}); const test_step = b.step("test", "Test the program"); @@ -23,14 +12,13 @@ pub fn build(b: *Builder) void { exe.addCSourceFile("Foo.mm", &[0][]const u8{}); exe.addCSourceFile("test.mm", &[0][]const u8{}); exe.setBuildMode(mode); - exe.setTarget(target); exe.linkLibCpp(); // TODO when we figure out how to ship framework stubs for cross-compilation, // populate paths to the sysroot here. exe.linkFramework("Foundation"); - if (isRunnableTarget(target)) { - const run_cmd = exe.run(); - test_step.dependOn(&run_cmd.step); - } + const run_cmd = exe.run(); + run_cmd.expectStdOutEqual("Hello from C++ and Zig"); + + test_step.dependOn(&run_cmd.step); } diff --git a/test/standalone/objcpp/test.mm b/test/link/objcpp/test.mm similarity index 100% rename from test/standalone/objcpp/test.mm rename to test/link/objcpp/test.mm diff --git a/test/standalone/link_static_lib_as_system_lib/a.c b/test/link/static_lib_as_system_lib/a.c similarity index 100% rename from test/standalone/link_static_lib_as_system_lib/a.c rename to test/link/static_lib_as_system_lib/a.c diff --git a/test/standalone/link_static_lib_as_system_lib/a.h b/test/link/static_lib_as_system_lib/a.h similarity index 100% rename from test/standalone/link_static_lib_as_system_lib/a.h rename to test/link/static_lib_as_system_lib/a.h diff --git a/test/standalone/link_static_lib_as_system_lib/build.zig b/test/link/static_lib_as_system_lib/build.zig similarity index 100% rename from test/standalone/link_static_lib_as_system_lib/build.zig rename to test/link/static_lib_as_system_lib/build.zig diff --git a/test/standalone/link_static_lib_as_system_lib/main.zig b/test/link/static_lib_as_system_lib/main.zig similarity index 100% rename from test/standalone/link_static_lib_as_system_lib/main.zig rename to test/link/static_lib_as_system_lib/main.zig diff --git a/test/link/tls/a.c b/test/link/tls/a.c new file mode 100644 index 0000000000..8602d02419 --- /dev/null +++ b/test/link/tls/a.c @@ -0,0 +1,5 @@ +_Thread_local int a; + +int getA() { + return a; +} diff --git a/test/standalone/link_import_tls_dylib/build.zig b/test/link/tls/build.zig similarity index 91% rename from test/standalone/link_import_tls_dylib/build.zig rename to test/link/tls/build.zig index 332173fbb6..ebf15ca439 100644 --- a/test/standalone/link_import_tls_dylib/build.zig +++ b/test/link/tls/build.zig @@ -6,10 +6,12 @@ pub fn build(b: *Builder) void { const lib = b.addSharedLibrary("a", null, b.version(1, 0, 0)); lib.setBuildMode(mode); lib.addCSourceFile("a.c", &.{}); + lib.linkLibC(); const test_exe = b.addTest("main.zig"); test_exe.setBuildMode(mode); test_exe.linkLibrary(lib); + test_exe.linkLibC(); const test_step = b.step("test", "Test it"); test_step.dependOn(&test_exe.step); diff --git a/test/link/tls/main.zig b/test/link/tls/main.zig new file mode 100644 index 0000000000..ab01616e31 --- /dev/null +++ b/test/link/tls/main.zig @@ -0,0 +1,15 @@ +const std = @import("std"); + +extern threadlocal var a: i32; +extern fn getA() i32; + +fn getA2() i32 { + return a; +} + +test { + a = 2; + try std.testing.expect(getA() == 2); + try std.testing.expect(2 == getA2()); + try std.testing.expect(getA() == getA2()); +} diff --git a/test/standalone.zig b/test/standalone.zig index c34f9467d6..92d0ea4aa3 100644 --- a/test/standalone.zig +++ b/test/standalone.zig @@ -13,31 +13,12 @@ pub fn addCases(cases: *tests.StandaloneContext) void { 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", .{}); - if (builtin.os.tag == .macos) { - // Zig's macOS linker does not yet support LTO for LLVM IR files: - // https://github.com/ziglang/zig/issues/8680 - cases.addBuildFile("test/standalone/mix_c_files/build.zig", .{ - .build_modes = false, - .cross_targets = true, - }); - } else { - cases.addBuildFile("test/standalone/mix_c_files/build.zig", .{ - .build_modes = true, - .cross_targets = true, - }); - } + cases.addBuildFile("test/standalone/mix_c_files/build.zig", .{ + .build_modes = true, + .cross_targets = true, + }); 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/link_common_symbols/build.zig", .{}); - cases.addBuildFile("test/standalone/link_frameworks/build.zig", .{ - .requires_macos_sdk = true, - }); - cases.addBuildFile("test/standalone/link_common_symbols_alignment/build.zig", .{}); - if (builtin.os.tag == .macos) { - cases.addBuildFile("test/standalone/link_import_tls_dylib/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", .{}); @@ -69,16 +50,6 @@ pub fn addCases(cases: *tests.StandaloneContext) void { if (builtin.os.tag == .linux) { cases.addBuildFile("test/standalone/pie/build.zig", .{}); } - // Try to build and run an Objective-C executable. - cases.addBuildFile("test/standalone/objc/build.zig", .{ - .build_modes = true, - .requires_macos_sdk = true, - }); - // Try to build and run an Objective-C++ executable. - cases.addBuildFile("test/standalone/objcpp/build.zig", .{ - .build_modes = true, - .requires_macos_sdk = true, - }); // Ensure the development tools are buildable. cases.add("tools/gen_spirv_spec.zig"); diff --git a/test/standalone/link_import_tls_dylib/a.c b/test/standalone/link_import_tls_dylib/a.c deleted file mode 100644 index 5c5aa5bae4..0000000000 --- a/test/standalone/link_import_tls_dylib/a.c +++ /dev/null @@ -1 +0,0 @@ -_Thread_local int a; diff --git a/test/standalone/link_import_tls_dylib/main.zig b/test/standalone/link_import_tls_dylib/main.zig deleted file mode 100644 index 354c6f545e..0000000000 --- a/test/standalone/link_import_tls_dylib/main.zig +++ /dev/null @@ -1,7 +0,0 @@ -const std = @import("std"); - -extern threadlocal var a: i32; - -test { - try std.testing.expect(a == 0); -} diff --git a/test/tests.zig b/test/tests.zig index 3666ef1028..8bc415d28b 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -21,6 +21,7 @@ const assemble_and_link = @import("assemble_and_link.zig"); const translate_c = @import("translate_c.zig"); const run_translated_c = @import("run_translated_c.zig"); const gen_h = @import("gen_h.zig"); +const link = @import("link.zig"); // Implementations pub const TranslateCContext = @import("src/translate_c.zig").TranslateCContext; @@ -479,6 +480,27 @@ pub fn addStandaloneTests( return cases.step; } +pub fn addLinkTests( + b: *build.Builder, + test_filter: ?[]const u8, + modes: []const Mode, + enable_macos_sdk: bool, +) *build.Step { + const cases = b.allocator.create(StandaloneContext) catch unreachable; + cases.* = StandaloneContext{ + .b = b, + .step = b.step("test-link", "Run the linker tests"), + .test_index = 0, + .test_filter = test_filter, + .modes = modes, + .skip_non_native = true, + .enable_macos_sdk = enable_macos_sdk, + .target = .{}, + }; + link.addCases(cases); + return cases.step; +} + pub fn addCliTests(b: *build.Builder, test_filter: ?[]const u8, modes: []const Mode) *build.Step { _ = test_filter; _ = modes;