我们使用autotools作为构建基础架构,我们使用clang和gcc作为编译器。最近我们遇到了需要的gcc警告
--param max-vartrack-size=100000000
沉默(没有完全禁用gcc的vartracking)。 Clang不接受该选项并产生
argument unused during compilation: '--param max-vartrack-size=100000000'
要保持沉默,铿锵需要
-Qunused-arguments
并且在gcc下产生错误:
unrecognized command line option ‘-Qunused-arguments’
在选择编译器后,configure.ac
中定义编译器特定标志的最佳方法是什么? AC_PROG_CXX
?我们AC_SUBST(AM_CXXFLAGS)
所以我想我会在AM_CXXFLAGS
内扩展编译器特定变量。
在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中取代HAVE_*
vars。 AC_PROG_CXX/CC
或许已经定义了这样的东西吗?
答案 0 :(得分:3)
AM_CXXFLAGS
不应该AC_SUBST
。它保留供automake使用。如果您查看为C ++目标生成的Makefile
,您会找到CXXCOMPILE
和LTCXXCOMPILE
的定义,这些定义始终包含AM_CXXFLAGS
变量。
您希望将(条件)编译器标志添加到AM_CXXFLAGS
或libfoo_la_CXXFLAGS
。前者将影响所有C ++编译,后者只影响每个库的编译。因此,只需在SPECIFIC_CXXFLAGS
中获取configure.ac
即可。
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只测试{{1}}宏(AFAIK),因此clang ++将设置:__GNUC__
问题是,没有一种可移植的方法来检测未知的命令行选项。英特尔GXX=yes
甚至会重现icc -v
字符串。因此,您可能需要添加其他过滤器,例如:gcc version
您可以选择检查该标志是否像| 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)
答案 1 :(得分:1)
如果某个标志产生错误,则很容易编写m4宏来检测编译器是否支持此标志。
从autoconf档案中检查ax_check_compile_flag。