diff --git a/build.zig b/build.zig index 381883c..4b0b274 100644 --- a/build.zig +++ b/build.zig @@ -1,4 +1,9 @@ const std = @import("std"); +const sokol = @import("sokol"); + +const title = "sok"; + +const buildForWeb = false; pub fn build(b: *std.Build) void { const target = b.standardTargetOptions(.{}); @@ -6,49 +11,78 @@ pub fn build(b: *std.Build) void { const dep_sokol = b.dependency("sokol", .{ .target = target, .optimize = optimize }); - // Exe + if (!buildForWeb) { + // Native exe - const exe = b.addExecutable(.{ - .name = "sok", - .root_source_file = b.path("src/main.zig"), - .target = target, - .optimize = optimize, - }); + const exe = b.addExecutable(.{ + .name = title, + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); - exe.root_module.addImport("sokol", dep_sokol.module("sokol")); + exe.root_module.addImport("sokol", dep_sokol.module("sokol")); - // Set this to hide console on windows - //exe.subsystem = .Windows; + // Set this to hide console on windows + //exe.subsystem = .Windows; - b.installArtifact(exe); + b.installArtifact(exe); - // Check step (for ZLS) + // Check step (for ZLS) - const exe_check = b.addExecutable(.{ - .name = "check_step", - .root_source_file = b.path("src/main.zig"), - .target = target, - .optimize = optimize, - }); + const exe_check = b.addExecutable(.{ + .name = "check_step", + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); - exe_check.root_module.addImport("sokol", dep_sokol.module("sokol")); + exe_check.root_module.addImport("sokol", dep_sokol.module("sokol")); - const check = b.step("check", "Check if project compiles"); - check.dependOn(&exe_check.step); + const check = b.step("check", "Check if project compiles"); + check.dependOn(&exe_check.step); - // Run + // Run - const run_cmd = b.addRunArtifact(exe); + const run_cmd = b.addRunArtifact(exe); - run_cmd.step.dependOn(b.getInstallStep()); + run_cmd.step.dependOn(b.getInstallStep()); - if (b.args) |args| { - run_cmd.addArgs(args); + if (b.args) |args| { + run_cmd.addArgs(args); + } + + const run_step = b.step("run", "Run" ++ title ++ " as native app"); + run_step.dependOn(&run_cmd.step); + } else { + // Web + + const wasmLib = b.addStaticLibrary(.{ + .name = title, + .target = target, + .optimize = optimize, + .root_source_file = b.path("src/pacman.zig"), + }); + wasmLib.root_module.addImport("sokol", dep_sokol.module("sokol")); + + // create a build step which invokes the Emscripten linker + const emsdk = dep_sokol.builder.dependency("emsdk", .{}); + const link_step = try sokol.emLinkStep(b, .{ + .lib_main = wasmLib, + .target = target, + .optimize = optimize, + .emsdk = emsdk, + .use_webgl2 = true, + .use_emmalloc = true, + .use_filesystem = false, + .shell_file_path = dep_sokol.path("src/sokol/web/shell.html").getPath(b), + }); + // ...and a special run step to start the web build output via 'emrun' + const run = sokol.emRunStep(b, .{ .name = "sok", .emsdk = emsdk }); + run.step.dependOn(&link_step.step); + b.step("run", "Run " ++ title ++ " as wasm").dependOn(&run.step); } - const run_step = b.step("run", "Run the app"); - run_step.dependOn(&run_cmd.step); - // Tests const exe_unit_tests = b.addTest(.{ @@ -62,3 +96,12 @@ pub fn build(b: *std.Build) void { const test_step = b.step("test", "Run unit tests"); test_step.dependOn(&run_exe_unit_tests.step); } + +// for web builds, the Zig code needs to be built into a library and linked with the Emscripten linker +fn buildWeb(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.Build.OptimizeMode, dep_sokol: *std.Build.Dependency) !void { + _ = b; // autofix + _ = target; // autofix + _ = optimize; // autofix + _ = dep_sokol; // autofix + +}