master
 1const std = @import("std");
 2const builtin = @import("builtin");
 3const link = @import("link.zig");
 4
 5pub fn build(b: *std.Build) void {
 6    const step = b.step("test", "Run link test cases");
 7    b.default_step = step;
 8
 9    const enable_ios_sdk = b.option(bool, "enable_ios_sdk", "Run tests requiring presence of iOS SDK and frameworks") orelse false;
10    const enable_macos_sdk = b.option(bool, "enable_macos_sdk", "Run tests requiring presence of macOS SDK and frameworks") orelse enable_ios_sdk;
11    const enable_symlinks_windows = b.option(bool, "enable_symlinks_windows", "Run tests requiring presence of symlinks on Windows") orelse false;
12    const has_symlinks = builtin.os.tag != .windows or enable_symlinks_windows;
13
14    const build_opts: link.BuildOptions = .{
15        .has_ios_sdk = enable_ios_sdk,
16        .has_macos_sdk = enable_macos_sdk,
17        .has_symlinks = has_symlinks,
18    };
19    step.dependOn(@import("elf.zig").testAll(b, build_opts));
20    step.dependOn(@import("macho.zig").testAll(b, build_opts));
21
22    add_dep_steps: for (b.available_deps) |available_dep| {
23        const dep_name, const dep_hash = available_dep;
24
25        const all_pkgs = @import("root").dependencies.packages;
26        inline for (@typeInfo(all_pkgs).@"struct".decls) |decl| {
27            const pkg_hash = decl.name;
28            if (std.mem.eql(u8, dep_hash, pkg_hash)) {
29                const pkg = @field(all_pkgs, pkg_hash);
30                if (!@hasDecl(pkg, "build_zig")) {
31                    std.debug.panic("link test case '{s}' is missing a 'build.zig' file", .{dep_name});
32                }
33                const requires_ios_sdk = @hasDecl(pkg.build_zig, "requires_ios_sdk") and
34                    pkg.build_zig.requires_ios_sdk;
35                const requires_macos_sdk = @hasDecl(pkg.build_zig, "requires_macos_sdk") and
36                    pkg.build_zig.requires_macos_sdk;
37                const requires_symlinks = @hasDecl(pkg.build_zig, "requires_symlinks") and
38                    pkg.build_zig.requires_symlinks;
39                if ((requires_symlinks and !has_symlinks) or
40                    (requires_macos_sdk and !enable_macos_sdk) or
41                    (requires_ios_sdk and !enable_ios_sdk))
42                {
43                    continue :add_dep_steps;
44                }
45                break;
46            }
47        } else unreachable;
48
49        const dep = b.dependency(dep_name, .{});
50        const dep_step = dep.builder.default_step;
51        dep_step.name = b.fmt("link_test_cases.{s}", .{dep_name});
52        step.dependOn(dep_step);
53    }
54}