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!
より便利な cargo-wasi
WASMへのコンパイルは、前述の流れで可能ですが、通常は cargo-wasi を使った方が便利です。
cargo-wasi については以下を参照してください。