1*c8dee2aaSAndroid Build Coastguard Workerload("@emsdk//emscripten_toolchain:wasm_rules.bzl", "wasm_cc_binary") 2*c8dee2aaSAndroid Build Coastguard Workerload("@rules_cc//cc:defs.bzl", "cc_binary") 3*c8dee2aaSAndroid Build Coastguard Worker 4*c8dee2aaSAndroid Build Coastguard WorkerBASE_LINKOPTS = [ 5*c8dee2aaSAndroid Build Coastguard Worker #"-flto", # https://github.com/emscripten-core/emsdk/issues/807 6*c8dee2aaSAndroid Build Coastguard Worker "--bind", # Compiles the source code using the Embind bindings to connect C/C++ and JavaScript 7*c8dee2aaSAndroid Build Coastguard Worker "-s ALLOW_MEMORY_GROWTH=1", 8*c8dee2aaSAndroid Build Coastguard Worker "-s USE_PTHREADS=0", # Disable pthreads 9*c8dee2aaSAndroid Build Coastguard Worker "-s MODULARIZE=1", 10*c8dee2aaSAndroid Build Coastguard Worker "-s EXPORT_NAME=WebGPUKitInit", 11*c8dee2aaSAndroid Build Coastguard Worker "-s DISABLE_EXCEPTION_CATCHING=1", # Disable all exception catching 12*c8dee2aaSAndroid Build Coastguard Worker "-s NODEJS_CATCH_EXIT=0", # We don't have a 'main' so disable exit() catching 13*c8dee2aaSAndroid Build Coastguard Worker "-s WASM=1", 14*c8dee2aaSAndroid Build Coastguard Worker "-s USE_WEBGPU=1", 15*c8dee2aaSAndroid Build Coastguard Worker "-s ASYNCIFY", 16*c8dee2aaSAndroid Build Coastguard Worker] 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard WorkerRELEASE_OPTS = [ 19*c8dee2aaSAndroid Build Coastguard Worker "-s ASSERTIONS=0", # Turn off assertions 20*c8dee2aaSAndroid Build Coastguard Worker "-O3", 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker # TODO(armansito): The closure compiler doesn't play well with Asyncify such that an 23*c8dee2aaSAndroid Build Coastguard Worker # async Embind binding seems to lose its return value if it's awaited on from JS. While it 24*c8dee2aaSAndroid Build Coastguard Worker # isn't strictly necessary, our example awaits on `drawWithSkia` and uses the result to the 25*c8dee2aaSAndroid Build Coastguard Worker # update the HTML with a status message. Hence, we keep this turned off. 26*c8dee2aaSAndroid Build Coastguard Worker "--closure 0", # Run the closure compiler 27*c8dee2aaSAndroid Build Coastguard Worker] 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard WorkerDEBUG_OPTS = [ 30*c8dee2aaSAndroid Build Coastguard Worker "-s ASSERTIONS=1", # Turn on assertions 31*c8dee2aaSAndroid Build Coastguard Worker "--closure 0", # Do not use closure 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker # Building without optimizations causes Chrome to hit a limit when loading the WASM module with 34*c8dee2aaSAndroid Build Coastguard Worker # the following error message: 35*c8dee2aaSAndroid Build Coastguard Worker # RuntimeError: Aborted(CompileError: WebAssembly.instantiate(): 36*c8dee2aaSAndroid Build Coastguard Worker # Compiling function #6515:"blur_x_radius_3((anonymous namespace)::SkNx<8, ..." failed: 37*c8dee2aaSAndroid Build Coastguard Worker # local count too large @+6422486) 38*c8dee2aaSAndroid Build Coastguard Worker # 39*c8dee2aaSAndroid Build Coastguard Worker # As a workaround for now, we tell emscripten to enable optimizations while retaining some debug 40*c8dee2aaSAndroid Build Coastguard Worker # information. 41*c8dee2aaSAndroid Build Coastguard Worker "-O2 -g", 42*c8dee2aaSAndroid Build Coastguard Worker] 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Workerconfig_setting( 45*c8dee2aaSAndroid Build Coastguard Worker name = "release_opts", 46*c8dee2aaSAndroid Build Coastguard Worker values = {"compilation_mode": "opt"}, 47*c8dee2aaSAndroid Build Coastguard Worker) 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Workerconfig_setting( 50*c8dee2aaSAndroid Build Coastguard Worker name = "debug_opts", 51*c8dee2aaSAndroid Build Coastguard Worker values = {"compilation_mode": "dbg"}, 52*c8dee2aaSAndroid Build Coastguard Worker) 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Workercc_binary( 55*c8dee2aaSAndroid Build Coastguard Worker name = "hello-world", 56*c8dee2aaSAndroid Build Coastguard Worker srcs = ["bindings.cpp"], 57*c8dee2aaSAndroid Build Coastguard Worker linkopts = select({ 58*c8dee2aaSAndroid Build Coastguard Worker ":debug_opts": BASE_LINKOPTS + DEBUG_OPTS, 59*c8dee2aaSAndroid Build Coastguard Worker ":release_opts": BASE_LINKOPTS + RELEASE_OPTS, 60*c8dee2aaSAndroid Build Coastguard Worker "//conditions:default": BASE_LINKOPTS + RELEASE_OPTS, 61*c8dee2aaSAndroid Build Coastguard Worker }), 62*c8dee2aaSAndroid Build Coastguard Worker # This target won't build successfully on its own because of missing emscripten 63*c8dee2aaSAndroid Build Coastguard Worker # headers etc. Therefore, we hide it from wildcards. 64*c8dee2aaSAndroid Build Coastguard Worker tags = ["manual"], 65*c8dee2aaSAndroid Build Coastguard Worker # There probably needs to be another dep here, like //:ganesh_gl 66*c8dee2aaSAndroid Build Coastguard Worker deps = ["//:core"], 67*c8dee2aaSAndroid Build Coastguard Worker) 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Workerwasm_cc_binary( 70*c8dee2aaSAndroid Build Coastguard Worker name = "hello-world-wasm", 71*c8dee2aaSAndroid Build Coastguard Worker cc_target = ":hello-world", 72*c8dee2aaSAndroid Build Coastguard Worker) 73