如何在configure.ac中检查特定的gcc特性?

how can I check a particular gcc feature in configure.ac

本文关键字:gcc 特性 检查 configure ac      更新时间:2023-10-16

例如,gcc 4.7有一个新特性- wnarrowness。在配置。我如何测试当前gcc是否支持某个特性?
在gnulibc中有一个文件,但对我来说没有多大意义。

gcc和clang都支持-W[no-]narrowing-W[no-]error=narrowing选项

对于-std=c++11, gcc默认发出警告, clang默认发出错误。尽管您只提到了gcc,但我认为您可以将功能检查扩展到像clang这样试图提供相同选项和扩展的编译器。这可能也包括英特尔的icc。

让我们假设您已经选择了带有AC_PROG_CXX的c++编译器,并确保它使用c++ 11标准。

ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS -Werror -Wno-error=narrowing"
AC_LANG_PUSH([C++])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
  [[int i {1.0}; (void) i;]])],
  [ac_cxx_warn_narrowing=1], [ac_cxx_warn_narrowing=0])
AS_IF([test $ac_cxx_warn_narrowing -ne 0],
  [AC_MSG_RESULT(['$CXX' supports -Wnarrowing])])
AC_LANG_POP([C++])
CXXFLAGS="$ac_save_CXXFLAGS"

编译只有在以下情况下才能成功:1)编译器支持-Wnarrowing相关选项,这意味着它支持-Werror,并且:2)识别c++ 11初始化语法。

通常,传递给configure的configure.ac脚本和标志应该避免-Werror,因为它破坏了太多的内部测试。在这种情况下,我们确保除了收缩之外没有其他警告,这就是为什么需要(void) i;来防止关于未使用变量的警告。

这背后的逻辑应该是:

创建一个正确的文件,使用-Wnarrowing应该得到一个警告。验证它是否被正确编译。

然后用-Wnarrowing编译相同的文件,并验证它仍然被正确编译。这可以确保您检测到不支持-Wnarrowing作为选项的编译器,并且不会试图将虚假选项传递给它们。

最后,用-Werror=narrowing编译相同的文件,并验证它现在没有被正确编译。如果现在失败了,您可以相当肯定编译器确实支持-Wnarrowing。最后一项检查对于检测接受-Wnarrowing/-Werror=narrowing的编译器很有用,但会发出警告"忽略未知选项- wnarrow"。在这种情况下,你不应该传递-Wnarrowing

可选地,您可能还希望编译一个不应该在-Wnarrowing-Werror=narrowing获得警告的文件,以防您发现-Wnarrowing无用而-Werror=narrowing是硬错误的编译器。但是,我想不出有哪个编译器需要这样做。

将其转换为配置检查应该是微不足道的。

请参阅http://code.google.com/p/opendoom/source/browse/trunk/VisualC8/autotools/ac_c_compile_flags.m4以获得此类示例测试-该测试尝试使用给定的编译器标志编译一个普通程序,并在其工作时将其添加到CFLAGS中。