Commit cdf0a2af58

Andrew Kelley <andrew@ziglang.org>
2023-03-08 01:00:35
re-enable wasm linker tests
1 parent f558c83
Changed files (15)
test
link
wasm
archive
basic-features
bss
export
export-data
extern
extern-mangle
function-table
infer-features
producers
segments
stack_pointer
type
test/link/wasm/archive/build.zig
@@ -1,15 +1,24 @@
 const std = @import("std");
 
+pub const requires_stage2 = true;
+
 pub fn build(b: *std.Build) void {
-    const test_step = b.step("test", "Test");
-    test_step.dependOn(b.getInstallStep());
+    const test_step = b.step("test", "Test it");
+    b.default_step = test_step;
+
+    add(b, test_step, .Debug);
+    add(b, test_step, .ReleaseFast);
+    add(b, test_step, .ReleaseSmall);
+    add(b, test_step, .ReleaseSafe);
+}
 
+fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.OptimizeMode) void {
     // The code in question will pull-in compiler-rt,
     // and therefore link with its archive file.
     const lib = b.addSharedLibrary(.{
         .name = "main",
         .root_source_file = .{ .path = "main.zig" },
-        .optimize = b.standardOptimizeOption(.{}),
+        .optimize = optimize,
         .target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
     });
     lib.use_llvm = false;
test/link/wasm/basic-features/build.zig
@@ -1,11 +1,13 @@
 const std = @import("std");
 
+pub const requires_stage2 = true;
+
 pub fn build(b: *std.Build) void {
     // Library with explicitly set cpu features
     const lib = b.addSharedLibrary(.{
         .name = "lib",
         .root_source_file = .{ .path = "main.zig" },
-        .optimize = b.standardOptimizeOption(.{}),
+        .optimize = .Debug,
         .target = .{
             .cpu_arch = .wasm32,
             .cpu_model = .{ .explicit = &std.Target.wasm.cpu.mvp },
@@ -24,4 +26,5 @@ pub fn build(b: *std.Build) void {
 
     const test_step = b.step("test", "Run linker test");
     test_step.dependOn(&check.step);
+    b.default_step = test_step;
 }
test/link/wasm/bss/build.zig
@@ -1,14 +1,16 @@
 const std = @import("std");
 
+pub const requires_stage2 = true;
+
 pub fn build(b: *std.Build) void {
     const test_step = b.step("test", "Test");
-    test_step.dependOn(b.getInstallStep());
+    b.default_step = test_step;
 
     const lib = b.addSharedLibrary(.{
         .name = "lib",
         .root_source_file = .{ .path = "lib.zig" },
         .target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
-        .optimize = b.standardOptimizeOption(.{}),
+        .optimize = .Debug,
     });
     lib.use_llvm = false;
     lib.use_lld = false;
@@ -36,5 +38,6 @@ pub fn build(b: *std.Build) void {
     check_lib.checkNext("name .rodata");
     check_lib.checkNext("index 1"); // bss section always last
     check_lib.checkNext("name .bss");
+
     test_step.dependOn(&check_lib.step);
 }
test/link/wasm/export/build.zig
@@ -1,8 +1,18 @@
 const std = @import("std");
 
+pub const requires_stage2 = true;
+
 pub fn build(b: *std.Build) void {
-    const optimize = b.standardOptimizeOption(.{});
+    const test_step = b.step("test", "Test it");
+    b.default_step = test_step;
+
+    add(b, test_step, .Debug);
+    add(b, test_step, .ReleaseFast);
+    add(b, test_step, .ReleaseSmall);
+    add(b, test_step, .ReleaseSafe);
+}
 
+fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.OptimizeMode) void {
     const no_export = b.addSharedLibrary(.{
         .name = "no-export",
         .root_source_file = .{ .path = "main.zig" },
@@ -50,7 +60,6 @@ pub fn build(b: *std.Build) void {
     check_force_export.checkNext("name foo");
     check_force_export.checkNext("kind function");
 
-    const test_step = b.step("test", "Run linker test");
     test_step.dependOn(&check_no_export.step);
     test_step.dependOn(&check_dynamic_export.step);
     test_step.dependOn(&check_force_export.step);
test/link/wasm/export-data/build.zig
@@ -2,7 +2,12 @@ const std = @import("std");
 
 pub fn build(b: *std.Build) void {
     const test_step = b.step("test", "Test");
-    test_step.dependOn(b.getInstallStep());
+    b.default_step = test_step;
+
+    if (@import("builtin").os.tag == .windows) {
+        // TODO: Fix open handle in wasm-linker refraining rename from working on Windows.
+        return;
+    }
 
     const lib = b.addSharedLibrary(.{
         .name = "lib",
test/link/wasm/extern/build.zig
@@ -1,10 +1,22 @@
 const std = @import("std");
 
+pub const requires_stage2 = true;
+
 pub fn build(b: *std.Build) void {
+    const test_step = b.step("test", "Test it");
+    b.default_step = test_step;
+
+    add(b, test_step, .Debug);
+    add(b, test_step, .ReleaseFast);
+    add(b, test_step, .ReleaseSmall);
+    add(b, test_step, .ReleaseSafe);
+}
+
+fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.OptimizeMode) void {
     const exe = b.addExecutable(.{
         .name = "extern",
         .root_source_file = .{ .path = "main.zig" },
-        .optimize = b.standardOptimizeOption(.{}),
+        .optimize = optimize,
         .target = .{ .cpu_arch = .wasm32, .os_tag = .wasi },
     });
     exe.addCSourceFile("foo.c", &.{});
@@ -15,6 +27,5 @@ pub fn build(b: *std.Build) void {
     run.skip_foreign_checks = true;
     run.expectStdOutEqual("Result: 30");
 
-    const test_step = b.step("test", "Run linker test");
     test_step.dependOn(&run.step);
 }
test/link/wasm/extern-mangle/build.zig
@@ -1,18 +1,24 @@
 const std = @import("std");
 
 pub fn build(b: *std.Build) void {
-    const test_step = b.step("test", "Test");
-    test_step.dependOn(b.getInstallStep());
+    const test_step = b.step("test", "Test it");
+    b.default_step = test_step;
 
+    add(b, test_step, .Debug);
+    add(b, test_step, .ReleaseFast);
+    add(b, test_step, .ReleaseSmall);
+    add(b, test_step, .ReleaseSafe);
+}
+
+fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.OptimizeMode) void {
     const lib = b.addSharedLibrary(.{
         .name = "lib",
         .root_source_file = .{ .path = "lib.zig" },
         .target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
-        .optimize = b.standardOptimizeOption(.{}),
+        .optimize = optimize,
     });
     lib.import_symbols = true; // import `a` and `b`
     lib.rdynamic = true; // export `foo`
-    lib.install();
 
     const check_lib = lib.checkObject(.wasm);
     check_lib.checkStart("Section import");
test/link/wasm/function-table/build.zig
@@ -1,13 +1,20 @@
 const std = @import("std");
 
+pub const requires_stage2 = true;
+
 pub fn build(b: *std.Build) void {
-    const optimize = b.standardOptimizeOption(.{});
+    const test_step = b.step("test", "Test it");
+    b.default_step = test_step;
 
-    const test_step = b.step("test", "Test");
-    test_step.dependOn(b.getInstallStep());
+    add(b, test_step, .Debug);
+    add(b, test_step, .ReleaseFast);
+    add(b, test_step, .ReleaseSmall);
+    add(b, test_step, .ReleaseSafe);
+}
 
+fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.OptimizeMode) void {
     const import_table = b.addSharedLibrary(.{
-        .name = "lib",
+        .name = "import_table",
         .root_source_file = .{ .path = "lib.zig" },
         .target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
         .optimize = optimize,
@@ -17,7 +24,7 @@ pub fn build(b: *std.Build) void {
     import_table.import_table = true;
 
     const export_table = b.addSharedLibrary(.{
-        .name = "lib",
+        .name = "export_table",
         .root_source_file = .{ .path = "lib.zig" },
         .target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
         .optimize = optimize,
@@ -27,7 +34,7 @@ pub fn build(b: *std.Build) void {
     export_table.export_table = true;
 
     const regular_table = b.addSharedLibrary(.{
-        .name = "lib",
+        .name = "regular_table",
         .root_source_file = .{ .path = "lib.zig" },
         .target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
         .optimize = optimize,
test/link/wasm/infer-features/build.zig
@@ -1,12 +1,12 @@
 const std = @import("std");
 
-pub fn build(b: *std.Build) void {
-    const optimize = b.standardOptimizeOption(.{});
+pub const requires_stage2 = true;
 
+pub fn build(b: *std.Build) void {
     // Wasm Object file which we will use to infer the features from
     const c_obj = b.addObject(.{
         .name = "c_obj",
-        .optimize = optimize,
+        .optimize = .Debug,
         .target = .{
             .cpu_arch = .wasm32,
             .cpu_model = .{ .explicit = &std.Target.wasm.cpu.bleeding_edge },
@@ -20,7 +20,7 @@ pub fn build(b: *std.Build) void {
     const lib = b.addSharedLibrary(.{
         .name = "lib",
         .root_source_file = .{ .path = "main.zig" },
-        .optimize = optimize,
+        .optimize = .Debug,
         .target = .{
             .cpu_arch = .wasm32,
             .cpu_model = .{ .explicit = &std.Target.wasm.cpu.mvp },
@@ -45,4 +45,5 @@ pub fn build(b: *std.Build) void {
 
     const test_step = b.step("test", "Run linker test");
     test_step.dependOn(&check.step);
+    b.default_step = test_step;
 }
test/link/wasm/producers/build.zig
@@ -1,24 +1,31 @@
 const std = @import("std");
 const builtin = @import("builtin");
 
+pub const requires_stage2 = true;
+
 pub fn build(b: *std.Build) void {
-    const test_step = b.step("test", "Test");
-    test_step.dependOn(b.getInstallStep());
+    const test_step = b.step("test", "Test it");
+    b.default_step = test_step;
+
+    add(b, test_step, .Debug);
+    add(b, test_step, .ReleaseFast);
+    add(b, test_step, .ReleaseSmall);
+    add(b, test_step, .ReleaseSafe);
+}
 
+fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.OptimizeMode) void {
     const lib = b.addSharedLibrary(.{
         .name = "lib",
         .root_source_file = .{ .path = "lib.zig" },
         .target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
-        .optimize = b.standardOptimizeOption(.{}),
+        .optimize = optimize,
     });
     lib.use_llvm = false;
     lib.use_lld = false;
     lib.strip = false;
     lib.install();
 
-    const zig_version = builtin.zig_version;
-    var version_buf: [100]u8 = undefined;
-    const version_fmt = std.fmt.bufPrint(&version_buf, "version {}", .{zig_version}) catch unreachable;
+    const version_fmt = "version " ++ builtin.zig_version_string;
 
     const check_lib = lib.checkObject(.wasm);
     check_lib.checkStart("name producers");
test/link/wasm/segments/build.zig
@@ -1,14 +1,23 @@
 const std = @import("std");
 
+pub const requires_stage2 = true;
+
 pub fn build(b: *std.Build) void {
-    const test_step = b.step("test", "Test");
-    test_step.dependOn(b.getInstallStep());
+    const test_step = b.step("test", "Test it");
+    b.default_step = test_step;
+
+    add(b, test_step, .Debug);
+    add(b, test_step, .ReleaseFast);
+    add(b, test_step, .ReleaseSmall);
+    add(b, test_step, .ReleaseSafe);
+}
 
+fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.OptimizeMode) void {
     const lib = b.addSharedLibrary(.{
         .name = "lib",
         .root_source_file = .{ .path = "lib.zig" },
         .target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
-        .optimize = b.standardOptimizeOption(.{}),
+        .optimize = optimize,
     });
     lib.use_llvm = false;
     lib.use_lld = false;
test/link/wasm/stack_pointer/build.zig
@@ -1,14 +1,23 @@
 const std = @import("std");
 
+pub const requires_stage2 = true;
+
 pub fn build(b: *std.Build) void {
-    const test_step = b.step("test", "Test");
-    test_step.dependOn(b.getInstallStep());
+    const test_step = b.step("test", "Test it");
+    b.default_step = test_step;
+
+    add(b, test_step, .Debug);
+    add(b, test_step, .ReleaseFast);
+    add(b, test_step, .ReleaseSmall);
+    add(b, test_step, .ReleaseSafe);
+}
 
+fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.OptimizeMode) void {
     const lib = b.addSharedLibrary(.{
         .name = "lib",
         .root_source_file = .{ .path = "lib.zig" },
         .target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
-        .optimize = b.standardOptimizeOption(.{}),
+        .optimize = optimize,
     });
     lib.use_llvm = false;
     lib.use_lld = false;
test/link/wasm/type/build.zig
@@ -1,14 +1,23 @@
 const std = @import("std");
 
+pub const requires_stage2 = true;
+
 pub fn build(b: *std.Build) void {
-    const test_step = b.step("test", "Test");
-    test_step.dependOn(b.getInstallStep());
+    const test_step = b.step("test", "Test it");
+    b.default_step = test_step;
+
+    add(b, test_step, .Debug);
+    add(b, test_step, .ReleaseFast);
+    add(b, test_step, .ReleaseSmall);
+    add(b, test_step, .ReleaseSafe);
+}
 
+fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.OptimizeMode) void {
     const lib = b.addSharedLibrary(.{
         .name = "lib",
         .root_source_file = .{ .path = "lib.zig" },
         .target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
-        .optimize = b.standardOptimizeOption(.{}),
+        .optimize = optimize,
     });
     lib.use_llvm = false;
     lib.use_lld = false;
test/link.zig
@@ -20,197 +20,179 @@ pub const cases = [_]Case{
         .build_root = "test/link/interdependent_static_c_libs",
         .import = @import("link/interdependent_static_c_libs/build.zig"),
     },
-};
 
-//pub fn addCases(cases: *Standalone) void {
-//    addWasmCases(cases);
-//    addMachOCases(cases);
-//}
-//
-//fn addWasmCases(cases: *Standalone) void {
-//    cases.addBuildFile("test/link/wasm/archive/build.zig", .{
-//        .build_modes = true,
-//        .requires_stage2 = true,
-//    });
-//
-//    cases.addBuildFile("test/link/wasm/basic-features/build.zig", .{
-//        .requires_stage2 = true,
-//    });
-//
-//    cases.addBuildFile("test/link/wasm/bss/build.zig", .{
-//        .build_modes = false,
-//        .requires_stage2 = true,
-//    });
-//
-//    cases.addBuildFile("test/link/wasm/export/build.zig", .{
-//        .build_modes = true,
-//        .requires_stage2 = true,
-//    });
-//
-//    // TODO: Fix open handle in wasm-linker refraining rename from working on Windows.
-//    if (builtin.os.tag != .windows) {
-//        cases.addBuildFile("test/link/wasm/export-data/build.zig", .{});
-//    }
-//
-//    cases.addBuildFile("test/link/wasm/extern/build.zig", .{
-//        .build_modes = true,
-//        .requires_stage2 = true,
-//        .use_emulation = true,
-//    });
-//
-//    cases.addBuildFile("test/link/wasm/extern-mangle/build.zig", .{
-//        .build_modes = true,
-//        .requires_stage2 = true,
-//    });
-//
-//    cases.addBuildFile("test/link/wasm/function-table/build.zig", .{
-//        .build_modes = true,
-//        .requires_stage2 = true,
-//    });
-//
-//    cases.addBuildFile("test/link/wasm/infer-features/build.zig", .{
-//        .requires_stage2 = true,
-//    });
-//
-//    cases.addBuildFile("test/link/wasm/producers/build.zig", .{
-//        .build_modes = true,
-//        .requires_stage2 = true,
-//    });
-//
-//    cases.addBuildFile("test/link/wasm/segments/build.zig", .{
-//        .build_modes = true,
-//        .requires_stage2 = true,
-//    });
-//
-//    cases.addBuildFile("test/link/wasm/stack_pointer/build.zig", .{
-//        .build_modes = true,
-//        .requires_stage2 = true,
-//    });
-//
-//    cases.addBuildFile("test/link/wasm/type/build.zig", .{
-//        .build_modes = true,
-//        .requires_stage2 = true,
-//    });
-//}
-//
-//fn addMachOCases(cases: *tests.StandaloneContext) void {
-//    cases.addBuildFile("test/link/macho/bugs/13056/build.zig", .{
-//        .build_modes = true,
-//        .requires_macos_sdk = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/bugs/13457/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/dead_strip/build.zig", .{
-//        .build_modes = false,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/dead_strip_dylibs/build.zig", .{
-//        .build_modes = true,
-//        .requires_macos_sdk = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/dylib/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/empty/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/entry/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/headerpad/build.zig", .{
-//        .build_modes = true,
-//        .requires_macos_sdk = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/linksection/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/needed_framework/build.zig", .{
-//        .build_modes = true,
-//        .requires_macos_sdk = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/needed_library/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/objc/build.zig", .{
-//        .build_modes = true,
-//        .requires_macos_sdk = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/objcpp/build.zig", .{
-//        .build_modes = true,
-//        .requires_macos_sdk = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/pagezero/build.zig", .{
-//        .build_modes = false,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/search_strategy/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/stack_size/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/strict_validation/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/tls/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/unwind_info/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/uuid/build.zig", .{
-//        .build_modes = false,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/weak_library/build.zig", .{
-//        .build_modes = true,
-//        .requires_symlinks = true,
-//    });
-//
-//    cases.addBuildFile("test/link/macho/weak_framework/build.zig", .{
-//        .build_modes = true,
-//        .requires_macos_sdk = true,
-//        .requires_symlinks = true,
-//    });
-//}
+    // WASM Cases
+    .{
+        .build_root = "test/link/wasm/archive",
+        .import = @import("link/wasm/archive/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/basic-features",
+        .import = @import("link/wasm/basic-features/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/bss",
+        .import = @import("link/wasm/bss/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/export",
+        .import = @import("link/wasm/export/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/export-data",
+        .import = @import("link/wasm/export-data/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/extern",
+        .import = @import("link/wasm/extern/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/extern-mangle",
+        .import = @import("link/wasm/extern-mangle/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/function-table",
+        .import = @import("link/wasm/function-table/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/infer-features",
+        .import = @import("link/wasm/infer-features/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/producers",
+        .import = @import("link/wasm/producers/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/segments",
+        .import = @import("link/wasm/segments/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/stack_pointer",
+        .import = @import("link/wasm/stack_pointer/build.zig"),
+    },
+    .{
+        .build_root = "test/link/wasm/type",
+        .import = @import("link/wasm/type/build.zig"),
+    },
+
+    // Mach-O Cases
+    //    cases.addBuildFile("test/link/macho/bugs/13056/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_macos_sdk = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/bugs/13457/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/dead_strip/build.zig", .{
+    //        .build_modes = false,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/dead_strip_dylibs/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_macos_sdk = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/dylib/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/empty/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/entry/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/headerpad/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_macos_sdk = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/linksection/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/needed_framework/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_macos_sdk = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/needed_library/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/objc/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_macos_sdk = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/objcpp/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_macos_sdk = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/pagezero/build.zig", .{
+    //        .build_modes = false,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/search_strategy/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/stack_size/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/strict_validation/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/tls/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/unwind_info/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/uuid/build.zig", .{
+    //        .build_modes = false,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/weak_library/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_symlinks = true,
+    //    });
+    //
+    //    cases.addBuildFile("test/link/macho/weak_framework/build.zig", .{
+    //        .build_modes = true,
+    //        .requires_macos_sdk = true,
+    //        .requires_symlinks = true,
+    //    });
+};
 
 const std = @import("std");
 const builtin = @import("builtin");
test/tests.zig
@@ -599,18 +599,21 @@ pub fn addLinkTests(
     _ = test_filter;
     _ = optimize_modes;
     _ = enable_macos_sdk;
-    _ = omit_stage2;
     _ = enable_symlinks_windows;
 
     const step = b.step("test-link", "Run the linker tests");
 
     inline for (link.cases) |link_test| {
-        const dep = b.anonymousDependency(link_test.build_root, link_test.import, .{});
-        const dep_step = dep.builder.default_step;
-        assert(mem.startsWith(u8, dep.builder.dep_prefix, "test."));
-        const dep_prefix_adjusted = dep.builder.dep_prefix["test.".len..];
-        dep_step.name = b.fmt("{s}{s}", .{ dep_prefix_adjusted, dep_step.name });
-        step.dependOn(dep_step);
+        const requires_stage2 = @hasDecl(link_test.import, "requires_stage2") and
+            link_test.import.requires_stage2;
+        if (!requires_stage2 or !omit_stage2) {
+            const dep = b.anonymousDependency(link_test.build_root, link_test.import, .{});
+            const dep_step = dep.builder.default_step;
+            assert(mem.startsWith(u8, dep.builder.dep_prefix, "test."));
+            const dep_prefix_adjusted = dep.builder.dep_prefix["test.".len..];
+            dep_step.name = b.fmt("{s}{s}", .{ dep_prefix_adjusted, dep_step.name });
+            step.dependOn(dep_step);
+        }
     }
 
     return step;