@@ -12,7 +12,7 @@ module build;
1212import std;
1313
1414// Dependency versions
15- enum emsdk_version = " 4.0.9 " ;
15+ enum emsdk_version = " 4.0.10 " ;
1616enum imgui_version = " 1.91.9" ;
1717
1818void main (string [] args) @safe
@@ -29,7 +29,7 @@ void main(string[] args) @safe
2929 bool help, verbose, downloadEmsdk, downloadShdc;
3030 string compiler, target = defaultTarget, optimize = " debug" , linkExample, runExample, linkage = " static" ;
3131 SokolBackend backend;
32- bool useX11 = true , useWayland, useEgl, withSokolImgui;
32+ bool useX11 = true , useWayland, useEgl, useLTO, withSokolImgui;
3333 }
3434
3535 Options opts;
@@ -47,6 +47,9 @@ void main(string[] args) @safe
4747 case " --verbose" :
4848 verbose = true ;
4949 break ;
50+ case " --enable-wasm-lto" :
51+ useLTO = true ;
52+ break ;
5053 case " --download-emsdk" :
5154 downloadEmsdk = true ;
5255 break ;
@@ -89,6 +92,8 @@ void main(string[] args) @safe
8992 writeln(" --toolchain=<compiler> Select C toolchain (e.g., gcc, clang, emcc)" );
9093 writeln(" --optimize=<level> Select optimization level (debug, release, small)" );
9194 writeln(" --target=<target> Select target (native, wasm, android)" );
95+ writeln(" --enable-wasm-lto Enable Emscripten LTO" );
96+ writeln(" --enable-dawn Use emdawnwebgpu bindings for WASM" );
9297 writeln(
9398 " --linkage=<type> Specify library linkage (static or dynamic, default: static)" );
9499 writeln(" --download-emsdk Download Emscripten SDK" );
@@ -133,6 +138,7 @@ void main(string[] args) @safe
133138 vendor: vendorPath,
134139 backend: opts.backend,
135140 use_emmalloc: true ,
141+ release_use_lto: opts.useLTO,
136142 use_imgui: opts.withSokolImgui,
137143 use_filesystem: false ,
138144 shell_file_path: absolutePath (buildPath(sokolRoot, " src" , " sokol" , " web" , " shell.html" )),
@@ -259,6 +265,11 @@ struct EmRunOptions
259265 bool verbose;
260266}
261267
268+ struct EmbuilderOptions
269+ {
270+ string port_name, vendor;
271+ }
272+
262273// Build Sokol and ImGui libraries
263274void buildLibSokol (LibSokolOptions opts) @safe
264275{
@@ -307,6 +318,17 @@ void buildLibSokol(LibSokolOptions opts) @safe
307318 break ;
308319 case " wasm" :
309320 cflags ~= [" -fPIE" ];
321+ if (opts.backend == SokolBackend.wgpu) // add include path to find emdawnwebgpu <webgpu/webgpu.h> before Emscripten SDK webgpu.h
322+ {
323+ // dfmt off
324+ EmbuilderOptions embopts = {
325+ port_name: " emdawnwebgpu" ,
326+ vendor: opts.vendor,
327+ };
328+ // dfmt on
329+ embuilderStep(embopts);
330+ cflags ~= format(" -I%s" , buildPath(opts.vendor, " emsdk" , " upstream" , " emscripten" , " cache" , " ports" , " emdawnwebgpu" , " emdawnwebgpu_pkg" , " webgpu" , " include" ));
331+ }
310332 compiler = buildPath(opts.vendor, " emsdk" , " upstream" , " emscripten" , " emcc" ) ~ (isWindows ? " .bat"
311333 : " " );
312334 break ;
@@ -348,9 +370,12 @@ void buildLibSokol(LibSokolOptions opts) @safe
348370 ];
349371 cflags ~= format(" -I%s" , imguiRoot);
350372
373+ // dfmt off
351374 string imguiCompiler = opts.target.canFind(" wasm" ) ? buildPath(opts.vendor, " emsdk" , " upstream" , " emscripten" , " em++" ) ~ (
352- isWindows ? " .bat" : " " ) : compiler.canFind(" clang" ) ? findProgram(compiler ~ " ++" ) : compiler.canFind(
353- " gcc" ) ? findProgram(" g++" ) : compiler;
375+ isWindows ? " .bat" : " " ) :
376+ compiler.canFind(" clang" ) ? findProgram(compiler ~ " ++" ) :
377+ compiler.canFind(" gcc" ) ? findProgram(" g++" ) : compiler;
378+ // dfmt on
354379
355380 // Compile ImGui sources
356381 auto imguiObjs = compileSources(imguiSources, buildDir, imguiRoot, imguiCompiler, cflags ~ " -DNDEBUG" , " imgui_" , opts
@@ -463,7 +488,7 @@ void emLinkStep(EmLinkOptions opts) @safe
463488 }
464489
465490 if (opts.backend == SokolBackend.wgpu)
466- cmd ~= " -sUSE_WEBGPU=1 " ;
491+ cmd ~= " --use-port=emdawnwebgpu " ;
467492 if (opts.backend == SokolBackend.gles3)
468493 cmd ~= " -sUSE_WEBGL2=1" ;
469494 if (! opts.use_filesystem)
@@ -511,6 +536,14 @@ void emSdkSetupStep(string emsdk) @safe
511536 }
512537}
513538
539+ void embuilderStep (EmbuilderOptions opts) @safe
540+ {
541+ string embuilder = buildPath(opts.vendor, " emsdk" , " upstream" , " emscripten" , " embuilder" ) ~ (
542+ isWindows ? " .bat" : " " );
543+ string [] bFlags = [" build" , opts.port_name];
544+ executeOrFail(embuilder ~ bFlags, " embuilder failed to build " ~ opts.port_name, true );
545+ }
546+
514547// Utility functions
515548string findProgram (string programName) @safe
516549{
0 commit comments