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

Irf*_*rfy 5 gcc autotools clang compiler-options

我们使用autotools作为构建基础架构,我们使用clang和gcc作为编译器.最近我们遇到了需要的gcc警告

--param max-vartrack-size=100000000
Run Code Online (Sandbox Code Playgroud)

沉默(没有完全禁用gcc的vartracking).Clang不接受该选项并生产

argument unused during compilation: '--param max-vartrack-size=100000000'
Run Code Online (Sandbox Code Playgroud)

为了保持沉默,铿锵需要

-Qunused-arguments
Run Code Online (Sandbox Code Playgroud)

并在gcc下产生错误:

unrecognized command line option ‘-Qunused-arguments’
Run Code Online (Sandbox Code Playgroud)
  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)
    
    Run Code Online (Sandbox Code Playgroud)

但我需要HAVE_*从configure.ac中取代变量.不要AC_PROG_CXX/CC或许已经定义了这样的事情?

Bre*_*ale 3

AM_CXXFLAGS这不是你应该做的事AC_SUBST。它保留供 automake 使用。如果您查看Makefile为 C++ 目标生成的生成文件,您会发现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)
Run Code Online (Sandbox Code Playgroud)

该GXX测试是不够的,因为 autoconf 仅测试宏__GNUC__(AFAIK),因此 clang++ 将设置: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"
Run Code Online (Sandbox Code Playgroud)

然后在Makefile.am:

AM_CXXFLAGS = $(FOO_SPECIFIC_CXXFLAGS)
Run Code Online (Sandbox Code Playgroud)

或者:

libfoo_la_CXXFLAGS = $(FOO_SPECIFIC_CXXFLAGS)
Run Code Online (Sandbox Code Playgroud)