Skip to content

Commit

Permalink
some fixes for wasm
Browse files Browse the repository at this point in the history
  • Loading branch information
kassane committed May 26, 2024
1 parent 56ee2d0 commit 18ff030
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 48 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
30 changes: 15 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,37 +8,37 @@ 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)

On Linux install the following packages: libglu1-mesa-dev, mesa-common-dev, xorg-dev, libasound-dev (or generally: the dev packages required for X11, GL and ALSA development)

```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:
Expand All @@ -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)
Expand Down
42 changes: 22 additions & 20 deletions build.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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", .{});
Expand Down Expand Up @@ -181,8 +182,6 @@ pub fn buildLibSokol(b: *Build, options: LibSokolOptions) !*CompileStep {
.flags = cflags,
});
}

b.installArtifact(lib);
return lib;
}

Expand All @@ -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,
Expand All @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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) });
Expand Down Expand Up @@ -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 })});
Expand All @@ -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,
},
});
Expand All @@ -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
Expand All @@ -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;
}

Expand Down Expand Up @@ -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,
Expand Down
5 changes: 3 additions & 2 deletions build.zig.zon
Original file line number Diff line number Diff line change
Expand Up @@ -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,
},
},
}
20 changes: 10 additions & 10 deletions dub.sdl
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
}

0 comments on commit 18ff030

Please sign in to comment.