RubyCocoa 今日のコミット 2012-09-17 standaloneifyが動くように
Xcode 4の謎実行パラメータに付き合わないために、1.0.4ではRubyCocoa自体はコマンドラインパラメータの解釈をせずにNSApplicationMain()にそのまま渡すようにした。んだけど、その副作用でstandaloneify.rbが動かなくなってしまった。
standaloneify.rbは実行時に必要なライブラリやフレームワークを判断するために、
YourApp.app/Contents/MacOS/YourApp .../standaloneify.rb --standaloneify
という形式でアプリを実行し、アプリの実行をstandaloneify.rbで乗っ取るという手法をとっていた。これは、(1.0.2以前の)RubyCocoaが内部的に
rb_main.rb [残りのパラメータ]
という形式でrubyインタプリタのオプションを処理していたためで、ここでパラメータにrubyスクリプトファイルを渡すと実行されるのがrb_main.rbでなくそのファイルになるというウラ技を応用したもの。
で、1.0.4でパラメータをruby側に渡す処理をまるごとやめた(2011-11)ために、standaloneifyが動かなくなっていたのだ。
でまあ対策としては、
- アプリを実行する以外の方法で依存関係を取得する
- 1.0.2以前のようにパラメータをrubyに渡せるようにする
のいずれかになる。本来は前者がスマートだし望ましいけれど、rubyスクリプト側でrequireしたやつもあるのでけっこうたいへんそうだ。ということで後者に。
ただし、ただ仕様を戻しただけではXcodeから実行したときにまたエラーになってしまう。ということで、
- "--rubycocoa-ruby-opt"というナゾのパラメータを導入。これ以降に指定されたパラメータはrubyインタプリタのオプションと見なす。(r2381)
- RubyCocoa.frameworkのバージョンが1.0.4以降のとき、standaloneifyは--rubycocoa-ruby-optを付けてアプリを呼び出すように。(r2383)
あとアプリ内にコピーしたライブラリのパーミッションがなぜか0700という問題があったので直した。(r2382)
であとstandaloneify.rbで残ってる作業は、
- 必ず/System/LibraryのRubyCocoa.frameworkが優先されてしまうので選べるように
- gemがうまくコピーできないことがあるらしいので、その調査と(必要なら)修正
あたり。
このへんの作業と、テンプレートの導入ツールを用意したら、1.0.5をリリースするつもり。