iPhone で Ruby/RubyCocoa を動かしてみた
iPhoneでC#アプリが審査に通るワケという記事に刺激されて、CILが動くんだったらRubyも動くよな、とか思って、iPhone SDKで、Rubyの移植から始めてみました。結論から言うと、Ruby / RubyCocoa ともに、実機/シミュレータともなんとなく動いてます。
上のスクリーンショットのアプリを書くのに必要なRubyコード
こんな感じです。Mac版のRubyCocoaの書き方をそのまま踏襲できます。
require 'rubycocoa' class MyAppDelegate < OSX::NSObject def applicationDidFinishLaunching(application) @window = OSX::UIWindow.alloc.initWithFrame(OSX::UIScreen.mainScreen.bounds) @window.setBackgroundColor(OSX::UIColor.darkGrayColor) @window.makeKeyAndVisible @textView = OSX::UILabel.alloc.initWithFrame(OSX::UIScreen.mainScreen.bounds) @textView.setText("hello RubyCocoa world") @textView.setTextAlignment(OSX::UITextAlignmentCenter) @textView.setFont(OSX::UIFont.boldSystemFontOfSize(24)) @textView.setTextColor(OSX::UIColor.whiteColor) @textView.setBackgroundColor(OSX::UIColor.clearColor) @window.addSubview(@textView) end end OSX.UIApplicationMain(0, nil, nil, "MyAppDelegate")
要するに?
要するにiPhone SDKでRubyとRubyCocoaが(なんとなく)動きました。Ruby本体は、拡張(ext/)を含め、すべて static link にしています。RubyCocoaのほうは、最新のものは libffi というライブラリがiPhone実機で動かないため、0.4.2という5年前ぐらいの実装からちょっとパッチをあてていった感じです。
コード
http://github.com/takuma104/iphone-rubycocoa/tree/master
github に上げておきました。(gitめんどくさい人は、downloadボタンでtarballとれますよ) ここで開発を継続予定です。とりあえずiPhone SDKがあればコンパイルして、main.rbをいろいろ書き換えとかで遊べるかもしれません。Device2.0およびSimulator2.0で動作を確認しています。
この RubyCocoa のライセンスはRubyと同じにしたいのですが、RubyCocoa 0.4.2 は LGPL だったみたいです。最新はRubyと同じようです。*1 RubyCocoaのオリジナルの作者の藤本さんに確認して、どうやら、RubyCocoaのライセンスをLGPLからLGPL+RubyLicenseのdual licenseにした時点で過去に遡って適用したとのことでした。ので、現状githubのライセンスファイルをそのように入れ換えてあります。ということで、Ruby本体も含め、Ruby Licenseを選択可能となりました。
今できていること
- Ruby本体:samples/test.rbがほぼ動いている。test/test_*.rbは未テスト。socketもなんとなく動いてるっぽい。
- RubyCocoa:あんまりテストしてない。とりあえずこのhello world出たレベル。
今できてないこと
Ruby本体:実機でなんか例外処理のtrapがヘン?? 実機での longjmp() の動作に何か問題があるのかも。解決しました http://d.hatena.ne.jp/takuma104/20090301/1235927945- RubyCocoa:BridgeSupport相当が入ってないので、その辺手作業でなんとかするorBridgeSupportをbackportする
- AppStore審査通るかの確認 ;)
*1:この辺どなたにご相談すれば良いんでしょうかねえ??