blob: c9b9494c686db30adbc0f625df67e5adbb3978bc [file] [log] [blame]
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",
)