如何通过将参数传递给Autoconf来取消定义HAVE_ [function]宏?

时间:2016-11-12 16:11:06

标签: c ruby macros autoconf

问题:在Ruby解释器C代码中,有几个部分在macOS和BSD上调用__syscall函数。这在macOS领域是非常糟糕的行为,因为它是一个私有(和易失性)API。

__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,方法是将参数传递给构建工具?

1 个答案:

答案 0 :(得分:0)

您应该能够在eax时调整其中一个ac_cv_*变量。

特别是对于ruby-2.1.9,这应该有效:

./configure

(作为参考,您可以看到./configure ac_cv_func___syscall=no 中设置的ac_cv_*变量。)