master
  1const std = @import("std");
  2const builtin = @import("builtin");
  3
  4pub fn build(b: *std.Build) void {
  5    const step = b.step("test", "Run standalone test cases");
  6    b.default_step = step;
  7
  8    const enable_ios_sdk = b.option(bool, "enable_ios_sdk", "Run tests requiring presence of iOS SDK and frameworks") orelse false;
  9    const enable_macos_sdk = b.option(bool, "enable_macos_sdk", "Run tests requiring presence of macOS SDK and frameworks") orelse enable_ios_sdk;
 10    const enable_symlinks_windows = b.option(bool, "enable_symlinks_windows", "Run tests requiring presence of symlinks on Windows") orelse false;
 11    const omit_symlinks = builtin.os.tag == .windows and !enable_symlinks_windows;
 12
 13    const simple_skip_debug = b.option(bool, "simple_skip_debug", "Simple tests skip debug builds") orelse false;
 14    const simple_skip_release_safe = b.option(bool, "simple_skip_release_safe", "Simple tests skip release-safe builds") orelse false;
 15    const simple_skip_release_fast = b.option(bool, "simple_skip_release_fast", "Simple tests skip release-fast builds") orelse false;
 16    const simple_skip_release_small = b.option(bool, "simple_skip_release_small", "Simple tests skip release-small builds") orelse false;
 17
 18    const simple_dep = b.dependency("simple", .{
 19        .skip_debug = simple_skip_debug,
 20        .skip_release_safe = simple_skip_release_safe,
 21        .skip_release_fast = simple_skip_release_fast,
 22        .skip_release_small = simple_skip_release_small,
 23    });
 24    const simple_dep_step = simple_dep.builder.default_step;
 25    simple_dep_step.name = "standalone_test_cases.simple";
 26    step.dependOn(simple_dep_step);
 27
 28    // Ensure the development tools are buildable.
 29    const tools_tests_step = b.step("standalone_test_cases.tools", "Test tools");
 30    step.dependOn(tools_tests_step);
 31    const tools_target = b.resolveTargetQuery(.{});
 32    for ([_][]const u8{
 33        // Alphabetically sorted. No need to build `tools/spirv/grammar.zig`.
 34        "../../tools/dump-cov.zig",
 35        "../../tools/fetch_them_macos_headers.zig",
 36        "../../tools/gen_macos_headers_c.zig",
 37        "../../tools/gen_outline_atomics.zig",
 38        "../../tools/gen_spirv_spec.zig",
 39        "../../tools/gen_stubs.zig",
 40        "../../tools/generate_c_size_and_align_checks.zig",
 41        "../../tools/generate_JSONTestSuite.zig",
 42        "../../tools/generate_linux_syscalls.zig",
 43        "../../tools/process_headers.zig",
 44        "../../tools/migrate_langref.zig",
 45        "../../tools/update-linux-headers.zig",
 46        "../../tools/update_clang_options.zig",
 47        "../../tools/update_cpu_features.zig",
 48        "../../tools/update_crc_catalog.zig",
 49        "../../tools/update_freebsd_libc.zig",
 50        "../../tools/update_glibc.zig",
 51        "../../tools/update_mingw.zig",
 52        "../../tools/update_netbsd_libc.zig",
 53    }) |tool_src_path| {
 54        if (std.mem.endsWith(u8, tool_src_path, "dump-cov.zig") and tools_target.result.os.tag == .windows) continue;
 55
 56        const tool = b.addExecutable(.{
 57            .name = std.fs.path.stem(tool_src_path),
 58            .root_module = b.createModule(.{
 59                .root_source_file = b.path(tool_src_path),
 60                .target = tools_target,
 61            }),
 62        });
 63        tools_tests_step.dependOn(&tool.step);
 64    }
 65    for ([_][]const u8{
 66        // Alphabetically sorted. Only ones with `test` blocks.
 67        "../../tools/doctest.zig",
 68    }) |tool_src_path| {
 69        const tool = b.addTest(.{
 70            .name = std.fs.path.stem(tool_src_path),
 71            .root_module = b.createModule(.{
 72                .root_source_file = b.path(tool_src_path),
 73                .target = tools_target,
 74            }),
 75        });
 76        const run = b.addRunArtifact(tool);
 77        tools_tests_step.dependOn(&run.step);
 78    }
 79
 80    add_dep_steps: for (b.available_deps) |available_dep| {
 81        const dep_name, const dep_hash = available_dep;
 82
 83        // The 'simple' dependency was already handled manually above.
 84        if (std.mem.eql(u8, dep_name, "simple")) continue;
 85
 86        const all_pkgs = @import("root").dependencies.packages;
 87        inline for (@typeInfo(all_pkgs).@"struct".decls) |decl| {
 88            const pkg_hash = decl.name;
 89            if (std.mem.eql(u8, dep_hash, pkg_hash)) {
 90                const pkg = @field(all_pkgs, pkg_hash);
 91                if (!@hasDecl(pkg, "build_zig")) {
 92                    std.debug.panic("standalone test case '{s}' is missing a 'build.zig' file", .{dep_name});
 93                }
 94                const requires_ios_sdk = @hasDecl(pkg.build_zig, "requires_ios_sdk") and
 95                    pkg.build_zig.requires_ios_sdk;
 96                const requires_macos_sdk = @hasDecl(pkg.build_zig, "requires_macos_sdk") and
 97                    pkg.build_zig.requires_macos_sdk;
 98                const requires_symlinks = @hasDecl(pkg.build_zig, "requires_symlinks") and
 99                    pkg.build_zig.requires_symlinks;
100                if ((requires_symlinks and omit_symlinks) or
101                    (requires_macos_sdk and !enable_macos_sdk) or
102                    (requires_ios_sdk and !enable_ios_sdk))
103                {
104                    continue :add_dep_steps;
105                }
106                break;
107            }
108        } else unreachable;
109
110        const dep = b.dependency(dep_name, .{});
111        const dep_step = dep.builder.default_step;
112        dep_step.name = b.fmt("standalone_test_cases.{s}", .{dep_name});
113        step.dependOn(dep_step);
114    }
115}