2016-11-12 4 views
1

問題: RubyインタプリタのCコードには、macOSとBSDの__syscall関数を呼び出すいくつかのセクションがあります。これはプライベートな(そして揮発性の)APIなので、macOSの土地では非常に悪い行為です。Autoconfに引数を渡してHAVE_ [関数]マクロを定義解除するにはどうすればよいですか?

__syscallの使用法は、HAVE_の定義に基づいて条件付きでのみ使用されるため、Rubyを使用せずにRubyをコンパイルできるかどうか調べたいと思います。ここでio.cからの例です:

#if defined(HAVE___SYSCALL) && (defined(__APPLE__) || defined(__OpenBSD__)) 
/* Mac OS X and OpenBSD have __syscall but don't define it in headers */ 
    off_t __syscall(quad_t number, ...); 
#endif 

...some time later... 

static VALUE 
rb_f_syscall(int argc, VALUE *argv) 
{ 
    VALUE arg[8]; 

    ...a bunch of platform checks that usually end up doing this... 

    # define SYSCALL __syscall 

    ...some time later... 

    switch (argc) { 
     case 1: 
     retval = SYSCALL(num); 
     break; 
     case 2: 
     retval = SYSCALL(num, arg[0]); 
     break; 
     case 3: 
     retval = SYSCALL(num, arg[0],arg[1]); 
     break; 

     ... and so on up to case 8... 

    } 

    ... function returns and then... 

    #undef SYSCALL 
} 

シャープ目の読者さえもRubyの開発者が__syscallを使用して好きではないことに気づくだろう - 彼らは代わりにDL(フィドル)ライブラリとそれを交換したいです。

制約:私はRubyインタプリタソースをフォークしてフォークを連続的に扱いにくくするので、これをフォークしたくありません。代わりに、これを行うRubyをコンパイルするときにビルドツールに引数を渡したいと思います。

質問:は私が未定義であるか、または多分configure.inにAC_CHECK_HEADERSを無効にし、そのためのビルド・ツールに引数を渡すことで、ここで__syscallの使用を防止するために、関連HAVE__マクロのいずれかを強制することはできますか?

+0

はあなたがconfigureスクリプトを再生成するまではありますか?そうであれば、必要なコードを含む適当なファイル(例えば 'acmacsyscall.m4')を作成し、ビルドプロセスを微調整してファイルを取得するだけです(おそらく' aclocal -I .'をステップとして使うか、 '.m4'ファイルを他の場所に置いておくと別のディレクトリになります)。もちろん、呼び出すマクロを手配しなければなりません。これは 'configure.ac'のどこかにある行を追加することや、' configure'スクリプトの最上位ビルドに使用される入力ファイルを追加することを意味するかもしれません。 –

答えて

0

ac_cv_*変数の1つを./configure時間に調整する必要があります。

特に、ルビー-2.1.9のために、これは動作するはずです:

./configure ac_cv_func___syscall=no 

(。参考のために、あなたはconfig.logに設定ac_cv_*変数を見ることができます)

関連する問題