きりかノート 3冊め

おあそびプログラミング

RubyCocoa 昨日-今日のコミット standaloneifyの修正の続き 2012-11-01

まだおかしかった、、、

standaloneifyが機能するためには

  • 実行ファイル(YourApp.app/Contents/MacOS/YourApp)に渡したオプションによって動作が切り替えできる
  • rubyスクリプトを渡したときにはrb_main.rbでなく、そのファイルが$0として実行される(ruby_run()を呼ぶ)

というようになっている必要がある。このruby_run()を呼ぶかどうかの判定が甘くて、standaloneifyは機能するけれどアプリが起動しなくなっていた。

  • 今回の対策その1。オプションをparseして、スクリプトが与えられているときのみそのファイルを$0とする。(r2406)
  • 今回の対策その2。環境変数"RUBYCOCOA_STANDALONEIFYING?"が設定されているときのみオプションのスクリプトを$0とする。(r2408)

その1がうまく動かないケース(strncmp()がSEGVする、$LOAD_PATHが適切に設定されない)があったので、けっきょくその2で対処することに。やっぱ将来的にはパッケージするライブラリを明示してアプリ内に配置できるようになるべきだと思うのです。うまいことBundlerそのまんま使えないかなあと妄想はしてるけど、なんも手つけてないっす。

RBApplicationMain()とRBApplicationInit() + NSApplicationMain()のちがいについて

前にもどっかに書いた気がするんだけど見つからなかったのでここにメモ。RubyCocoaアプリの初期処理には、

   int
   main(int argc, const char* argv[])
   {
     return RBApplicationMain("rb_main.rb", argc, argv);
   }

   int
   main(int argc, const char* argv[])
   {
RBApplicationInit("rb_main.rb", argc, (const char **)argv, nil);
return NSApplicationMain(argc, (const char **)argv);
   }

の2通りがあって、後者が新しい形式。「新しい」といっても2006年くらいからあったぽい。

この2つの最大のちがいは「NSApplicationMain()に実行時のオプションが渡されるかどうか」だと思う。前者だと、rb_main.rb内でOSX::NSApplicationMainを読んでるけど、そこではオプションは渡されない。なのでXcodeのいくつかのデバッグ機能などが前者では使えないことになる。

あとはrubyインタプリタに渡されるオプションも差があるんだけど、最近の変更でだいたい同じになった。