| load("@emsdk//emscripten_toolchain:wasm_rules.bzl", "wasm_cc_binary") |
| load("@rules_cc//cc:defs.bzl", "cc_binary") |
| |
| BASE_LINKOPTS = [ |
| #"-flto", # https://github.com/emscripten-core/emsdk/issues/807 |
| "--bind", # Compiles the source code using the Embind bindings to connect C/C++ and JavaScript |
| "-s ALLOW_MEMORY_GROWTH=1", |
| "-s USE_PTHREADS=0", # Disable pthreads |
| "-s MODULARIZE=1", |
| "-s EXPORT_NAME=WebGPUKitInit", |
| "-s DISABLE_EXCEPTION_CATCHING=1", # Disable all exception catching |
| "-s NODEJS_CATCH_EXIT=0", # We don't have a 'main' so disable exit() catching |
| "-s WASM=1", |
| "-s USE_WEBGPU=1", |
| "-s ASYNCIFY", |
| ] |
| |
| RELEASE_OPTS = [ |
| "-s ASSERTIONS=0", # Turn off assertions |
| "-O3", |
| |
| # TODO(armansito): The closure compiler doesn't play well with Asyncify such that an |
| # async Embind binding seems to lose its return value if it's awaited on from JS. While it |
| # isn't strictly necessary, our example awaits on `drawWithSkia` and uses the result to the |
| # update the HTML with a status message. Hence, we keep this turned off. |
| "--closure 0", # Run the closure compiler |
| ] |
| |
| DEBUG_OPTS = [ |
| "-s ASSERTIONS=1", # Turn on assertions |
| "--closure 0", # Do not use closure |
| |
| # Building without optimizations causes Chrome to hit a limit when loading the WASM module with |
| # the following error message: |
| # RuntimeError: Aborted(CompileError: WebAssembly.instantiate(): |
| # Compiling function #6515:"blur_x_radius_3((anonymous namespace)::SkNx<8, ..." failed: |
| # local count too large @+6422486) |
| # |
| # As a workaround for now, we tell emscripten to enable optimizations while retaining some debug |
| # information. |
| "-O2 -g", |
| ] |
| |
| config_setting( |
| name = "release_opts", |
| values = {"compilation_mode": "opt"}, |
| ) |
| |
| config_setting( |
| name = "debug_opts", |
| values = {"compilation_mode": "dbg"}, |
| ) |
| |
| cc_binary( |
| name = "hello-world", |
| srcs = ["bindings.cpp"], |
| linkopts = select({ |
| ":debug_opts": BASE_LINKOPTS + DEBUG_OPTS, |
| ":release_opts": BASE_LINKOPTS + RELEASE_OPTS, |
| "//conditions:default": BASE_LINKOPTS + RELEASE_OPTS, |
| }), |
| # This target won't build successfully on its own because of missing emscripten |
| # headers etc. Therefore, we hide it from wildcards. |
| tags = ["manual"], |
| deps = ["//:skia_public"], |
| ) |
| |
| wasm_cc_binary( |
| name = "hello-world-wasm", |
| cc_target = ":hello-world", |
| ) |