const std = @import("std"); const builtin = @import("builtin"); pub fn build(b: *std.build.Builder) void { // Standard target options allows the person running `zig build` to choose // what target to build for. Here we do not override the defaults, which // means any target is allowed, and the default is native. Other options // for restricting supported target set are available. const target = b.standardTargetOptions(.{}); // Standard release options allow the person running `zig build` to select // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. const optimize = b.standardOptimizeOption(.{}); const nnue = b.option(bool, "nnue", "Enable NNUE") orelse false; const options = b.addOptions(); options.addOption(bool, "nnue", nnue); const base_flags = [_][]const u8{ "-Wall", "-fstrict-aliasing", "-fno-exceptions", "-fno-rtti", "-std=c++11", "-DIS_64BIT", }; const flags = blk: { var f = std.BoundedArray([]const u8, 16).init(0) catch unreachable; f.appendSlice(&base_flags) catch unreachable; if (builtin.cpu.arch.isX86()) { // if (std.Target.x86.featureSetHas(builtin.cpu.features, .avx2)) { // f.append("-DUSE_AVX2 -mavx2") catch unreachable; // } if (std.Target.x86.featureSetHas(builtin.cpu.features, .sse)) { f.append("-DUSE_SSE -msse") catch unreachable; } // if (std.Target.x86.featureSetHas(builtin.cpu.features, .sse2)) { // f.append("-DUSE_SSE2 -msse2") catch unreachable; // } if (std.Target.x86.featureSetHas(builtin.cpu.features, .sse3)) { f.append("-DUSE_sse3 -msse3") catch unreachable; } if (std.Target.x86.featureSetHas(builtin.cpu.features, .sse4_1)) { f.append("-DUSE_SSE41 -msse4.1") catch unreachable; } } else if (builtin.cpu.arch.isAARCH64()) { // rpi4 does not report neon feature :-( f.append("-DUSE_NEON") catch unreachable; if (std.Target.arm.featureSetHas(builtin.cpu.features, .neon)) { f.append("-DUSE_NEON") catch unreachable; } } break :blk f.constSlice(); }; const exe = b.addExecutable(std.build.ExecutableOptions{ .name = "pistike", .root_source_file = .{ .path = "src/main.zig" }, .target = target, .optimize = optimize, }); if (nnue) { exe.linkLibCpp(); exe.addIncludePath(.{ .path = "src/nnue" }); exe.addCSourceFiles(&[_][]const u8{ "src/nnue/nnue.cpp", "src/nnue/misc.cpp" }, flags); } exe.addOptions("build_options", options); b.installArtifact(exe); const run_cmd = b.addRunArtifact(exe); run_cmd.step.dependOn(b.getInstallStep()); if (b.args) |args| { run_cmd.addArgs(args); } const run_step = b.step("run", "Run the app"); run_step.dependOn(&run_cmd.step); const exe_tests = b.addTest(std.build.TestOptions{ .root_source_file = .{ .path = "src/main.zig" }, }); if (nnue) { exe_tests.linkLibCpp(); exe_tests.addIncludePath(.{ .path = "src/nnue" }); exe_tests.addCSourceFiles(&[_][]const u8{ "src/nnue/nnue.cpp", "src/nnue/misc.cpp" }, flags); } exe_tests.addOptions("build_options", options); b.installArtifact(exe_tests); const test_step = b.step("test", "Run unit tests"); test_step.dependOn(&exe_tests.step); }