2020-09-10 21:42:46 -04:00
|
|
|
# Bazel Emscripten toolchain
|
|
|
|
|
|
|
|
|
|
## Setup Instructions
|
|
|
|
|
|
2021-03-25 18:00:30 +01:00
|
|
|
In `WORKSPACE` file, put:
|
2023-08-08 13:14:50 -07:00
|
|
|
```starlark
|
2024-07-24 22:36:24 +03:00
|
|
|
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
|
|
|
|
|
git_repository(
|
2021-03-25 18:00:30 +01:00
|
|
|
name = "emsdk",
|
2024-07-24 22:36:24 +03:00
|
|
|
remote = "https://github.com/emscripten-core/emsdk.git",
|
|
|
|
|
tag = "3.1.64",
|
|
|
|
|
strip_prefix = "bazel",
|
2021-03-25 18:00:30 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
load("@emsdk//:deps.bzl", emsdk_deps = "deps")
|
|
|
|
|
emsdk_deps()
|
|
|
|
|
|
|
|
|
|
load("@emsdk//:emscripten_deps.bzl", emsdk_emscripten_deps = "emscripten_deps")
|
2024-08-20 19:25:41 +03:00
|
|
|
emsdk_emscripten_deps(emscripten_version = "3.1.64")
|
2022-11-08 14:21:06 -08:00
|
|
|
|
|
|
|
|
load("@emsdk//:toolchains.bzl", "register_emscripten_toolchains")
|
|
|
|
|
register_emscripten_toolchains()
|
2020-09-10 21:42:46 -04:00
|
|
|
```
|
2024-08-20 19:25:41 +03:00
|
|
|
The `tag` and `emscripten_version` parameters correspond to the git revision of
|
|
|
|
|
[emsdk 3.1.64](https://github.com/emscripten-core/emsdk/releases/tag/3.1.64). To get access to
|
2021-10-14 13:49:36 -04:00
|
|
|
newer versions, you'll need to update those. To make use of older versions, change the
|
2024-08-20 19:25:41 +03:00
|
|
|
parameter of `git_repository` and `emsdk_emscripten_deps()`. Supported versions are listed in `revisions.bzl`
|
2020-09-10 21:42:46 -04:00
|
|
|
|
2024-04-04 21:04:10 +02:00
|
|
|
Bazel 7+ additionally requires `platforms` dependencies in the `MODULE.bazel` file.
|
|
|
|
|
```starlark
|
|
|
|
|
bazel_dep(name = "platforms", version = "0.0.9")
|
|
|
|
|
```
|
|
|
|
|
|
2021-03-25 18:00:30 +01:00
|
|
|
|
2021-10-14 13:49:36 -04:00
|
|
|
## Building
|
2020-09-10 21:42:46 -04:00
|
|
|
|
2022-11-08 14:21:06 -08:00
|
|
|
Put the following line into your `.bazelrc`:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
build --incompatible_enable_cc_toolchain_resolution
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Then write a new rule wrapping your `cc_binary`.
|
2020-09-10 21:42:46 -04:00
|
|
|
|
2023-08-08 13:14:50 -07:00
|
|
|
```starlark
|
2020-09-10 21:42:46 -04:00
|
|
|
load("@rules_cc//cc:defs.bzl", "cc_binary")
|
2021-03-25 18:00:30 +01:00
|
|
|
load("@emsdk//emscripten_toolchain:wasm_rules.bzl", "wasm_cc_binary")
|
2020-09-10 21:42:46 -04:00
|
|
|
|
|
|
|
|
cc_binary(
|
|
|
|
|
name = "hello-world",
|
|
|
|
|
srcs = ["hello-world.cc"],
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
wasm_cc_binary(
|
|
|
|
|
name = "hello-world-wasm",
|
|
|
|
|
cc_target = ":hello-world",
|
|
|
|
|
)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Now you can run `bazel build :hello-world-wasm`. The result of this build will
|
|
|
|
|
be the individual files produced by emscripten. Note that some of these files
|
|
|
|
|
may be empty. This is because bazel has no concept of optional outputs for
|
|
|
|
|
rules.
|
2021-03-25 18:00:30 +01:00
|
|
|
|
|
|
|
|
`wasm_cc_binary` uses transition to use emscripten toolchain on `cc_target`
|
|
|
|
|
and all of its dependencies, and does not require amending `.bazelrc`. This
|
|
|
|
|
is the preferred way, since it also unpacks the resulting tarball.
|
2021-10-14 13:49:36 -04:00
|
|
|
|
[Bazel] Support generating a secondary cache (#1405)
This is a working solution for generating a separate Emscripten cache.
Note that this requires an additional entry in the workspace as follows:
```starlark
load("@emsdk//:emscripten_cache.bzl", emsdk_emscripten_cache = "emscripten_cache")
emsdk_emscripten_cache()
```
When used like this, the default Emscripten cache will be used. However,
if the entry is as follows:
```starlark
load("@emsdk//:emscripten_cache.bzl", emsdk_emscripten_cache = "emscripten_cache")
emsdk_emscripten_cache(flags = ["--lto"])
```
Then embuilder will be called to build all system libraries and ports
(i.e., the `ALL` option to embuilder) with the LTO option enabled. This
can take awhile, so I have also made possible to specify which libraries
you want to build explicitly:
```starlark
load("@emsdk//:emscripten_cache.bzl", emsdk_emscripten_cache = "emscripten_cache")
emsdk_emscripten_cache(
flags = ["--lto"],
libraries = [
"crtbegin",
"libprintf_long_double-debug",
"libstubs-debug",
"libnoexit",
"libc-debug",
"libdlmalloc",
"libcompiler_rt",
"libc++-noexcept",
"libc++abi-debug-noexcept",
"libsockets"
]
)
```
Resolves #807, resolves #971, resolves #1099, resolves #1362, resolves
#1401
2024-07-01 18:23:07 +02:00
|
|
|
The Emscripten cache shipped by default does not include LTO, 64-bit or PIC
|
|
|
|
|
builds of the system libraries and ports. If you wish to use these features you
|
|
|
|
|
will need to declare the cache when you register the toolchain as follows. Note
|
|
|
|
|
that the configuration consists of the same flags that can be passed to
|
|
|
|
|
embuilder. If `targets` is not provided, all system libraries and ports will be
|
|
|
|
|
built, i.e., the `ALL` option to embuilder.
|
|
|
|
|
|
|
|
|
|
```starlark
|
|
|
|
|
load("@emsdk//:toolchains.bzl", "register_emscripten_toolchains")
|
|
|
|
|
register_emscripten_toolchains(cache = {
|
|
|
|
|
"configuration": ["--lto"],
|
|
|
|
|
"targets": [
|
|
|
|
|
"crtbegin",
|
|
|
|
|
"libprintf_long_double-debug",
|
|
|
|
|
"libstubs-debug",
|
|
|
|
|
"libnoexit",
|
|
|
|
|
"libc-debug",
|
|
|
|
|
"libdlmalloc",
|
|
|
|
|
"libcompiler_rt",
|
|
|
|
|
"libc++-noexcept",
|
|
|
|
|
"libc++abi-debug-noexcept",
|
|
|
|
|
"libsockets"
|
|
|
|
|
]
|
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
2021-10-14 13:49:36 -04:00
|
|
|
See `test_external/` for an example using [embind](https://emscripten.org/docs/porting/connecting_cpp_and_javascript/embind.html).
|