簡體   English   中英

如何通過將參數傳遞給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(小提琴)庫代替它。

約束:我不想分叉Ruby解釋器源來執行此操作,因為這會導致fork的連續繁瑣維護。 相反,我想在編譯執行此操作的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_*變量。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM