是否有更好的方法为缺少的原型编写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进行混乱似乎不是“自动配置”方式。
答案 0 :(得分:1)
如果查看autoconf宏的来源,您会发现很多宏保存并恢复CFLAGS。但是,您需要非常小心地使用-Werror
,因为您可能会得到不正确的结果。例如,如果argc
,argv
未使用 - 原样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)
保存/恢复CFLAGS是可以接受的,但出于这个特殊目的,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