Skip to content

Instantly share code, notes, and snippets.

@aspick
Last active December 20, 2022 03:27
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aspick/f34b5f9b022a4e09d51665e2236d2d1a to your computer and use it in GitHub Desktop.
Save aspick/f34b5f9b022a4e09d51665e2236d2d1a to your computer and use it in GitHub Desktop.
ruby.wasm を使って Ruby アプリケーションのシングルバイナリを作成する

requirements

steps

# follow `ruby.wasm` tutorial
curl -LO https://github.com/ruby/ruby.wasm/releases/latest/download/ruby-head-wasm32-unknown-wasi-full.tar.gz
tar xfz ruby-head-wasm32-unknown-wasi-full.tar.gz
mv head-wasm32-unknown-wasi-full/usr/local/bin/ruby ruby.wasm

echo "puts 'Hello'" > src/my_app.rb
wasi-vfs pack ruby.wasm --mapdir /src::./src --mapdir /usr::./head-wasm32-unknown-wasi-full/usr -o my-ruby-app.wasm

# embed default arguments with `wasi-preset-args`
wasi-preset-args my-rubyapp.wasm -o my-ruby-app.preset.wasm -- /src/my_app.rb

# pack single binary with `wasmer`
wasmer create-exe --enable-bulk-memory my-ruby-app.preset.wasm -o my-ruby-app
./my-ruby-app
Hello
@aspick
Copy link
Author

aspick commented Dec 18, 2022

wasmer では以下のコマンドで Windows 向けバイナリのクロスコンパイルも可能だが、

wasmer create-exe --enable-bulk-memory my-ruby-app.preset.wasm --target x86_64-pc-windows-gnu -o my-ruby-app.exe

wasmer 側で Windows の syscall 対応が不十分なようなので、以下のエラーが出て実行できない。

thread '<unnamed>' panicked at 'not implemented: wasi::platform_clock_time_get(wasi::Clockid::ProcessCputimeId, ..)', lib/wasi/src/syscalls/windows.rs:45:13
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
fatal runtime error: failed to initiate panic, error 5

https://github.com/wasmerio/wasmer/blob/master/lib/wasi/src/syscalls/windows.rs#L45

@aspick
Copy link
Author

aspick commented Dec 19, 2022

https://github.com/wasmerio/wasmer/blob/master/lib/wasi/src/syscalls/windows.rs#L45-L48

上記の部分を以下のように書き換え、act を使用して GitHub Actions の windows_gnu job を流して Windows 用の libwasmer.a をビルドした。

diff --git a/lib/wasi/src/syscalls/windows.rs b/lib/wasi/src/syscalls/windows.rs
index 656c70a424..a1df25e6a1 100644
--- a/lib/wasi/src/syscalls/windows.rs
+++ b/lib/wasi/src/syscalls/windows.rs
@@ -42,10 +42,10 @@ pub fn platform_clock_time_get(
             duration.as_nanos() as u64
         }
         wasi::Snapshot0Clockid::ProcessCputimeId => {
-            unimplemented!("wasi::platform_clock_time_get(wasi::Clockid::ProcessCputimeId, ..)")
+            return Err(wasi::Errno::Inval);
         }
         wasi::Snapshot0Clockid::ThreadCputimeId => {
-            unimplemented!("wasi::platform_clock_time_get(wasi::Clockid::ThreadCputimeId, ..)")
+            return Err(wasi::Errno::Inval);
         }
         _ => return Err(wasi::Errno::Inval),
     };

それを使って再度 Windows 向けバイナリのクロスコンパイルをしたところ、puts の実行ができた。

PS C:\Users\yugo> C:\Users\yugo\Desktop\my-ruby-app.exe
Hello

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment