autoconf检查缺少的原型

时间:2015-02-17 16:37:33

标签: autoconf

是否有更好的方法为缺少的原型编写autoconf测试,而不是将CFLAGS设置为“-Werror -Wimplicit-function-declaration”?

具体来说,我正在尝试确定是否需要提供自己的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原型。然而,在配置中使用CFLAGS进行混乱似乎不是“自动配置”方式。

2 个答案:

答案 0 :(得分:1)

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

假设<unistd.h>编译没有警告错误,它应该:

<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和库代码。

答案 1 :(得分:1)

保存/恢复CFLA​​GS是可以接受的,但出于这个特殊目的,AC_CHECK_DECLS正是我正在寻找的,而且对于超级挑剔的编译器没有任何问题或试图找出什么是Portland Group编译器等效于-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