From 18ff0307dd929c1deb2d91499a2ed914e80f6b76 Mon Sep 17 00:00:00 2001 From: Matheus Catarino Date: Sun, 26 May 2024 12:38:58 -0300 Subject: [PATCH] some fixes for wasm --- .github/workflows/build.yml | 2 +- README.md | 30 +++++++++++++------------- build.zig | 42 +++++++++++++++++++------------------ build.zig.zon | 5 +++-- dub.sdl | 20 +++++++++--------- 5 files changed, 51 insertions(+), 48 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 429ce61..0513be3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,4 +42,4 @@ jobs: - name: (Zig) Build Native run: zig build -DzigCC --summary all - name: (Zig + emsdk) Build Wasm - run: zig build -DzigCC --summary all -Dtarget=wasm32-emscripten -Doptimize=ReleaseSmall + run: zig build -DzigCC --summary all -Dtarget=wasm32-emscripten-none -Doptimize=ReleaseSmall diff --git a/README.md b/README.md index 3c64ba9..7f4a603 100644 --- a/README.md +++ b/README.md @@ -8,14 +8,14 @@ Auto-generated [D](https://dlang.org) bindings for the [sokol headers](https://g #### Targets - Native -- Wasm (`-Dtarget=wasm32-emscripten`) +- Wasm (`-Dtarget=wasm32-emscripten-none`) ## BUILD **Required** - [zig](https://ziglang.org/download) v0.12.0 or master -- [ldc](https://ldc-developers.github.io) v1.36.0 or latest-CI (nightly) +- [ldc](https://ldc-developers.github.io) v1.38.0 or latest-CI (nightly) Supported platforms are: Windows, macOS, Linux (with X11) @@ -23,22 +23,22 @@ On Linux install the following packages: libglu1-mesa-dev, mesa-common-dev, xorg ```bash # build sokol library + all examples [default: static library] -zig build -Doptimize=ReleaseFast +zig build -Doptimize=ReleaseSafe # build sokol shared library + all examples -zig build -Doptimize=ReleaseFast -Dshared +zig build -Doptimize=ReleaseSafe -Dshared # Run Examples -zig build run-blend -Doptimize=ReleaseFast -zig build run-clear -Doptimize=ReleaseFast -zig build run-cube -Doptimize=ReleaseFast -zig build run-debugtext -Doptimize=ReleaseFast -zig build run-mrt -Doptimize=ReleaseFast -zig build run-saudio -Doptimize=ReleaseFast -zig build run-sgl_context -Doptimize=ReleaseFast -zig build run-sgl_points -Doptimize=ReleaseFast -zig build run-user_data -Doptimize=ReleaseFast -zig build run-triangle -Doptimize=ReleaseFast +zig build run-blend -Doptimize=ReleaseSafe +zig build run-clear -Doptimize=ReleaseSafe +zig build run-cube -Doptimize=ReleaseSafe +zig build run-debugtext -Doptimize=ReleaseSafe +zig build run-mrt -Doptimize=ReleaseSafe +zig build run-saudio -Doptimize=ReleaseSafe +zig build run-sgl_context -Doptimize=ReleaseSafe +zig build run-sgl_points -Doptimize=ReleaseSafe +zig build run-user_data -Doptimize=ReleaseSafe +zig build run-triangle -Doptimize=ReleaseSafe zig build --help # Project-Specific Options: @@ -53,7 +53,7 @@ zig build --help # Supported Values: # Debug # ReleaseSafe -# ReleaseFast +# ReleaseSafe # ReleaseSmall # -Dshared=[bool] Build sokol dynamic library (default: static) # -DbetterC=[bool] Omit generating some runtime information and helper functions (default: false) diff --git a/build.zig b/build.zig index 1d33a8d..5c7b92d 100644 --- a/build.zig +++ b/build.zig @@ -66,6 +66,7 @@ pub fn buildLibSokol(b: *Build, options: LibSokolOptions) !*CompileStep { } if (options.target.result.isWasm()) { + lib.want_lto = true; // make sure we're building for the wasm32-emscripten target, not wasm32-freestanding if (lib.rootModuleTarget().os.tag != .emscripten) { std.log.err("Please build with 'zig build -Dtarget=wasm32-emscripten", .{}); @@ -181,8 +182,6 @@ pub fn buildLibSokol(b: *Build, options: LibSokolOptions) !*CompileStep { .flags = cflags, }); } - - b.installArtifact(lib); return lib; } @@ -193,12 +192,12 @@ pub fn build(b: *Build) !void { const opt_use_wayland = b.option(bool, "wayland", "Force Wayland (default: false, Linux only, not supported in main-line headers)") orelse false; const opt_use_egl = b.option(bool, "egl", "Force EGL (default: false, Linux only)") orelse false; const sokol_backend: SokolBackend = if (opt_use_gl) .gl else if (opt_use_wgpu) .wgpu else .auto; - + const dub_artifact = b.option(bool, "artifact", "Build artifacts (default: false)") orelse false; // ldc2 w/ druntime + phobos2 works on MSVC const target = b.standardTargetOptions(.{ .default_target = if (builtin.os.tag == .windows) try std.Target.Query.parse(.{ .arch_os_abi = "native-windows-msvc" }) else .{} }); const optimize = b.standardOptimizeOption(.{}); - const emsdk = b.dependency("emsdk", .{}); + const emsdk = b.lazyDependency("emsdk", .{}) orelse null; const lib_sokol = try buildLibSokol(b, .{ .target = target, .optimize = optimize, @@ -208,6 +207,9 @@ pub fn build(b: *Build) !void { .use_egl = opt_use_egl, .emsdk = emsdk, }); + if (dub_artifact) { + b.installArtifact(lib_sokol); + } // LDC-options options const enable_betterC = b.option(bool, "betterC", "Omit generating some runtime information and helper functions (default: false)") orelse false; @@ -359,8 +361,6 @@ pub fn ldcBuildStep(b: *Build, options: DCompileStep) !*RunStep { // mutable state hash (ldc2 cache - llvm-ir2obj) try cmds.append(b.fmt("-cache={s}", .{b.pathJoin(&.{ path, "o", &b.graph.cache.hash.final() })})); } - // name object files uniquely (so the files don't collide) - try cmds.append("-oq"); // disable LLVM-IR verifier // https://llvm.org/docs/Passes.html#verify-module-verifier @@ -492,9 +492,9 @@ pub fn ldcBuildStep(b: *Build, options: DCompileStep) !*RunStep { // ldc2 doesn't support zig native (a.k.a: native-native or native) const mtriple = if (options.target.result.isDarwin()) b.fmt("{s}-apple-{s}", .{ if (options.target.result.cpu.arch.isAARCH64()) "arm64" else @tagName(options.target.result.cpu.arch), @tagName(options.target.result.os.tag) }) - else if (options.target.result.isWasm()) + else if (options.target.result.isWasm() and options.target.result.os.tag == .freestanding) b.fmt("{s}-unknown-unknown-wasm", .{@tagName(options.target.result.cpu.arch)}) - else if (options.target.result.isWasm() and options.target.result.os.tag == .wasi) + else if (options.target.result.isWasm()) b.fmt("{s}-unknown-{s}", .{ @tagName(options.target.result.cpu.arch), @tagName(options.target.result.os.tag) }) else b.fmt("{s}-{s}-{s}", .{ @tagName(options.target.result.cpu.arch), @tagName(options.target.result.os.tag), @tagName(options.target.result.abi) }); @@ -529,14 +529,8 @@ pub fn ldcBuildStep(b: *Build, options: DCompileStep) !*RunStep { const zcc_exists = !std.meta.isError(std.fs.accessAbsolute(zcc_path, .{})); if (!zcc_exists) ldc_exec.step.dependOn(&install.step); - try cmds.append(b.fmt("--gcc={s}", .{zcc_path})); - try cmds.append(b.fmt("--linker={s}", .{zcc_path})); - } - - if (options.artifact) |lib_sokol| { - if (lib_sokol.rootModuleTarget().os.tag == .windows and lib_sokol.isDynamicLibrary()) { - ldc_exec.addArg(b.pathJoin(&.{ b.install_path, "lib", b.fmt("{s}.lib", .{lib_sokol.name}) })); - } else ldc_exec.addArtifactArg(lib_sokol); + ldc_exec.addArg(b.fmt("--gcc={s}", .{zcc_path})); + ldc_exec.addArg(b.fmt("--linker={s}", .{zcc_path})); } const example_run = b.addSystemCommand(&.{b.pathJoin(&.{ b.install_path, outputDir, options.name })}); @@ -548,10 +542,11 @@ pub fn ldcBuildStep(b: *Build, options: DCompileStep) !*RunStep { b.step("test", "Run all tests"); if (options.target.result.isWasm()) { + // get D object file and put it in the wasm artifact const artifact = addArtifact(b, options); artifact.addObjectFile(.{ .src_path = .{ - .sub_path = b.fmt("{s}/examples.{s}.o", .{ objpath, options.name }), + .sub_path = b.fmt("{s}/{s}.o", .{ objpath, options.name }), .owner = b, }, }); @@ -566,6 +561,7 @@ pub fn ldcBuildStep(b: *Build, options: DCompileStep) !*RunStep { .use_webgl2 = true, .use_emmalloc = true, .use_filesystem = false, + .release_use_lto = options.artifact.?.want_lto orelse false, .shell_file_path = "src/sokol/web/shell.html", // NOTE: This is required to make the Zig @returnAddress() builtin work, // which is used heavily in the stdlib allocator code (not just @@ -578,8 +574,14 @@ pub fn ldcBuildStep(b: *Build, options: DCompileStep) !*RunStep { const emrun = emRunStep(b, .{ .name = options.name, .emsdk = options.emsdk.? }); emrun.step.dependOn(&link_step.step); run.dependOn(&emrun.step); - } else run.dependOn(&example_run.step); - + } else { + if (options.artifact) |lib_sokol| { + if (lib_sokol.rootModuleTarget().os.tag == .windows and lib_sokol.isDynamicLibrary()) { + ldc_exec.addArg(b.pathJoin(&.{ b.install_path, "lib", b.fmt("{s}.lib", .{lib_sokol.name}) })); + } else ldc_exec.addArtifactArg(lib_sokol); + } + run.dependOn(&example_run.step); + } return ldc_exec; } @@ -680,7 +682,7 @@ pub const EmLinkOptions = struct { // lib_sokol: *Build.Step.Compile, emsdk: *Build.Dependency, release_use_closure: bool = true, - release_use_lto: bool = true, + release_use_lto: bool = false, use_webgpu: bool = false, use_webgl2: bool = false, use_emmalloc: bool = false, diff --git a/build.zig.zon b/build.zig.zon index 2165815..c35ca22 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -12,8 +12,9 @@ }, .dependencies = .{ .emsdk = .{ - .url = "git+https://github.com/emscripten-core/emsdk#3.1.59", - .hash = "122083537ec3463ee4b2d520bf86a36b1057ab05abfe712c32bae1048f9b0c6e2a13", + .url = "git+https://github.com/emscripten-core/emsdk?ref=3.1.60#ce74ca2b1c968f897150bdc55daa9e3c12a3fefc", + .hash = "1220122266f201c6c3a774f7a5edd60e4b1b9655e345bca525360bed2ff9fcb479a8", + .lazy = true, }, }, } diff --git a/dub.sdl b/dub.sdl index 86e25cf..1ad4992 100644 --- a/dub.sdl +++ b/dub.sdl @@ -41,7 +41,7 @@ subPackage { lflags "-Lzig-out/lib" platform="posix" lflags "/LIBPATH:zig-out/lib" platform="windows" excludedSourceFiles "src/examples/sgl_context.d" "src/examples/triangle.d" "src/examples/sgl_points.d" "src/examples/saudio.d" "src/examples/debugtext.d" "src/examples/mrt.d" "src/examples/user_data.d" "src/examples/cube.d" "src/examples/blend.d" "src/shaders/*.d" - preBuildCommands "zig build -Doptimize=ReleaseFast" + preBuildCommands "zig build -Doptimize=ReleaseFast -Dartifact" } subPackage { name "sgl_context" @@ -56,7 +56,7 @@ subPackage { lflags "-Lzig-out/lib" platform="posix" lflags "/LIBPATH:zig-out/lib" platform="windows" excludedSourceFiles "src/examples/clear.d" "src/examples/triangle.d" "src/examples/sgl_points.d" "src/examples/saudio.d" "src/examples/debugtext.d" "src/examples/mrt.d" "src/examples/user_data.d" "src/examples/cube.d" "src/examples/blend.d" "src/shaders/*.d" - preBuildCommands "zig build -Doptimize=ReleaseFast" + preBuildCommands "zig build -Doptimize=ReleaseFast -Dartifact" } subPackage { name "sgl_points" @@ -71,7 +71,7 @@ subPackage { lflags "-Lzig-out/lib" platform="posix" lflags "/LIBPATH:zig-out/lib" platform="windows" excludedSourceFiles "src/examples/clear.d" "src/examples/triangle.d" "src/examples/sgl_context.d" "src/examples/saudio.d" "src/examples/debugtext.d" "src/examples/mrt.d" "src/examples/user_data.d" "src/examples/cube.d" "src/examples/blend.d" "src/shaders/*.d" - preBuildCommands "zig build -Doptimize=ReleaseFast" + preBuildCommands "zig build -Doptimize=ReleaseFast -Dartifact" } subPackage { name "debugtext" @@ -86,7 +86,7 @@ subPackage { lflags "-Lzig-out/lib" platform="posix" lflags "/LIBPATH:zig-out/lib" platform="windows" excludedSourceFiles "src/examples/sgl_context.d" "src/examples/triangle.d" "src/examples/sgl_points.d" "src/examples/saudio.d" "src/examples/clear.d" "src/examples/mrt.d" "src/examples/user_data.d" "src/examples/cube.d" "src/examples/blend.d" "src/shaders/*.d" - preBuildCommands "zig build -Doptimize=ReleaseFast" + preBuildCommands "zig build -Doptimize=ReleaseFast -Dartifact" } subPackage { name "triangle" @@ -101,7 +101,7 @@ subPackage { lflags "-Lzig-out/lib" platform="posix" lflags "/LIBPATH:zig-out/lib" platform="windows" excludedSourceFiles "src/examples/sgl_context.d" "src/examples/clear.d" "src/examples/sgl_points.d" "src/examples/saudio.d" "src/examples/debugtext.d" "src/examples/mrt.d" "src/examples/user_data.d" "src/examples/cube.d" "src/examples/blend.d" "src/shaders/*.d" - preBuildCommands "zig build -Doptimize=ReleaseFast" + preBuildCommands "zig build -Doptimize=ReleaseFast -Dartifact" } subPackage { name "blend" @@ -116,7 +116,7 @@ subPackage { lflags "-Lzig-out/lib" platform="posix" lflags "/LIBPATH:zig-out/lib" platform="windows" excludedSourceFiles "src/examples/sgl_context.d" "src/examples/clear.d" "src/examples/saudio.d" "src/examples/debugtext.d" "src/examples/mrt.d" "src/examples/user_data.d" "src/examples/cube.d" "src/examples/triangle.d" "src/examples/sgl_points.d" "src/shaders/*.d" - preBuildCommands "zig build -Doptimize=ReleaseFast" + preBuildCommands "zig build -Doptimize=ReleaseFast -Dartifact" } subPackage { name "saudio" @@ -131,7 +131,7 @@ subPackage { lflags "-Lzig-out/lib" platform="posix" lflags "/LIBPATH:zig-out/lib" platform="windows" excludedSourceFiles "src/examples/sgl_context.d" "src/examples/clear.d" "src/examples/triangle.d" "src/examples/sgl_points.d" "src/examples/debugtext.d" "src/examples/mrt.d" "src/examples/user_data.d" "src/examples/cube.d" "src/examples/blend.d" "src/shaders/*.d" - preBuildCommands "zig build -Doptimize=ReleaseFast" + preBuildCommands "zig build -Doptimize=ReleaseFast -Dartifact" } subPackage { name "mrt" @@ -146,7 +146,7 @@ subPackage { lflags "-Lzig-out/lib" platform="posix" lflags "/LIBPATH:zig-out/lib" platform="windows" excludedSourceFiles "src/examples/sgl_context.d" "src/examples/clear.d" "src/examples/saudio.d" "src/examples/debugtext.d" "src/examples/triangle.d" "src/examples/sgl_points.d" "src/examples/user_data.d" "src/examples/cube.d" "src/examples/blend.d" "src/shaders/*.d" - preBuildCommands "zig build -Doptimize=ReleaseFast" + preBuildCommands "zig build -Doptimize=ReleaseFast -Dartifact" } subPackage { name "cube" @@ -161,7 +161,7 @@ subPackage { lflags "-Lzig-out/lib" platform="posix" lflags "/LIBPATH:zig-out/lib" platform="windows" excludedSourceFiles "src/examples/sgl_context.d" "src/examples/clear.d" "src/examples/saudio.d" "src/examples/debugtext.d" "src/examples/triangle.d" "src/examples/sgl_points.d" "src/examples/user_data.d" "src/examples/mrt.d" "src/examples/blend.d" "src/shaders/*.d" - preBuildCommands "zig build -Doptimize=ReleaseFast" + preBuildCommands "zig build -Doptimize=ReleaseFast -Dartifact" } subPackage { name "user_data" @@ -176,5 +176,5 @@ subPackage { lflags "-Lzig-out/lib" platform="posix" lflags "/LIBPATH:zig-out/lib" platform="windows" excludedSourceFiles "src/examples/sgl_context.d" "src/examples/clear.d" "src/examples/saudio.d" "src/examples/debugtext.d" "src/examples/triangle.d" "src/examples/sgl_points.d" "src/examples/cube.d" "src/examples/mrt.d" "src/examples/blend.d" "src/shaders/*.d" - preBuildCommands "zig build -Doptimize=ReleaseFast" + preBuildCommands "zig build -Doptimize=ReleaseFast -Dartifact" }