TL;DR
rustup target addで WASM 向けのビルドターゲット(wasm32-wasip1など)を追加し、cargo build --targetで指定すると、Rust のコードを WebAssembly のファイルとして出力できる。
背景
Rust のコードをビルドして、WASM ファイルとして出力したかった。
検証
まず rustup target list で、WASM をビルドターゲットとして指定できるかを確かめる。
$ rustup target list
aarch64-apple-darwin (installed)
...
# WASM に関するアーキテクチャ
wasm32-unknown-emscripten
wasm32-unknown-unknown (installed)
wasm32-wasi
wasm32-wasip1
wasm32-wasip1-threads
...WASM に関するターゲットは 5 つあり、それぞれ次の違いがある。
wasm32-unknown-emscripten: Emscripten を使って WASM にコンパイルするwasm32-unknown-unknown: 実行環境について何も前提を持たない、最小限のターゲットwasm32-wasi: WASI を対象にしたターゲットwasm32-wasip1: WASI の Preview1 に対応したターゲットwasm32-wasip1-threads:wasm32-wasip1にスレッドのサポートを足したターゲットで、マルチスレッドの処理ができる
使いたいターゲットに (installed) が付いていなければ、rustup target add で追加する。
$ rustup target add wasm32-wasip1
info: downloading component 'rust-std' for 'wasm32-wasip1'
info: installing component 'rust-std' for 'wasm32-wasip1'もう一度 rustup target list を実行すると、(installed) が付いている。
$ rustup target list
...
wasm32-wasip1 (installed)
...最後に、cargo build の --target オプションで WASM のアーキテクチャを指定してビルドする。
$ cargo build --target wasm32-wasip1結果
成果物として ./target/wasm32-wasip1/release/hello-world.wasm が出力された。
考察
上に挙げたアーキテクチャであれば、どれを選んでも WASM ファイルが生成されるようである。