わけあって Mac OS X 上で Ruby/SDL のインストールを試みる。
……げっ、X が必要なのか。 くそう、できるだけ X は入れたくなかったのだが、しょうがない。 Mac Ports で入れて、Ruby/SDL のテストしたら消そう。
[参考になりそうなページ]
うーむ、なんか激しくめんどくさそうだな。 なんでこんなに面倒なんだろう。 上記のページを見ていった感じ、 原因は二つありそうだ。
一つめは、Mac OS X のウィンドウシステム (というか Cocoa かな) とのインタラクションのために特殊な初期化が必要なこと。 そのためにはパッチを当てて特殊な Ruby を作る必要がある。 これは Windows で言う ruby (エントリポイントが main) と rubyw (エントリポイントが WinMain) の違いに対応している。
二つめは、SDL ライブラリ自体が特殊な初期化を必要としていること。 エラーメッセージから見て、 おそらく Cocoa に接続してるんだと思うんだけど。 C レベルだと SDL は main をマクロで置き換えて独自の初期化を入れているが、 Ruby だとそういうことができないので死ぬと。
ただ、一つめの問題と二つめの問題は 重複しているような気がするんだよな。 拡張ライブラリか、せめて組み込み Ruby インターフェイスでどうにかできんのかこれ。 だいたい SDL にしても、 main をマクロで置き換えるしか手段がないというのは酷い。 なんか代替手段はないのかよこれ。
SDL のソースコードを見てみた。……うーん、ほとんど当たってる。 そもそも、rubyw を作るパッチてのが SDL から切り出したように見えるな。 関数の名前が全部同じだ。
これで SDL の関数を呼んでいなければ 単純に rubyw で置き換えられるわけだが、 そういうわけにもいかなそうだなあ。 そもそも rubyw パッチはちゃんと動いてたのか? 見る限り、src/main/macosx/SDLmain.m には SDL アプリケーションを終了させる専用コードが入ってるから、 これを省略しちゃったらまずいんではなかろうか。 それとも SDL の quit イベントというのは Cocoa の終了イベントそのものなのかな。 それなら実際には問題は起こらないけど。
うーん。とりあえず、rubyw パッチをパッチじゃなくて 組み込み Ruby アプリケーションにしてみようかな。 いまどき 1.8.2 なんて使いたくないし。
(22:05)
パッチをファイルに戻して、 1.9 でも rubyw を作れるようになった。 ……と思ったけど、なぜか 1.8.2 の libruby にリンクされている。 cc に -L を付けるのを忘れてた。
動いた。ちゃんと Dock に出てくるなあ。 でも終了ハンドラがないので強制終了しかできない。
うーむ、作ってみてわかったんだが、 これは RubyCocoa の処理とかなり重なってるような気がする。 うまく組み合わせれば pure Ruby + RubyCocoa + Ruby/SDL で行けるのではないか。 見た感じ、SDL の独自の初期化のほとんどは RubyCocoa で書けそうである。 いまのところ足りないことがわかってるのはプログラム終了部分で、 SDL のイベントを送らなければいけないように見える。 ここを Ruby/SDL のコードで (Rubyで) 書けば パッチも拡張ライブラリも組み込み Ruby もなしで行けるのではないか (もちろん RubyCocoa と Ruby/SDL は拡張モジュールだけど)。
(23:47)
うーん、やっぱ当面は rsdl を使うのがてっとりばやいな。 もうちょっと俺の RubyCocoa での経験値があがったらどうにかできるやもしれん。
(02:37)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.