| load("@emsdk//emscripten_toolchain:wasm_rules.bzl", "wasm_cc_binary") | |
| load("@rules_cc//cc:defs.bzl", "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"], | |
| additional_linker_inputs = [ | |
| "hello-embind-externs.js", | |
| "hello-embind-interface.js", | |
| ], | |
| features = ["emcc_debug_link"], | |
| 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", | |
| ) |