如何通过将参数传递给 Autoconf 来取消定义 HAVE_[function] 宏?
How can I undefine a HAVE_[function] macro by passing arguments to 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 (Fiddle) 库代替它。
约束: 我不想分叉 Ruby 解释器源代码来执行此操作,因为这将导致分叉的持续繁琐维护。相反,我想在编译 Ruby 时向构建工具传递一个参数。
问题: 我能否强制未定义相关的 HAVE__ 宏之一,或者禁用 configure.in 中的 AC_CHECK_HEADERS , 因此通过将参数传递给构建工具来防止在此处使用 __syscall?
您应该能够在 ./configure
时调整 ac_cv_*
变量之一。
特别是对于 ruby-2.1.9 这应该有效:
./configure ac_cv_func___syscall=no
(作为参考,您可以查看 config.log
中设置的 ac_cv_*
变量。)
问题: 在 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 (Fiddle) 库代替它。
约束: 我不想分叉 Ruby 解释器源代码来执行此操作,因为这将导致分叉的持续繁琐维护。相反,我想在编译 Ruby 时向构建工具传递一个参数。
问题: 我能否强制未定义相关的 HAVE__ 宏之一,或者禁用 configure.in 中的 AC_CHECK_HEADERS , 因此通过将参数传递给构建工具来防止在此处使用 __syscall?
您应该能够在 ./configure
时调整 ac_cv_*
变量之一。
特别是对于 ruby-2.1.9 这应该有效:
./configure ac_cv_func___syscall=no
(作为参考,您可以查看 config.log
中设置的 ac_cv_*
变量。)