load("@emsdk//emscripten_toolchain:wasm_rules.bzl", "wasm_cc_binary") cc_binary( name = "hello-world", srcs = ["hello-world.cc"], ) wasm_cc_binary( name = "hello-world-wasm", cc_target = ":hello-world", outputs = [ "hello-world.js", "hello-world.wasm", ], ) BASE_LINKOPTS = [ "--bind", # Enable embind "-sMODULARIZE", "--pre-js", "hello-embind-interface.js", ] RELEASE_OPTS = [ "--closure=1", # Run the closure compiler # Tell closure about the externs file, so as not to minify our JS public API. "--closure-args=--externs=$(location hello-embind-externs.js)" ] DEBUG_OPTS = [ "--closure=0", # Do not use closure ] config_setting( name = "release_opts", values = {"compilation_mode": "opt"}, ) config_setting( name = "debug_opts", values = {"compilation_mode": "dbg"}, ) cc_binary( name = "hello-embind", srcs = ["hello-embind.cc"], features = ["emcc_debug_link"], additional_linker_inputs = [ "hello-embind-externs.js", "hello-embind-interface.js", ], 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"], ) wasm_cc_binary( name = "hello-embind-wasm", cc_target = ":hello-embind", )