2016-11-12 4 views
1

Проблема: В коде 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 здесь, переходя аргумент в инструмент для сборки?

+0

Готовы ли вы к регенерации скрипта конфигурации? Если это так, вы просто создаете подходящий файл (например, 'acmacsyscall.m4'), который содержит необходимый вам код, а затем настраивайте процесс сборки так, чтобы файл был поднят (возможно, с помощью' aclocal -I .' в качестве шага - или другой каталог, если вы храните файл '.m4' в другом месте). Разумеется, вам также необходимо назначить макрос. это может означать добавление строки где-то в 'configure.ac' или любой другой входной файл для сборки верхнего уровня скрипта' configure'. –

ответ

0

Вы должны иметь возможность настроить одну из переменных ac_cv_* на ./configure времени.

В частности, для рубинового 2.1.9 это должно работать:

./configure ac_cv_func___syscall=no 

(Для справки, вы можете увидеть ac_cv_* набор переменных в config.log.)

 Смежные вопросы

  • Нет связанных вопросов^_^