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 这在

我们使用autotools作为构建基础设施,使用clang和gcc作为编译器。最近我们遇到了一个gcc警告,需要

--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)
    
    或:


    我对你的说法感到不解,你说一个人不应该做任何事。这与手动在所有15ish
    Makefile.AM
    s中设置
    AM\u CXXFLAGS
    有何不同
    AC_SUBST
    ing
    AM_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)