68452


[RubyCocoa](https://github.com/rubycocoa/rubycocoa)
をインストールしたいと思っていろいろ試しているのですが、コンパイルエラーで悩んでいます。  
以下の手順で進めています。

[code]

    % brew install ruby
    ・パスに /usr/local/opt/ruby/bin を追加
    % ruby -v
    ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19]
    % git clone https://github.com/rubycocoa/rubycocoa.git
    % cd rubycocoa
    % gem install rake-compiler xcjobs
    % rake
    ../../../../ext/rubycocoa/OverrideMixin.m:303:17: error: too many arguments to function call,
          expected 0, have 3
      ret = (*simp)(rcv, method, arg0);
            ~~~~~~~ ^~~~~~~~~~~~~~~~~
    ../../../../ext/rubycocoa/OverrideMixin.m:317:13: error: too many arguments to function call,
          expected 0, have 3
        (*simp)(rcv, method, arg0);
        ~~~~~~~ ^~~~~~~~~~~~~~~~~
    11 warnings and 2 errors generated.
    make: *** [OverrideMixin.o] Error 1
    rake aborted!
    
[/code]

他にもwarningがたくさん出ますが、エラーはこの2つだけでした。  
どう修正すればコンパイルできるようになるか、教えてもらえませんでしょうか。


CC BY-SA 4.0
2020-07-09T03:19:18.710
68419
2020-07-10T00:34:26.260
2020-07-10T00:34:26.260
3060
41008
question
ruby objective-c macos
RubyCocoa のインストール時、コンパイルエラーが発生する


まず、エラーの原因は、ある(C言語の)関数の先頭アドレスと見なせるアドレスを取得して、そのアドレスにある関数を引数付きで呼び出したい。というソースコードに対し、

Cコンパイラーが「引数が明示的に定義されていないので、0個の引数の関数（とコンパイラはみなしている）呼び出しなのに、引数が3個もある関数呼び出しをしているので矛盾してるよ」  
というエラーです。

ではどうするか？というと、変数と同様に、そのアドレスが入っている変数を関数のプロトタイプにキャストしてあげます。  
一応前後の文脈から見てキャストは間違っていないと思いますが、このファイルを直すと、次のファイルがエラーになります。  
ここで起きているエラーも同様なので、同じように修正します。  
すると、もうひとつのファイルもエラーになるので、同じように修正します。これで、ワーニングはあるものの、コンパイルは通るようになりました。

ただし、質問はコンパイルエラーをどう修正するか？なので、コンパイルされたライブラリーが正しく動くか？は申し訳ありませんが、検証していません（最終リリースから時間が経っているので、修正した部分起因で動かないのか、OSのバージョンアップ起因で動かないのか、切り分けが出来ないので）

修正した差分の`patch`ファイルを作ってみました。  
`patch`の当て方がわからない場合は`-`で始まる行と完全一致する行を探して、`+`で始まる行の内容に置き換えて下さい。

[code]

    diff --git a/ext/rubycocoa/mdl_bundle_support.m b/ext/rubycocoa/mdl_bundle_support.m
    index 2c1bb3d88fc73dc455ac8723154a376f15b3ff79..77d3218758b6810699aa0baff9779105c027d8ac 100644
    --- a/ext/rubycocoa/mdl_bundle_support.m
    +++ b/ext/rubycocoa/mdl_bundle_support.m
    @@ -203,7 +203,7 @@ static id rubycocoa_bundleForClass(id rcv, SEL op, id klass)
     {
       id bundle = bundle_for_class(klass);
       if (! bundle)
    -    bundle = original_bundleForClass(rcv, op, klass);
    +    bundle = (((id (*)(id, SEL, id))original_bundleForClass)(rcv, op, klass));
       return bundle;
     }
     
    diff --git a/ext/rubycocoa/OverrideMixin.m b/ext/rubycocoa/OverrideMixin.m
    index 2fd51ffae7671b89b173622603a73f1fc39c6a67..299f9a2ab9d2399227c72e232e85299ecd25155e 100644
    --- a/ext/rubycocoa/OverrideMixin.m
    +++ b/ext/rubycocoa/OverrideMixin.m
    @@ -300,7 +300,7 @@ static id imp_methodSignatureForSelector (id rcv, SEL method, SEL arg0)
     {
       id ret;
       IMP simp = super_imp(rcv, method, (IMP)imp_methodSignatureForSelector);
    -  ret = (*simp)(rcv, method, arg0);
    +  ret = ((id (*)(id, SEL, SEL))*simp)(rcv, method, arg0);
       if (ret == nil)
         ret = [get_slave(rcv) methodSignatureForSelector: arg0];
       return ret;
    @@ -314,7 +314,7 @@ static id imp_forwardInvocation (id rcv, SEL method, NSInvocation* arg0)
       if ([slave respondsToSelector: [arg0 selector]])
         [slave forwardInvocation: arg0];
       else
    -    (*simp)(rcv, method, arg0);
    +    ((id (*)(id, SEL, SEL))*simp)(rcv, method, arg0);
       return nil;
     }
     
    diff --git a/ext/rubycocoa/mdl_objwrapper.m b/ext/rubycocoa/mdl_objwrapper.m
    index 08cb5d861494aa4c6b974a6bd9bce49e0d165631..1f1adecb493eda21ab93532a0ac2161c86467d74 100644
    --- a/ext/rubycocoa/mdl_objwrapper.m
    +++ b/ext/rubycocoa/mdl_objwrapper.m
    @@ -372,7 +372,7 @@ ocm_send(int argc, VALUE* argv, VALUE rcv, VALUE* result)
         exception = Qnil;
         @try {
           OBJWRP_LOG("direct call easy method %s imp %p", sel_getName(selector), imp);
    -      val = (*imp)(oc_rcv, selector);
    +      val = ((id (*)(id, SEL))*imp)(oc_rcv, selector);
         }
         @catch (id oc_exception) {
           OBJWRP_LOG("got objc exception '%@' -- forwarding...", oc_exception);
    
[/code]


CC BY-SA 4.0
2020-07-09T17:33:42.903
68452
2020-07-09T17:33:42.903
14745
68419
answer