如何使用 autotools 设置特定于编译器的标志
How to set compiler-specific flags with autotools
我们使用 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’
在选择编译器后,在 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_*
变量。 AC_PROG_CXX/CC
也许已经定义了这样的东西?
如果某个标志产生错误,很容易编写一个 m4 宏来检测编译器是否支持这个标志。
从 autoconf 存档中检查 ax_check_compile_flag。
AM_CXXFLAGS
不是你应该 AC_SUBST
的东西。它保留供 automake 使用。如果查看为 C++ 目标生成的 Makefile
,您会发现 CXXCOMPILE
和 LTCXXCOMPILE
的定义,它们始终包含 AM_CXXFLAGS
变量。
您想将(条件)编译器标志添加到 AM_CXXFLAGS
或 libfoo_la_CXXFLAGS
。前者将影响所有 C++ 编译,而后者仅影响每个库的编译。所以这只是在 configure.ac
.
中获得 SPECIFIC_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 仅测试 __GNUC__
宏(AFAIK),因此 clang++ 将设置:GXX=yes
问题是,没有一种可移植的方法来检测未知的命令行选项。 Intel 的 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)
我们使用 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’
在选择编译器后,在
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_*
变量。 AC_PROG_CXX/CC
也许已经定义了这样的东西?
如果某个标志产生错误,很容易编写一个 m4 宏来检测编译器是否支持这个标志。
从 autoconf 存档中检查 ax_check_compile_flag。
AM_CXXFLAGS
不是你应该 AC_SUBST
的东西。它保留供 automake 使用。如果查看为 C++ 目标生成的 Makefile
,您会发现 CXXCOMPILE
和 LTCXXCOMPILE
的定义,它们始终包含 AM_CXXFLAGS
变量。
您想将(条件)编译器标志添加到 AM_CXXFLAGS
或 libfoo_la_CXXFLAGS
。前者将影响所有 C++ 编译,而后者仅影响每个库的编译。所以这只是在 configure.ac
.
SPECIFIC_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 仅测试 __GNUC__
宏(AFAIK),因此 clang++ 将设置:GXX=yes
问题是,没有一种可移植的方法来检测未知的命令行选项。 Intel 的 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)