Rust で WebAssembly へコンパイルするには

blog1.mammb.com


WebAssemblyターゲットの追加

Rust には、ビルドターゲットとして WebAssembly のサポートがあります。

ビルド時の --target フラグでターゲットを指定することで、WASMへコンパイルすることができます。

WASMのビルドターゲットには以下があります。

  • wasm32-wasi:WASIが標準ライブラリに統合されるため、スタンドアロンバイナリを生成する
  • wasm32-unknown-unknown:標準ライブラリの想定無し(unknown)であり、libstd の大部分がスタブ化されており、println! などの一般的な機能は動作しない
  • wasm32-unknown-emscripten:ウェブブラウザで動作することを意図しており、*.js ファイルと結合された *.wasm ファイルを生成する

通常は wasm32-wasi を利用することが大部分になるでしょう。


Rust の通常インストールではビルドターゲット wasm32-wasi が追加されていません。以下でビルドターゲットにWebAssemblyを追加します。

$ rustup target add wasm32-wasi

info: downloading component 'rust-std' for 'wasm32-wasi'
info: installing component 'rust-std' for 'wasm32-wasi'
 16.5 MiB /  16.5 MiB (100 %)  14.6 MiB/s in  1s ETA:  0s


WASMへのコンパイル

WebAssembly ターゲットが追加できれば、後はコンパイル時に --target wasm32-wasi を指定するだけです。

$ cargo new hello-wasm
$ cd hello-wasm

src/main.rs は以下のようにするものとします。

fn main() {
    println!("Hello, WASM!");
}

ビルドします。

$ cargo build --target wasm32-wasi

   Compiling hello-wasm v0.1.0 (...)
    Finished dev [unoptimized + debuginfo] target(s) in 13.19s

WASM が hello-wasm\target\wasm32-wasi\debug\hello-wasm.wasm に作成されます。

wasmtime などのランタイムで実行すれば、Hello, WASM! が出力できます。

$ wasmtime target/wasm32-wasi/debug/hello-wasm.wasm
Hello, WASM!

【参考】wasmtimeのインストール手順


より便利な cargo-wasi

WASMへのコンパイルは、前述の流れで可能ですが、通常は cargo-wasi を使った方が便利です。

cargo-wasi については以下を参照してください。

blog1.mammb.com