master
  1const std = @import("std");
  2pub fn build(b: *std.Build) void {
  3    const test_filters = b.option(
  4        []const []const u8,
  5        "test-filter",
  6        "Skip tests that do not match any filter",
  7    ) orelse &[0][]const u8{};
  8    const strip = b.option(bool, "strip", "Omit debug information");
  9
 10    const compiler_rt_lib = b.addLibrary(.{
 11        .linkage = .static,
 12        .name = "compiler_rt",
 13        .use_llvm = false,
 14        .use_lld = false,
 15        .root_module = b.createModule(.{
 16            .root_source_file = b.addWriteFiles().add("compiler_rt.zig", ""),
 17            .target = b.resolveTargetQuery(.{ .cpu_arch = .x86_64 }),
 18        }),
 19    });
 20    compiler_rt_lib.bundle_compiler_rt = true;
 21
 22    for ([_]std.Target.Query{
 23        .{
 24            .cpu_arch = .x86_64,
 25            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
 26            .cpu_features_add = std.Target.x86.featureSet(&.{.bsf_bsr_0_clobbers_result}),
 27            //.cpu_features_sub = std.Target.x86.featureSet(&.{.sse}),
 28        },
 29        .{
 30            .cpu_arch = .x86_64,
 31            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
 32            .cpu_features_add = std.Target.x86.featureSet(&.{.bsf_bsr_0_clobbers_result}),
 33            .cpu_features_sub = std.Target.x86.featureSet(&.{
 34                .cmov,
 35                //.sse,
 36                .sse2,
 37            }),
 38        },
 39        .{
 40            .cpu_arch = .x86_64,
 41            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
 42            .cpu_features_add = std.Target.x86.featureSet(&.{.sahf}),
 43            .cpu_features_sub = std.Target.x86.featureSet(&.{.cmov}),
 44        },
 45        //.{
 46        //    .cpu_arch = .x86_64,
 47        //    .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
 48        //    .cpu_features_sub = std.Target.x86.featureSet(&.{.sse}),
 49        //},
 50        .{
 51            .cpu_arch = .x86_64,
 52            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
 53            .cpu_features_sub = std.Target.x86.featureSet(&.{.sse2}),
 54        },
 55        .{
 56            .cpu_arch = .x86_64,
 57            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
 58        },
 59        .{
 60            .cpu_arch = .x86_64,
 61            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
 62            .cpu_features_add = std.Target.x86.featureSet(&.{ .adx, .gfni }),
 63        },
 64        .{
 65            .cpu_arch = .x86_64,
 66            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
 67            .cpu_features_add = std.Target.x86.featureSet(&.{.sse3}),
 68        },
 69        .{
 70            .cpu_arch = .x86_64,
 71            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
 72            .cpu_features_add = std.Target.x86.featureSet(&.{.ssse3}),
 73        },
 74        .{
 75            .cpu_arch = .x86_64,
 76            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
 77            .cpu_features_add = std.Target.x86.featureSet(&.{.sse4_1}),
 78        },
 79        .{
 80            .cpu_arch = .x86_64,
 81            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
 82            .cpu_features_add = std.Target.x86.featureSet(&.{.sse4_2}),
 83        },
 84        .{
 85            .cpu_arch = .x86_64,
 86            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v2 },
 87        },
 88        .{
 89            .cpu_arch = .x86_64,
 90            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v2 },
 91            .cpu_features_add = std.Target.x86.featureSet(&.{ .adx, .fast_hops, .gfni, .pclmul, .slow_incdec }),
 92        },
 93        .{
 94            .cpu_arch = .x86_64,
 95            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v2 },
 96            .cpu_features_add = std.Target.x86.featureSet(&.{.avx}),
 97        },
 98        .{
 99            .cpu_arch = .x86_64,
100            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v3 },
101            .cpu_features_add = std.Target.x86.featureSet(&.{ .adx, .fast_hops, .gfni, .pclmul, .slow_incdec }),
102            .cpu_features_sub = std.Target.x86.featureSet(&.{.avx2}),
103        },
104        .{
105            .cpu_arch = .x86_64,
106            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v3 },
107        },
108        .{
109            .cpu_arch = .x86_64,
110            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v3 },
111            .cpu_features_add = std.Target.x86.featureSet(&.{ .adx, .fast_hops, .gfni, .slow_incdec, .vpclmulqdq }),
112        },
113        .{
114            .cpu_arch = .x86_64,
115            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v4 },
116        },
117
118        .{
119            .cpu_arch = .x86_64,
120            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
121            .os_tag = .windows,
122            .abi = .none,
123        },
124        .{
125            .cpu_arch = .x86_64,
126            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
127            .cpu_features_add = std.Target.x86.featureSet(&.{.ssse3}),
128            .os_tag = .windows,
129            .abi = .none,
130        },
131        .{
132            .cpu_arch = .x86_64,
133            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v2 },
134            .os_tag = .windows,
135            .abi = .none,
136        },
137        .{
138            .cpu_arch = .x86_64,
139            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v3 },
140            .os_tag = .windows,
141            .abi = .none,
142        },
143
144        .{
145            .cpu_arch = .x86_64,
146            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64 },
147            .os_tag = .windows,
148            .abi = .gnu,
149        },
150        .{
151            .cpu_arch = .x86_64,
152            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v2 },
153            .os_tag = .windows,
154            .abi = .gnu,
155        },
156        .{
157            .cpu_arch = .x86_64,
158            .cpu_model = .{ .explicit = &std.Target.x86.cpu.x86_64_v3 },
159            .os_tag = .windows,
160            .abi = .gnu,
161        },
162    }) |query| {
163        const target = b.resolveTargetQuery(query);
164        const triple = query.zigTriple(b.allocator) catch @panic("OOM");
165        const cpu = query.serializeCpuAlloc(b.allocator) catch @panic("OOM");
166        for ([_][]const u8{
167            "access.zig",
168            "binary.zig",
169            "cast.zig",
170            "unary.zig",
171        }) |path| {
172            const test_mod = b.createModule(.{
173                .root_source_file = b.path(path),
174                .target = target,
175                .strip = strip,
176            });
177            const test_exe = b.addTest(.{
178                .name = std.fs.path.stem(path),
179                .filters = test_filters,
180                .use_llvm = false,
181                .use_lld = false,
182                .root_module = test_mod,
183            });
184            test_exe.step.name = b.fmt("{s} {s}", .{ test_exe.step.name, cpu });
185            if (!target.result.cpu.has(.x86, .sse2)) {
186                test_exe.bundle_compiler_rt = false;
187                test_mod.linkLibrary(compiler_rt_lib);
188            }
189            const test_run = b.addRunArtifact(test_exe);
190            test_run.step.name = b.fmt("{s} {s} {s}", .{ test_run.step.name, triple, cpu });
191            b.default_step.dependOn(&test_run.step);
192        }
193    }
194}