Goal
smalruby3 コマンドを gem に内蔵し、smalruby3 script.rb で実行できるようにする。rsdl の別途インストールを不要にする。
背景
macOS では SDL2 が Cocoa のメインスレッドで初期化される必要がある。通常の ruby コマンドから SDL2.init を呼ぶと segfault する。現在は rsdl コマンド(別 gem)を使って回避しているが、ユーザーにとって分かりにくい。
rsdl の仕組み
rsdl は SDL_main.h を include した独自の main() 関数を持つ C 実行ファイル。main() 内で ruby_init() → ruby_run_node() を呼ぶことで、Ruby VM がメインスレッド上で動作し、SDL2 の Cocoa 制約を満たす。
実装方針
ext/smalruby3_launcher/ に rsdl 相当の C ソースを配置
extconf.rb で SDL2 をリンクした実行ファイル smalruby3 をビルド
exe/smalruby3 から native ビルドされたバイナリを呼び出す
gem install smalruby3 で自動的にビルド・インストール
- ユーザーは
smalruby3 script.rb で実行
使い方
# Before (rsdl を別途インストール)
gem install rsdl
rsdl -Ilib script.rb
# After (smalruby3 gem のみ)
gem install smalruby3
smalruby3 script.rb
参考
ruby/rsdl/rsdl.c.in — rsdl の実装(SDL_main + ruby_init + ruby_run_node)
ruby/rsdl/extconf.rb — rsdl のビルド設定
Goal
smalruby3コマンドを gem に内蔵し、smalruby3 script.rbで実行できるようにする。rsdl の別途インストールを不要にする。背景
macOS では SDL2 が Cocoa のメインスレッドで初期化される必要がある。通常の
rubyコマンドからSDL2.initを呼ぶと segfault する。現在はrsdlコマンド(別 gem)を使って回避しているが、ユーザーにとって分かりにくい。rsdl の仕組み
rsdl は
SDL_main.hを include した独自のmain()関数を持つ C 実行ファイル。main()内でruby_init()→ruby_run_node()を呼ぶことで、Ruby VM がメインスレッド上で動作し、SDL2 の Cocoa 制約を満たす。実装方針
ext/smalruby3_launcher/に rsdl 相当の C ソースを配置extconf.rbで SDL2 をリンクした実行ファイルsmalruby3をビルドexe/smalruby3から native ビルドされたバイナリを呼び出すgem install smalruby3で自動的にビルド・インストールsmalruby3 script.rbで実行使い方
参考
ruby/rsdl/rsdl.c.in— rsdl の実装(SDL_main + ruby_init + ruby_run_node)ruby/rsdl/extconf.rb— rsdl のビルド設定