きりかノート 3冊め

おあそびプログラミング

RubyCocoa今週のコミット 2017-06-12..17

新しいmacOSのbetaでてたので試してみた。案の定いろいろ問題あったんだけど、それ以前に10.12で動いてないことにいまさら気付いた…

librubyに静的リンクしたRubyCocoaの生成を可能に

すっごい前にプルリクもらってたのをマージ。

なんかいろいろな変更が混ざってるからあとで見ようと思って完全に忘れてたですよ。

macOS 10.12でSEGVする問題を修正

以前に確認したような気がするんだけど、10.12だとrequire 'osx/cocoa'だけでSEGVするので対応。

どうも調べたところ、WebKitの内部クラスでrespondsToSelector:をちゃんと実装していないのがいくつかあって、それが原因らしい。そいつらはRuby側からも見えてる必要がないので無視するように変更した。

テストまわりの修正

  • QTKitの関数がなくなってたので、それらは実行しない。
  • ruby-2.4でFixnumの警告がでるのでIntegerに変更した。

10.11以降で付属のrubyで落ちる

OS付属のrubyでrequire 'osx/cocoa'すると、class_addMethod()のあたりで落ちる。たぶんSIP(System Integrity Protecton)で保護されてるため。たとえば/usr/bin/rubyを作業ディレクトリにコピーして、そのrubyから実行すると問題なく動作する。

なので、リンクした.appとかは問題ない。rubyスクリプトでなんかやろうとすると落ちる。

たぶんovmixのあたりの処理を見直して、Objective-C側で定義したクラスにメソッド追加とかできないように制御すれば落ちなくはなると思う。ちょっと優先度低め。

   diff --git a/install.rb b/install.rb
   index a57e53c..4fffc2f 100644
   --- a/install.rb
   +++ b/install.rb
   @@ -1088,6 +1088,7 @@ class ToplevelInstaller < Installer
        ruby_cmd = '"' + File.join(RbConfig::CONFIG['bindir'],
                                   RbConfig::CONFIG['RUBY_INSTALL_NAME']) + '"'
        ruby_cmd = "/usr/bin/arch -#{@options['arch']} " + ruby_cmd if @options['arch']
   +    ruby_cmd = File.expand_path("../ruby", __FILE__)
        dive_into('test') {
          ENV['DYLD_FRAMEWORK_PATH'] = File.join('../framework', framework_obj_path)
          ENV['BRIDGE_SUPPORT_PATH'] = '../framework/bridge-support'
   diff --git a/test/util.rb b/test/util.rb
   index d65afe5..fbe9c54 100644
   --- a/test/util.rb
   +++ b/test/util.rb
   @@ -2,7 +2,8 @@
    module TestHelper

      def __spawn_line(line)
   -    cmd = "#{@ruby_path} -I../lib -I../ext/rubycocoa -e \"#{line}\""
   +    ruby_cmd = File.expand_path("../../ruby", __FILE__)
   +    cmd = "#{ruby_cmd} -I../lib -I../ext/rubycocoa -e \"#{line}\""
        cmd = cmd_with_dyld_env(cmd)
        res = IO.popen(cmd) {|io| io.read}
        raise "Can't spawn Ruby line: '#{line}'" unless $?.success?