如何使用自动工具设置编译器特定的标志

问题描述 投票:0回答:2

我们使用 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’
  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)
    

但我需要从configure.ac 替换的

HAVE_*
变量。
AC_PROG_CXX/CC
也许已经定义了这样的东西吗?

gcc clang autotools compiler-options
2个回答
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只测试
__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"

然后在

Makefile.am

AM_CXXFLAGS = $(FOO_SPECIFIC_CXXFLAGS)

或:

libfoo_la_CXXFLAGS = $(FOO_SPECIFIC_CXXFLAGS)

2
投票

如果某个标志产生错误,很容易编写一个 m4 宏来检测编译器是否支持该标志。

从 autoconf 存档中检查

ax_check_compile_flag

© www.soinside.com 2019 - 2024. All rights reserved.