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 ファイルが生成されるようである。

キーワード

参考