2016-11-12 22 views
1

问题:在Ruby解释器C代码中,有几段在macOS和BSD上调用__syscall函数。这在macOS领域是非常糟糕的行为,因为它是一个私有(和易失性)API。如何通过将参数传递给Autoconf来取消定义HAVE_ [function]宏?

__syscall的用法只包括有条件地基于HAVE_定义,所以我想知道是否可以在没有它的情况下编译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解释器源来执行此操作,因为这将导致fork的连续繁琐维护。相反,我想在编译Ruby的时候向构建工具传递一个参数。

问题:我可以强制相关HAVE__宏之一是不确定的,或者是在configure.in禁用AC_CHECK_HEADERS,所以防止利用__syscall这里,通过传递的参数来构建工具?

+0

你达再生配置脚本?如果是这样,你只需创建一个合适的文件(例如'acmacsyscall.m4'),它包含你需要的代码,然后调整构建过程,以便拾取文件(可能使用'aclocal -I .'作为步骤 - 或者如果你将'.m4'文件保存在其他地方,则是一个不同的目录)。当然,你也必须安排调用这个宏。这可能意味着在'configure.ac'的某个地方添加一行,或者'configure'脚本的顶级构建使用任何输入文件。 –

回答

0

您应该可以在./configure时间调整ac_cv_*变量之一。

特别是,对于红宝石2.1.9这应该工作:

./configure ac_cv_func___syscall=no 

(仅供参考,你可以看到ac_cv_*变量config.log设置。)

相关问题