Commit e122cd6312

Andrew Kelley <andrew@ziglang.org>
2023-03-07 08:40:55
new linker test harness
It's simpler and it takes advantage of `std.Build.addAnonymousDependency`, which has a number of benefits, including concurrenc and preventing extra zig-cache and zig-out directories being created. 4 tests are ported over as an example.
1 parent 3b06990
Changed files (9)
test
link
bss
common_symbols
common_symbols_alignment
interdependent_static_c_libs
static_lib_as_system_lib
test/link/bss/build.zig
@@ -1,17 +1,17 @@
 const std = @import("std");
 
 pub fn build(b: *std.Build) void {
-    const optimize = b.standardOptimizeOption(.{});
     const test_step = b.step("test", "Test");
+    b.default_step = test_step;
 
     const exe = b.addExecutable(.{
         .name = "bss",
         .root_source_file = .{ .path = "main.zig" },
-        .optimize = optimize,
+        .optimize = .Debug,
     });
-    b.default_step.dependOn(&exe.step);
 
     const run = exe.run();
     run.expectStdOutEqual("0, 1, 0\n");
+
     test_step.dependOn(&run.step);
 }
test/link/bss/main.zig
@@ -1,7 +1,7 @@
 const std = @import("std");
 
 // Stress test zerofill layout
-var buffer: [0x1000000]u64 = undefined;
+var buffer: [0x1000000]u64 = [1]u64{0} ** 0x1000000;
 
 pub fn main() anyerror!void {
     buffer[0x10] = 1;
test/link/common_symbols/build.zig
@@ -1,8 +1,16 @@
 const std = @import("std");
 
 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 lib_a = b.addStaticLibrary(.{
         .name = "a",
         .optimize = optimize,
@@ -16,6 +24,5 @@ pub fn build(b: *std.Build) void {
     });
     test_exe.linkLibrary(lib_a);
 
-    const test_step = b.step("test", "Test it");
     test_step.dependOn(&test_exe.step);
 }
test/link/common_symbols_alignment/build.zig
@@ -1,23 +1,28 @@
 const std = @import("std");
 
 pub fn build(b: *std.Build) void {
-    const optimize = b.standardOptimizeOption(.{});
-    const target = b.standardTargetOptions(.{});
+    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_a = b.addStaticLibrary(.{
         .name = "a",
         .optimize = optimize,
-        .target = target,
+        .target = .{},
     });
     lib_a.addCSourceFiles(&.{"a.c"}, &.{"-fcommon"});
 
     const test_exe = b.addTest(.{
         .root_source_file = .{ .path = "main.zig" },
         .optimize = optimize,
-        .target = target,
     });
     test_exe.linkLibrary(lib_a);
 
-    const test_step = b.step("test", "Test it");
     test_step.dependOn(&test_exe.step);
 }
test/link/interdependent_static_c_libs/build.zig
@@ -1,13 +1,20 @@
 const std = @import("std");
 
 pub fn build(b: *std.Build) void {
-    const optimize = b.standardOptimizeOption(.{});
-    const target = b.standardTargetOptions(.{});
+    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_a = b.addStaticLibrary(.{
         .name = "a",
         .optimize = optimize,
-        .target = target,
+        .target = .{},
     });
     lib_a.addCSourceFile("a.c", &[_][]const u8{});
     lib_a.addIncludePath(".");
@@ -15,7 +22,7 @@ pub fn build(b: *std.Build) void {
     const lib_b = b.addStaticLibrary(.{
         .name = "b",
         .optimize = optimize,
-        .target = target,
+        .target = .{},
     });
     lib_b.addCSourceFile("b.c", &[_][]const u8{});
     lib_b.addIncludePath(".");
@@ -23,12 +30,10 @@ pub fn build(b: *std.Build) void {
     const test_exe = b.addTest(.{
         .root_source_file = .{ .path = "main.zig" },
         .optimize = optimize,
-        .target = target,
     });
     test_exe.linkLibrary(lib_a);
     test_exe.linkLibrary(lib_b);
     test_exe.addIncludePath(".");
 
-    const test_step = b.step("test", "Test it");
     test_step.dependOn(&test_exe.step);
 }
test/link/static_lib_as_system_lib/build.zig
@@ -1,13 +1,20 @@
 const std = @import("std");
 
 pub fn build(b: *std.Build) void {
-    const optimize = b.standardOptimizeOption(.{});
-    const target = b.standardTargetOptions(.{});
+    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_a = b.addStaticLibrary(.{
         .name = "a",
         .optimize = optimize,
-        .target = target,
+        .target = .{},
     });
     lib_a.addCSourceFile("a.c", &[_][]const u8{});
     lib_a.addIncludePath(".");
@@ -16,14 +23,12 @@ pub fn build(b: *std.Build) void {
     const test_exe = b.addTest(.{
         .root_source_file = .{ .path = "main.zig" },
         .optimize = optimize,
-        .target = target,
+        .target = .{},
     });
     test_exe.linkSystemLibrary("a"); // force linking liba.a as -la
     test_exe.addSystemIncludePath(".");
-    const search_path = std.fs.path.join(b.allocator, &[_][]const u8{ b.install_path, "lib" }) catch unreachable;
+    const search_path = std.fs.path.join(b.allocator, &[_][]const u8{ b.install_path, "lib" }) catch @panic("OOM");
     test_exe.addLibraryPath(search_path);
 
-    const test_step = b.step("test", "Test it");
-    test_step.dependOn(b.getInstallStep());
     test_step.dependOn(&test_exe.step);
 }
test/link.zig
@@ -1,213 +1,220 @@
+pub const Case = struct {
+    build_root: []const u8,
+    import: type,
+};
+
+pub const cases = [_]Case{
+    .{
+        .build_root = "test/link/bss",
+        .import = @import("link/bss/build.zig"),
+    },
+    .{
+        .build_root = "test/link/common_symbols",
+        .import = @import("link/common_symbols/build.zig"),
+    },
+    .{
+        .build_root = "test/link/common_symbols_alignment",
+        .import = @import("link/common_symbols_alignment/build.zig"),
+    },
+    .{
+        .build_root = "test/link/interdependent_static_c_libs",
+        .import = @import("link/interdependent_static_c_libs/build.zig"),
+    },
+    //.{
+    //    .build_root = "test/link/static_lib_as_system_lib",
+    //    .import = @import("link/static_lib_as_system_lib/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,
+//    });
+//}
+
 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/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,
-    });
-
-    addWasmCases(cases);
-    addMachOCases(cases);
-}
-
-fn addWasmCases(cases: *tests.StandaloneContext) 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,
-    });
-}
test/tests.zig
@@ -1,16 +1,9 @@
 const std = @import("std");
 const builtin = @import("builtin");
-const debug = std.debug;
+const assert = std.debug.assert;
 const CrossTarget = std.zig.CrossTarget;
-const io = std.io;
-const fs = std.fs;
 const mem = std.mem;
-const fmt = std.fmt;
-const ArrayList = std.ArrayList;
 const OptimizeMode = std.builtin.OptimizeMode;
-const CompileStep = std.Build.CompileStep;
-const Allocator = mem.Allocator;
-const ExecError = std.Build.ExecError;
 const Step = std.Build.Step;
 
 // Cases
@@ -574,15 +567,10 @@ pub fn addStandaloneTests(
     enable_macos_sdk: bool,
     target: std.zig.CrossTarget,
     omit_stage2: bool,
-    enable_darling: bool,
-    enable_qemu: bool,
-    enable_rosetta: bool,
-    enable_wasmtime: bool,
-    enable_wine: bool,
     enable_symlinks_windows: bool,
 ) *Step {
     const cases = b.allocator.create(StandaloneContext) catch @panic("OOM");
-    cases.* = StandaloneContext{
+    cases.* = .{
         .b = b,
         .step = b.step("test-standalone", "Run the standalone tests"),
         .test_index = 0,
@@ -592,11 +580,6 @@ pub fn addStandaloneTests(
         .enable_macos_sdk = enable_macos_sdk,
         .target = target,
         .omit_stage2 = omit_stage2,
-        .enable_darling = enable_darling,
-        .enable_qemu = enable_qemu,
-        .enable_rosetta = enable_rosetta,
-        .enable_wasmtime = enable_wasmtime,
-        .enable_wine = enable_wine,
         .enable_symlinks_windows = enable_symlinks_windows,
     };
 
@@ -613,21 +596,24 @@ pub fn addLinkTests(
     omit_stage2: bool,
     enable_symlinks_windows: bool,
 ) *Step {
-    const cases = b.allocator.create(StandaloneContext) catch @panic("OOM");
-    cases.* = StandaloneContext{
-        .b = b,
-        .step = b.step("test-link", "Run the linker tests"),
-        .test_index = 0,
-        .test_filter = test_filter,
-        .optimize_modes = optimize_modes,
-        .skip_non_native = true,
-        .enable_macos_sdk = enable_macos_sdk,
-        .target = .{},
-        .omit_stage2 = omit_stage2,
-        .enable_symlinks_windows = enable_symlinks_windows,
-    };
-    link.addCases(cases);
-    return cases.step;
+    _ = 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);
+    }
+
+    return step;
 }
 
 pub fn addCliTests(b: *std.Build, test_filter: ?[]const u8, optimize_modes: []const OptimizeMode) *Step {
@@ -761,7 +747,7 @@ pub fn addCliTests(b: *std.Build, test_filter: ?[]const u8, optimize_modes: []co
         const unformatted_code = "    // no reason for indent";
         const s = std.fs.path.sep_str;
 
-        var dir = fs.cwd().openDir(tmp_path, .{}) catch @panic("unhandled");
+        var dir = std.fs.cwd().openDir(tmp_path, .{}) catch @panic("unhandled");
         defer dir.close();
         dir.writeFile("fmt1.zig", unformatted_code) catch @panic("unhandled");
         dir.writeFile("fmt2.zig", unformatted_code) catch @panic("unhandled");
@@ -791,7 +777,7 @@ pub fn addCliTests(b: *std.Build, test_filter: ?[]const u8, optimize_modes: []co
         run3.step.dependOn(&run2.step);
 
         const unformatted_code_utf16 = "\xff\xfe \x00 \x00 \x00 \x00/\x00/\x00 \x00n\x00o\x00 \x00r\x00e\x00a\x00s\x00o\x00n\x00";
-        const fmt4_path = fs.path.join(b.allocator, &.{ tmp_path, "fmt4.zig" }) catch @panic("OOM");
+        const fmt4_path = std.fs.path.join(b.allocator, &.{ tmp_path, "fmt4.zig" }) catch @panic("OOM");
         const write4 = b.addWriteFiles();
         write4.addBytesToSource(unformatted_code_utf16, fmt4_path);
         write4.step.dependOn(&run3.step);
build.zig
@@ -442,8 +442,6 @@ pub fn build(b: *std.Build) !void {
         .skip_stage2 = true, // TODO get all these passing
     }));
 
-    _ = enable_symlinks_windows;
-    _ = enable_macos_sdk;
     test_step.dependOn(tests.addCompareOutputTests(b, test_filter, optimization_modes));
     //test_step.dependOn(tests.addStandaloneTests(
     //    b,
@@ -453,15 +451,10 @@ pub fn build(b: *std.Build) !void {
     //    enable_macos_sdk,
     //    target,
     //    skip_stage2_tests,
-    //    b.enable_darling,
-    //    b.enable_qemu,
-    //    b.enable_rosetta,
-    //    b.enable_wasmtime,
-    //    b.enable_wine,
     //    enable_symlinks_windows,
     //));
     test_step.dependOn(tests.addCAbiTests(b, skip_non_native, skip_release));
-    //test_step.dependOn(tests.addLinkTests(b, test_filter, optimization_modes, enable_macos_sdk, skip_stage2_tests, enable_symlinks_windows));
+    test_step.dependOn(tests.addLinkTests(b, test_filter, optimization_modes, enable_macos_sdk, skip_stage2_tests, enable_symlinks_windows));
     test_step.dependOn(tests.addStackTraceTests(b, test_filter, optimization_modes));
     test_step.dependOn(tests.addCliTests(b, test_filter, optimization_modes));
     test_step.dependOn(tests.addAssembleAndLinkTests(b, test_filter, optimization_modes));