如何使用autotools设置特定于编译器的标志

时间:2015-06-10 09:54:20

标签: 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'

要保持沉默,铿锵需要

-Qunused-arguments

并且在gcc下产生错误:

unrecognized command line option ‘-Qunused-arguments’
  1. 在选择编译器后,configure.ac中定义编译器特定标志的最佳方法是什么? AC_PROG_CXX?我们AC_SUBST(AM_CXXFLAGS)所以我想我会在AM_CXXFLAGS内扩展编译器特定变量。

  2. Makefile.am中为一个编译器启用每个目标选项的正确方法是什么?我在考虑:

    if HAVE_GCC
        SPECIFIC_CXXFLAGS = --param...
    endif
    if HAVE_CLANG
        SPECIFIC_CXXFLAGS = -Q...
    endif
    libfoo_la_CXXFLAGS = $(AM_CXXFLAGS) $(SPECIFIC_CXXFLAGS)
    
  3. 但我需要从configure.ac中取代HAVE_* vars。 AC_PROG_CXX/CC或许已经定义了这样的东西吗?

2 个答案:

答案 0 :(得分:3)

AM_CXXFLAGS不应该AC_SUBST。它保留供automake使用。如果您查看为C ++目标生成的Makefile,您会找到CXXCOMPILELTCXXCOMPILE的定义,这些定义始终包含AM_CXXFLAGS变量。

您希望将(条件)编译器标志添加到AM_CXXFLAGSlibfoo_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。