cargo-wasi で WebAssembly コンパイルするには

blog1.mammb.com


cargo-wasi とは

cargo-wasi は Cargo のサブコマンドとして利用でき、Rust コードの WebAssembly コンパイルを簡単にします。

cargo-wasi を利用することで、以下に示すビルトインのデフォルト処理が行われます

  • wasm32-wasi ターゲットの管理
  • ランタイム wasmtime がインストールされていることを確認する
  • カーゴを wasm32-wasi 用に自動的に設定する
  • WebAssembly を wasm-opt でさらに最適化する
  • WebAssembly Interface Types のための wasm-bindgen の実行
  • リリースモードでの DWARF デバッグ情報の削除
  • name` セクションの Rust シンボルの分離
  • nameproducers のカスタムセクションの設定


cargo-wasi の導入

以下でインストールします。

$ cargo install cargo-wasi
$ cargo wasi --version

アップデートとアンインストールは以下で可能です。

  • cargo wasi のアップデート
$ cargo install cargo-wasi --force
  • cargo wasi のアンインストール
$ cargo wasi self clean
$ cargo uninstall cargo-wasi


cargo-wasi コマンド

通常の cargo コマンドに wasi を付けて実行します。

build
$ cargo wasi build

リリースビルドは --release を付けるなど、通常の cargo ビルドと同様です。

check
$ cargo wasi check
run
$ cargo wasi run
$ cargo wasi run arg1 arg2
test
$ cargo wasi test
bench
$ cargo wasi bench


cargo-wasi の実行例

プロジェクトを作成します。

$ cargo new wasi-hello-world
     Created binary (application) `wasi-hello-world` package
$ cd wasi-hello-world

実行は以下のようにするだけです。

$ cargo wasi run
info: downloading component 'rust-std' for 'wasm32-wasi'
info: installing component 'rust-std' for 'wasm32-wasi'
   Compiling wasi-hello-world v0.1.0 (/code/wasi-hello-world)
    Finished dev [unoptimized + debuginfo] target(s) in 0.15s
     Running `/.cargo/bin/cargo-wasi target/wasm32-wasi/debug/wasi-hello-world.wasm`
     Running `target/wasm32-wasi/debug/wasi-hello-world.wasm`
Hello, world!

cargo wasi run により、コンパイルターゲット wasm32-wasiが存在しない場合は自動で導入されます。

実行には wasmtime が利用されます。wasmtime をインストール済みでない場合はエラーとなります。

以下を参考に導入しておきましょう。

blog1.mammb.com