Browse Source

Add WASM support for Zig build (#2901)

* Add WASM support for Zig build

* Improve Web example building

* Remove emscript example building with Zig again

* Readd windows emscripten variables
Nikolas 2 years ago
parent
commit
89171a2608
4 changed files with 55 additions and 21 deletions
  1. 17 12
      examples/Makefile
  2. 13 7
      examples/build.zig
  3. 0 0
      examples/shapes/resources/.gitkeep
  4. 25 2
      src/build.zig

+ 17 - 12
examples/Makefile

@@ -67,8 +67,8 @@ ifeq ($(PLATFORM),PLATFORM_RPI)
     endif
 endif
 
-# Determine PLATFORM_OS in case PLATFORM_DESKTOP selected
-ifeq ($(PLATFORM),PLATFORM_DESKTOP)
+# Determine PLATFORM_OS in case PLATFORM_DESKTOP or PLATFORM_WEB selected
+ifeq ($(PLATFORM),$(filter $(PLATFORM),PLATFORM_DESKTOP PLATFORM_WEB))
     # No uname.exe on MinGW!, but OS=Windows_NT on Windows!
     # ifeq ($(UNAME),Msys) -> Windows
     ifeq ($(OS),Windows_NT)
@@ -126,16 +126,18 @@ ifeq ($(PLATFORM),PLATFORM_DRM)
 endif
 
 # Define raylib release directory for compiled library
-RAYLIB_RELEASE_PATH 	?= $(RAYLIB_PATH)/src
+RAYLIB_RELEASE_PATH    ?= $(RAYLIB_PATH)/src
 
 ifeq ($(PLATFORM),PLATFORM_WEB)
-    # Emscripten required variables
-    EMSDK_PATH         ?= C:/emsdk
-    EMSCRIPTEN_PATH    ?= $(EMSDK_PATH)/upstream/emscripten
-    CLANG_PATH          = $(EMSDK_PATH)/upstream/bin
-    PYTHON_PATH         = $(EMSDK_PATH)/python/3.9.2-1_64bit
-    NODE_PATH           = $(EMSDK_PATH)/node/14.15.5_64bit/bin
-    export PATH         = $(EMSDK_PATH);$(EMSCRIPTEN_PATH);$(CLANG_PATH);$(NODE_PATH);$(PYTHON_PATH):$$(PATH)
+	ifeq ($(PLATFORM_OS),WINDOWS)
+        # Emscripten required variables
+		EMSDK_PATH         ?= C:/emsdk
+		EMSCRIPTEN_PATH    ?= $(EMSDK_PATH)/upstream/emscripten
+		CLANG_PATH          = $(EMSDK_PATH)/upstream/bin
+		PYTHON_PATH         = $(EMSDK_PATH)/python/3.9.2-1_64bit
+		NODE_PATH           = $(EMSDK_PATH)/node/14.15.5_64bit/bin
+		export PATH         = $(EMSDK_PATH);$(EMSCRIPTEN_PATH);$(CLANG_PATH);$(NODE_PATH);$(PYTHON_PATH):$$(PATH)
+	endif
 endif
 
 # Define default C compiler: CC
@@ -579,7 +581,10 @@ ifeq ($(PLATFORM),PLATFORM_DRM)
 	rm -fv *.o
 endif
 ifeq ($(PLATFORM),PLATFORM_WEB)
-	del *.o *.html *.js
+	ifeq ($(PLATFORM_OS),WINDOWS)
+		del *.wasm *.html *.js *.data
+	else
+		rm -f */*.wasm */*.html */*.js */*.data
+	endif
 endif
 	@echo Cleaning done
-

+ 13 - 7
examples/build.zig

@@ -2,6 +2,10 @@ const std = @import("std");
 const builtin = @import("builtin");
 
 fn add_module(comptime module: []const u8, b: *std.build.Builder, target: std.zig.CrossTarget) !*std.build.Step {
+    if (target.getOsTag() == .emscripten) {
+        @panic("Emscripten building via Zig unsupported");
+    }
+
     // Standard release options allow the person running `zig build` to select
     // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall.
     const mode = b.standardReleaseOptions();
@@ -19,12 +23,7 @@ fn add_module(comptime module: []const u8, b: *std.build.Builder, target: std.zi
         if (std.mem.eql(u8, "core_loading_thread", name) and target.getOsTag() == .windows) continue;
 
         const exe = b.addExecutable(name, null);
-        exe.addCSourceFile(path, switch (target.getOsTag()) {
-            .windows => &[_][]const u8{},
-            .linux => &[_][]const u8{},
-            .macos => &[_][]const u8{"-DPLATFORM_DESKTOP"},
-            else => @panic("Unsupported OS"),
-        });
+        exe.addCSourceFile(path, &[_][]const u8{});
         exe.setTarget(target);
         exe.setBuildMode(mode);
         exe.linkLibC();
@@ -32,6 +31,7 @@ fn add_module(comptime module: []const u8, b: *std.build.Builder, target: std.zi
             .windows => "../src/raylib.lib",
             .linux => "../src/libraylib.a",
             .macos => "../src/libraylib.a",
+            .emscripten => "../src/libraylib.a",
             else => @panic("Unsupported OS"),
         });
 
@@ -39,12 +39,14 @@ fn add_module(comptime module: []const u8, b: *std.build.Builder, target: std.zi
         exe.addIncludePath("../src/external");
         exe.addIncludePath("../src/external/glfw/include");
 
-        switch (exe.target.toTarget().os.tag) {
+        switch (target.getOsTag()) {
             .windows => {
                 exe.linkSystemLibrary("winmm");
                 exe.linkSystemLibrary("gdi32");
                 exe.linkSystemLibrary("opengl32");
                 exe.addIncludePath("external/glfw/deps/mingw");
+
+                exe.defineCMacro("PLATFORM_DESKTOP", null);
             },
             .linux => {
                 exe.linkSystemLibrary("GL");
@@ -52,6 +54,8 @@ fn add_module(comptime module: []const u8, b: *std.build.Builder, target: std.zi
                 exe.linkSystemLibrary("dl");
                 exe.linkSystemLibrary("m");
                 exe.linkSystemLibrary("X11");
+
+                exe.defineCMacro("PLATFORM_DESKTOP", null);
             },
             .macos => {
                 exe.linkFramework("Foundation");
@@ -60,6 +64,8 @@ fn add_module(comptime module: []const u8, b: *std.build.Builder, target: std.zi
                 exe.linkFramework("CoreAudio");
                 exe.linkFramework("CoreVideo");
                 exe.linkFramework("IOKit");
+
+                exe.defineCMacro("PLATFORM_DESKTOP", null);
             },
             else => {
                 @panic("Unsupported OS");

+ 0 - 0
examples/shapes/resources/.gitkeep


+ 25 - 2
src/build.zig

@@ -3,7 +3,6 @@ const std = @import("std");
 pub fn addRaylib(b: *std.build.Builder, target: std.zig.CrossTarget) *std.build.LibExeObjStep {
     const raylib_flags = &[_][]const u8{
         "-std=gnu99",
-        "-DPLATFORM_DESKTOP",
         "-D_GNU_SOURCE",
         "-DGL_SILENCE_DEPRECATION=199309L",
         "-fno-sanitize=undefined", // https://github.com/raysan5/raylib/issues/1891
@@ -25,13 +24,15 @@ pub fn addRaylib(b: *std.build.Builder, target: std.zig.CrossTarget) *std.build.
         srcdir ++ "/utils.c",
     }, raylib_flags);
 
-    switch (raylib.target.toTarget().os.tag) {
+    switch (target.getOsTag()) {
         .windows => {
             raylib.addCSourceFiles(&.{srcdir ++ "/rglfw.c"}, raylib_flags);
             raylib.linkSystemLibrary("winmm");
             raylib.linkSystemLibrary("gdi32");
             raylib.linkSystemLibrary("opengl32");
             raylib.addIncludePath("external/glfw/deps/mingw");
+
+            raylib.defineCMacro("PLATFORM_DESKTOP", null);
         },
         .linux => {
             raylib.addCSourceFiles(&.{srcdir ++ "/rglfw.c"}, raylib_flags);
@@ -40,6 +41,8 @@ pub fn addRaylib(b: *std.build.Builder, target: std.zig.CrossTarget) *std.build.
             raylib.linkSystemLibrary("dl");
             raylib.linkSystemLibrary("m");
             raylib.linkSystemLibrary("X11");
+
+            raylib.defineCMacro("PLATFORM_DESKTOP", null);
         },
         .freebsd, .openbsd, .netbsd, .dragonfly => {
             raylib.addCSourceFiles(&.{srcdir ++ "/rglfw.c"}, raylib_flags);
@@ -53,6 +56,8 @@ pub fn addRaylib(b: *std.build.Builder, target: std.zig.CrossTarget) *std.build.
             raylib.linkSystemLibrary("Xi");
             raylib.linkSystemLibrary("Xxf86vm");
             raylib.linkSystemLibrary("Xcursor");
+
+            raylib.defineCMacro("PLATFORM_DESKTOP", null);
         },
         .macos => {
             // On macos rglfw.c include Objective-C files.
@@ -68,6 +73,24 @@ pub fn addRaylib(b: *std.build.Builder, target: std.zig.CrossTarget) *std.build.
             raylib.linkFramework("CoreGraphics");
             raylib.linkFramework("AppKit");
             raylib.linkFramework("IOKit");
+
+            raylib.defineCMacro("PLATFORM_DESKTOP", null);
+        },
+        .emscripten => {
+            raylib.defineCMacro("PLATFORM_WEB", null);
+            raylib.defineCMacro("GRAPHICS_API_OPENGL_ES2", null);
+
+            if (b.sysroot == null) {
+                @panic("Pass '--sysroot \"$EMSDK/upstream/emscripten\"'");
+            }
+
+            const cache_include = std.fs.path.join(b.allocator, &.{ b.sysroot.?, "cache", "sysroot", "include" }) catch @panic("Out of memory");
+            defer b.allocator.free(cache_include);
+
+            var dir = std.fs.openDirAbsolute(cache_include, std.fs.Dir.OpenDirOptions{.access_sub_paths = true, .no_follow = true}) catch @panic("No emscripten cache. Generate it!");
+            dir.close();
+
+            raylib.addIncludePath(cache_include);
         },
         else => {
             @panic("Unsupported OS");