zig/test/standalone/windows_argv/build.zig

112 lines
3.8 KiB
Zig

const std = @import("std");
const builtin = @import("builtin");
pub fn build(b: *std.Build) !void {
const test_step = b.step("test", "Test it");
b.default_step = test_step;
if (builtin.os.tag != .windows) return;
const optimize: std.builtin.OptimizeMode = .Debug;
const lib_gnu = b.addStaticLibrary(.{
.name = "toargv-gnu",
.root_module = b.createModule(.{
.root_source_file = b.path("lib.zig"),
.target = b.resolveTargetQuery(.{
.abi = .gnu,
}),
.optimize = optimize,
}),
});
const verify_gnu = b.addExecutable(.{
.name = "verify-gnu",
.root_module = b.createModule(.{
.root_source_file = null,
.target = b.resolveTargetQuery(.{
.abi = .gnu,
}),
.optimize = optimize,
}),
});
verify_gnu.root_module.addCSourceFile(.{
.file = b.path("verify.c"),
.flags = &.{ "-DUNICODE", "-D_UNICODE" },
});
verify_gnu.mingw_unicode_entry_point = true;
verify_gnu.root_module.linkLibrary(lib_gnu);
verify_gnu.root_module.link_libc = true;
const fuzz = b.addExecutable(.{
.name = "fuzz",
.root_module = b.createModule(.{
.root_source_file = b.path("fuzz.zig"),
.target = b.graph.host,
.optimize = optimize,
}),
});
const fuzz_max_iterations = b.option(u64, "iterations", "The max fuzz iterations (default: 100)") orelse 100;
const fuzz_iterations_arg = std.fmt.allocPrint(b.allocator, "{}", .{fuzz_max_iterations}) catch @panic("oom");
const fuzz_seed = b.option(u64, "seed", "Seed to use for the PRNG (default: random)") orelse seed: {
var buf: [8]u8 = undefined;
try std.posix.getrandom(&buf);
break :seed std.mem.readInt(u64, &buf, builtin.cpu.arch.endian());
};
const fuzz_seed_arg = std.fmt.allocPrint(b.allocator, "{}", .{fuzz_seed}) catch @panic("oom");
const run_gnu = b.addRunArtifact(fuzz);
run_gnu.setName("fuzz-gnu");
run_gnu.addArtifactArg(verify_gnu);
run_gnu.addArgs(&.{ fuzz_iterations_arg, fuzz_seed_arg });
run_gnu.expectExitCode(0);
test_step.dependOn(&run_gnu.step);
// Only target the MSVC ABI if MSVC/Windows SDK is available
const has_msvc = has_msvc: {
const sdk = std.zig.WindowsSdk.find(b.allocator, builtin.cpu.arch) catch |err| switch (err) {
error.OutOfMemory => @panic("oom"),
else => break :has_msvc false,
};
defer sdk.free(b.allocator);
break :has_msvc true;
};
if (has_msvc) {
const lib_msvc = b.addStaticLibrary(.{
.name = "toargv-msvc",
.root_module = b.createModule(.{
.root_source_file = b.path("lib.zig"),
.target = b.resolveTargetQuery(.{
.abi = .msvc,
}),
.optimize = optimize,
}),
});
const verify_msvc = b.addExecutable(.{
.name = "verify-msvc",
.root_module = b.createModule(.{
.root_source_file = null,
.target = b.resolveTargetQuery(.{
.abi = .msvc,
}),
.optimize = optimize,
}),
});
verify_msvc.root_module.addCSourceFile(.{
.file = b.path("verify.c"),
.flags = &.{ "-DUNICODE", "-D_UNICODE" },
});
verify_msvc.root_module.linkLibrary(lib_msvc);
verify_msvc.root_module.link_libc = true;
const run_msvc = b.addRunArtifact(fuzz);
run_msvc.setName("fuzz-msvc");
run_msvc.addArtifactArg(verify_msvc);
run_msvc.addArgs(&.{ fuzz_iterations_arg, fuzz_seed_arg });
run_msvc.expectExitCode(0);
test_step.dependOn(&run_msvc.step);
}
}