Проблема: В коде C интерпретатора Ruby есть пара разделов, которые вызывают функцию __syscall на macOS и BSD. Это очень плохое поведение на земле macOS, потому что это частный (и изменчивый) API.Как я могу определить макрос HAVE_ [function], передав аргументы Autoconf?
Использование __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
}
зоркие читатели также заметить, что даже дэвы Рубин не нравится использовать __syscall - они хотят, чтобы заменить его с библиотекой DL (Fiddle) вместо этого.
Ограничение: Я не хочу раскодировать источник интерпретатора Ruby для этого, поскольку это приведет к непрерывному громоздкому обслуживанию вилки. Вместо этого я хотел бы передать аргумент инструменту построения, когда он компилирует Ruby, который делает это.
Вопрос: Могу ли я заставить одну из соответствующих HAVE__ макросов быть определено, или, возможно, отключить AC_CHECK_HEADERS в configure.in, и таким образом предотвратить использование __syscall здесь, переходя аргумент в инструмент для сборки?
Готовы ли вы к регенерации скрипта конфигурации? Если это так, вы просто создаете подходящий файл (например, 'acmacsyscall.m4'), который содержит необходимый вам код, а затем настраивайте процесс сборки так, чтобы файл был поднят (возможно, с помощью' aclocal -I .' в качестве шага - или другой каталог, если вы храните файл '.m4' в другом месте). Разумеется, вам также необходимо назначить макрос. это может означать добавление строки где-то в 'configure.ac' или любой другой входной файл для сборки верхнего уровня скрипта' configure'. –