【问题标题】:autoconf check for missing prototypeautoconf 检查丢失的原型
【发布时间】:2015-02-17 16:37:33
【问题描述】:

有没有比将 CFLAGS 设置为“-Werror -Wimplicit-function-declaration”更好的方法来为丢失的原型编写 autoconf 测试?

具体来说,我正在尝试确定是否需要提供我自己的pwrite(2)pread(2)。如果环境是严格的,则不定义 pread/pwrite。 这是我现在所拥有的,它有效:

AC_INIT([pwrite],[0.0.0],[none],[nothing],[nowhere])

AC_CONFIG_HEADERS([config.h])
old_CFLAGS=$CFLAGS
CFLAGS="-Werror $CFLAGS"

AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
    #ifdef HAVE_UNISTD_H
    #include <unistd.h>
    #endif

    int main(int argc, char **argv) {
        int ret = pwrite(99, "blah", 1, 0);
        return 0;
    } ]) ],
    AC_MSG_RESULT([using system pwrite prototype])
    AC_DEFINE(HAVE_PWRITE, 1, [pwrite protoype exists]),
    AC_MSG_RESULT([no pwrite protoype. using our own])
    )

CFLAGS=$old_CFLAGS

AC_OUTPUT()

当我这样做时,configure CFLAGS=-std=c99 确实会检测到 pwrite 是隐式声明的,而仅configure 就会在 unistd.h 中找到一个 pwrite 原型。但是,在 configure 中使用 CFLAGS 似乎不是“autoconf-y”的方式来做到这一点。

【问题讨论】:

    标签: autoconf


    【解决方案1】:

    如果您查看 autoconf 宏的来源,您会发现其中很多都保存和恢复 CFLAGS。但是,您需要非常小心地使用-Werror,因为您可能会得到不正确的结果。例如,如果 argcargv 未使用 - 与 ret 一样 - 警告(请参阅:-Wunused* 标志)将被解释为 pwrite 不可用。

    假设 &lt;unistd.h&gt; 编译时没有警告错误,它应该:

    <save CFLAGS>
    CFLAGS="$CFLAGS -Werror=implicit-function-declaration"
    
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
      [[#ifdef HAVE_UNISTD_H
        #include <unistd.h>
        #endif]],
      [[(void) pwrite(99, "blah", 1, 0);]])],
      <action-on-success>,
      <action-on-fail>)
    
    <restore CFLAGS>
    

    (void) 演员可能是不必要的 - 它用于疯狂严格的警告,即使对于系统标头也可能不会保持沉默,但不会造成伤害。可能值得查看 _XOPEN_SOURCE 宏值 - 例如,在此测试和库代码中设置 _XOPEN_SOURCE

    【讨论】:

      【解决方案2】:

      保存/恢复 CFLAGS 是可以接受的,但出于这个特定目的,AC_CHECK_DECLS 正是我所寻找的,而且对于超级挑剔的编译器或试图弄清楚什么是波特兰没有任何问题组编译器等效于 -Werror-implicit-function-declaration。

      AC_INIT([pwrite],[0.0.0],[none],[nothing],[nowhere])
      AC_CONFIG_HEADERS([config.h])
      AC_CHECK_HEADERS([unistd.h])
      AC_CHECK_DECLS([pwrite])
      AC_OUTPUT()
      

      然后在我的代码中,我必须稍微检查一下结果:

      #if (HAVE_DECL_PWRITE == 0)
      ... implement our own pwrite 
      #endif
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 2012-11-19
        • 2013-11-12
        • 1970-01-01
        相关资源
        最近更新 更多