Gcc 如何使用自动工具设置特定于编译器的标志
我们使用autotools作为构建基础设施,使用clang和gcc作为编译器。最近我们遇到了一个gcc警告,需要Gcc 如何使用自动工具设置特定于编译器的标志,gcc,clang,autotools,compiler-options,Gcc,Clang,Autotools,Compiler Options,我们使用autotools作为构建基础设施,使用clang和gcc作为编译器。最近我们遇到了一个gcc警告,需要 --param max-vartrack-size=100000000 静音(不完全禁用gcc的vartracking)。Clang不接受该选项并产生 argument unused during compilation: '--param max-vartrack-size=100000000' 为了让这一切安静下来,clang需要 -Qunused-arguments 这在
--param max-vartrack-size=100000000
静音(不完全禁用gcc的vartracking)。Clang不接受该选项并产生
argument unused during compilation: '--param max-vartrack-size=100000000'
为了让这一切安静下来,clang需要
-Qunused-arguments
这在gcc下会产生一个错误:
unrecognized command line option ‘-Qunused-arguments’
ac\u PROG\u CXX
选择编译器后,在configure.ac
中定义编译器特定标志的最佳方法是什么?我们AC_SUBST(AM_CXXFLAGS)
所以我想我应该在AM_cxflags
中扩展编译器特定的变量Makefile.am
中为一个编译器启用每个目标选项的正确方法是什么?我在想:
if HAVE_GCC
SPECIFIC_CXXFLAGS = --param...
endif
if HAVE_CLANG
SPECIFIC_CXXFLAGS = -Q...
endif
libfoo_la_CXXFLAGS = $(AM_CXXFLAGS) $(SPECIFIC_CXXFLAGS)
但是我需要configure.ac中的
替换变量。是否AC\u PROG\u CXX/CC
可能已经定义了类似的内容?如果某个标志产生错误,则很容易编写m4宏来检测编译器是否支持该标志
从autoconf存档中检查ax\u Check\u compile\u标志。AM\u CXXFLAGS
不是您应该做的事情。它是为汽车制造商保留的。如果您查看生成C++代码的<代码> MaFaMeX < /C> >,您将发现“<代码> CXXCOMPUCTION/COD>和 LTCXXXPUCTION/CODE >,其中始终包含<代码> AycxXFLACK< <代码>变量
您想将(条件)编译器标志添加到AM\u cxflags
或libfoo\u la\u cxflags
。前者将影响所有C++编译,后者只影响每个库编译。因此,只需在configure.ac
中获得特定的\u CXXFLAGS
即可
AC_PROG_CXX
...
FOO_SPECIFIC_CXXFLAGS=;
if `$CXX -v 2>&1 | grep 'gcc version' >/dev/null 2>&1` ; then
FOO_SPECIFIC_CXXFLAGS="--param max-vartrack-size=100000000"
fi
AC_SUBST(FOO_SPECIFIC_CXXFLAGS, $FOO_SPECIFIC_CXXFLAGS)
GXX
测试不充分,因为autoconf只测试\uuuu GNUC\uuuu
宏(AFAIK),所以clang++将设置:GXX=yes
问题是,没有一种可移植的方法来检测未知的命令行选项。英特尔的icc-v
甚至会复制gcc版本
字符串。因此,您可能需要添加另一个过滤器,如:| grep-v'icc'
您可以选择检查标志是否与AC_SUBST
之前公布的一样工作,但如果编译器只生成一个警告,则这实际上没有帮助:
saved_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS $FOO_SPECIFIC_CXXFLAGS"
AC_LANG_PUSH([C++])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],,[FOO_SPECIFIC_CXXFLAGS=;])
AC_LANG_POP([C++])
CXXFLAGS="$saved_CXXFLAGS"
然后在Makefile.am
中:
AM_CXXFLAGS = $(FOO_SPECIFIC_CXXFLAGS)
或:
我对你的说法感到不解,你说一个人不应该做任何事。这与手动在所有15ishMakefile.AM
s中设置AM\u CXXFLAGS
有何不同AC_SUBST
ingAM_cxflags
是默认情况下为整个项目启用警告或使用gcc 5.1选择较旧的ABI(所有对象都需要相同)的完美解决方案。除了在每个Makefile.AM
s中设置AM\u cxflags
之外,我还能如何实现这一点?我选择在configure.ac中添加两个AM\u CONDITIONAL
s、HAVE\u GCC
和HAVE\u CLANG
,条件测试等同于您的grep
检查。谢谢@Irfy-这就是cxflags
的用途。您可以通过cxflags
将编译器特定的标志传递给configure
,或在configure.ac
中添加/修改cxflags
标志。这个变量也包含在C++的构建规则中。我确信这是正确的方法,但是因为它是一个内部项目,而不是分布式的,所以我选择了最简单的可能的东西,它原来是两个<代码> AM-条件< /代码> s。
libfoo_la_CXXFLAGS = $(FOO_SPECIFIC_CXXFLAGS)