いけむランド

はてダからやってきました

ruby.wasm on cygwin

これは WebAssembly Advent Calendar 2022 の 9 日目の記事です。*1

RubyKaigi 2022 で ruby.wasm の話を聴いてから、いろいろと触っていたのですが、意外と cygwin native な wasm 実行環境でも動かせたため、手順をまとめます。

ruby.wasm

ruby.wasm 自体は README に書いてあるとおりにすれば、自前アプリ (& ライブラリ) 込みの wasm を作成できます。

github.com

作成した wasm がきちんと動くかを wasmtime (brew でインストール可能) で確認します。

wasmtime.dev

$ uname -mrs 
Darwin 22.1.0 x86_64
$ wasmtime --version
wasmtime-cli 3.0.1
$ wasmtime ./myruby.wasm -- -v         
ruby 3.2.0dev (2022-12-07T12:27:36Z master f725bf358a) [wasm32-wasi]

wasm 実行環境 on cygwin

cygwin で動く wasm 実行環境として wasm3 を用意することにしました。*2

github.com

ちなみに依存関係として wasm3 -> uvwasi -> libuv が必要ですが、libuv は cygwin 公式パッケージがあり、wasm3 と uvwasi はそれらを使って、とりあえずビルドできるようにはしました。

github.com

github.com

cygwin.com

$ uname -mrs
CYGWIN_NT-10.0-19044 3.4.0-1.x86_64 x86_64
$ /usr/bin/wasm3 --version
Wasm3 v0.5.0 on x86_64
Build: Sep  9 2022 21:58:18, GCC 11.3.0
$ file /usr/bin/wasm3.exe
/usr/bin/wasm3.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
$ ldd /usr/bin/wasm3.exe
        ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffd858f0000)
        KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ffd84720000)
        KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ffd82ff0000)
        cygwin1.dll => /usr/bin/cygwin1.dll (0x7ffd54f30000)
        cyguvwasi-0.dll => /usr/bin/cyguvwasi-0.dll (0x3674c0000)
        cyguv-1.dll => /usr/bin/cyguv-1.dll (0x3674e0000)
$ /usr/bin/wasm3 ./myruby.wasm --version
ruby 3.2.0dev (2022-12-07T12:27:36Z master f725bf358a) [wasm32-wasi]

version 表示は別にライブラリを同梱していなくてもできるため、ライブラリをきちんと参照できるかどうかも確認してみました。

まとめ

意外と動く。(ただし実行はまだまだ遅いです。)

*1:WebAssembly に関するブログを書こうとしたらカレンダーがなかったためつくりました。

*2:上述の wasmtime は rust 製のため、現時点で cygwin バイナリを生成するコンパイラはない。