« RubyCocoa で非定型プロトコルの objc_export を自動的に | トップページ | bcscan 2007.02.18 版 »

2007.02.18

RubyCocoa の .app コマンドラインツールでのオプション操作

bcscan にオプションを追加しようと、optparse でオプションを書いてみたら。

 % bcscan --mirrored 
 /Users/kimuraw/build/Release/bcscan.app/Contents/MacOS/bcscan:
 invalid option --mirrored  (-h will show valid options)

と言われてしまう。あー、そうか。 RubyCocoa では RBApplicationMain() でオプションは Ruby 側に渡されちゃうんだよな。前もなんかで悩んだような気がする。ようするに、

 % MyApp.app/Contents/MacOS/MyApp -foo -bar baz
 # -> ruby -foo -bar baz rb_main.rb

となるのだ。これはこれで便利なのだけど(-d とか -r とか)、独自のオプションを扱おうとすると上述のように Ruby 本体から「そんなオプション知らねーよ」と言われてしまう。しかたないので、main.m で

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

と、オプションを渡さないようにした上で、ruby スクリプト側で

 args = OSX::NSProcessInfo.processInfo.arguments.collect {|arg| arg.to_s}

と、NSProcessInfo から実際に渡されたオプションを取るようにした。

 % MyApp.app/Contents/MacOS/MyApp -foo -bar baz
 # -> ruby rb_main.rb -foo -bar baz 

となるような RBApplicationMain() の代替 API を RubyCocoa プロジェクトとして用意するといいのかな?

|

« RubyCocoa で非定型プロトコルの objc_export を自動的に | トップページ | bcscan 2007.02.18 版 »