SERVER-116038 Investigate adding WASI SDK to be used in Bazel (#47863)

GitOrigin-RevId: aad4d9d1777e97293bfb52f064aadfa3145cfe8b
This commit is contained in:
Samuel Mercier
2026-02-12 09:54:09 -06:00
committed by MongoDB Bot
parent b7aa2be0bd
commit 9b39ddac21
2 changed files with 75 additions and 0 deletions

51
bazel/docs/toolchain.md Normal file
View File

@@ -0,0 +1,51 @@
# About
This documents some useful tools, concepts, and debugging strategies for bazel toolchains.
This information was gathered while developing the WASI SDK toolchain.
# Concepts
[Toolchain](https://bazel.build/extending/toolchains#debugging-toolchains) and [Platform](https://bazel.build/extending/platforms) are the core relevant concepts.
Toolchains define the tools used to compile, and the platform defines either the execution platform (for the compilation/compiler tools) and target platform (for the binary).
Bazel tries to search for a toolchain based on these constraints.
We also made use of [transitions](https://bazel.build/rules/lib/builtins/transition) which allow bazel to reconfigure itself before building a target to avoid passing irrelevant or incorrect compiler flags (e.g. WASI SDK doesn't support shared objects).
Similarly, we used [actions](https://bazel.build/docs/cc-toolchain-config-reference#using-action-config) instead of the tool paths attribute because of, [possibly historical, lack of support for remote resources in tool paths](https://stackoverflow.com/questions/73504780/bazel-reference-binaries-from-packages-in-custom-toolchain-definition/73505313#73505313).
# Debugging tools
## Toolchain Debugging
```bash
bazel ... --toolchain_resolution_debug=.* ...
```
The above flag can be used to debug toolchain resolution as bazel tries to automatically satisfy constraints.
## Debugging Remote Resources
Toolchains may be remotely fetched, but the directory structure of the build environment after these remote resources are fetched may not be clear.
`bazel info` can be used to find the bazel directory and inspect it `bazel info output_base`.
Note: this may be different depending on your configuration and level of sandboxing.
This is particularly useful when used in combination with the `find` command as shown below.
```bash
find $(bazel info output_base) -name THING
```
Note: this command is directory dependent because output_base is per bazel instance.
## Debugging Bazel Compilation Actions
```bash
bazel ... -s ...
```
This will show verbose output such as cd actions and compiler/linker invocations.
Note: bazel may recast paths relative to the exec directory.
## Debugging on Engflow
Engflow has a lot of helpful views showing remote execution stats and the remote file structure.
We don't intent to duplicate their documentation but be careful as some of their data (particularly remotely executed actions) may not be accurate immediately after execution.

View File

@@ -0,0 +1,24 @@
# Usage
To use the WASI SDK apply the `wasi_compatible` with a select statement:
```python
select({
"//bazel/toolchains/cc/wasm:wasi_compatible": [
"//bazel/toolchains/cc/wasm/sample:dist_hello_world",
],
"//conditions:default": [],
})
```
If your target is defined in terms of a traditional bazel C/C++ target you can use the WASI transition in order to ensure the bazel options are WASI compatible.
```python
load("//bazel/toolchains/cc/wasm/toolchain:with_wasi_config.bzl", "with_wasi_config")
with_wasi_config(
name = "dist_hello_world",
srcs = [
":hello_world",
],
)
```