31

我想知道如何设置默认编译器/链接器/等。如果我使用 Autoconf/Automake 组合的标志。

例如,如果我没有设置任何东西,默认编译器标志是“-O2 -g”。我可以用其他东西覆盖它,例如,如果我想调试:

./configure 'CXXFLAGS=-O0 -g'

但是我发现默认配置很愚蠢,因为如果我启用优化,调试将变得不可能。configure因此,如果我不带参数运行,默认标志应该是“-O2”或“-O0 -g” 。我该怎么做?

编辑:我尝试了以下解决方案:

  • 放入progname_CXXFLAGS=whateverMakefile.am。它不起作用,因为它将标志添加到默认标志而不是替换它们。
  • 放入CXXFLAGS=whateverconfigure.ac。这行得通,但是我以后不能覆盖它。
4

7 回答 7

22

根据autoconf手册(约AC_PROG_CC):

如果使用 GNU C 编译器,请将 shell 变量 GCC 设置为“yes”。如果尚未设置输出变量 CFLAGS,请将其设置为 -g -O2 用于 GNU C 编译器(在 GCC 不接受 -g 的系统上为 -O2),或 -g 用于其他编译器。如果您的包不喜欢这个默认值,那么插入该行是可以接受的

: ${CFLAGS=""}

在 AC_INIT 之后和 AC_PROG_CC 之前选择一个空的默认值。

同样,根据 autoconf 手册(关于AC_PROG_CXX):

如果使用 GNU C++ 编译器,请将 shell 变量 GXX 设置为“yes”。如果尚未设置输出变量 CXXFLAGS,请将其设置为 -g -O2 用于 GNU C++ 编译器(在 G++ 不接受 -g 的系统上为 -O2),或 -g 用于其他编译器。如果您的包不喜欢这个默认值,那么插入该行是可以接受的

: ${CXXFLAGS=""}

在 AC_INIT 之后和 AC_PROG_CXX 之前选择一个空的默认值。

于 2013-05-21T14:39:13.430 回答
9

如果您只想在运行 configure 时为自己设置默认标志,那么(至少)有 3 种好方法可以做到这一点。在您的环境中设置 CXXFLAGS(例如在 .login 或 .bashrc 中),使用 CONFIG_SITE 环境变量来指定配置文件,或者在 $prefix/share/config.site 中为 CXXFLAGS 设置所需的值。如果你想为你的包的所有用户设置默认标志,而不是'-O2 -g',那么你需要改变你想要的,因为这样做违反了最小意外原则。任何熟悉 autoconf 的人都希望默认标志是 -O2 -g 并且您不应该更改它。

选择上面给出的第三个选项,然后做

$ echo 'CXXFLAGS="-O0 -g"' > /usr/local/share/config.site

(或重定向到您通常设置 $prefix 的任何位置,例如 $HOME/share/config.site) 作为额外的奖励,这将为您配置的所有自动没收项目设置 CXXFLAGS,而不仅仅是您自己的。(假设您适当地设置了前缀。如果您希望 config.site 对所有项目都有效而不管前缀如何,请使用 CONFIG_SITE 设置)

于 2010-06-30T07:01:14.847 回答
7

与此同时,我想出了如何去做。我将对此进行解释。

基本的事情是 Autoconf 替换了 Makefile.in 中的 shell 变量。问题是如何获得这些变量的值?答案是初始化命令替换在命令行中告诉它们的变量(如),否则如果它们不为空,./configure 'CXXFLAGS=-O0 -g'它们将被定义默认值的任何命令替换(例如,CXXFLAGS 由 设置)。所以解决方案是在命令行替换AC_PROG_CXX之前但之后设置我们的新默认值。AC_PROG_CXX例如:

if test -z $CXXFLAGS; then
    CXXFLAGS='-O2'
fi
AC_PROG_CXX
于 2010-06-25T16:12:52.573 回答
3

您可以在 Makefile.am 中设置特定于目标的默认值,也可以在 中设置默认值configure.ac,这将适用于您在项目中构建的所有内容。

请参阅autoconf 手册中的第 4.8.1 节(和 5.10.4)。

请注意 4.8.1 中关于不要对最终的包用户进行第二次猜测的注释:如果您确实想设置用户不应该关心的标志,那么使用AM_CXXFLAGS, 诸如此类的标志用户应该能够覆盖应设置在CXXFLAGS.

但是……你真的要这样做吗?

  1. 你说'调试将变得不可能'。您是否尝试过此操作并发现出现问题?编译器/调试器可能比您认为的要聪明。
  2. 在开发时对您来说好的默认值不一定对最终用户在构建时的好默认值。如果在开发过程中确实需要关闭优化,那么只需./configure CXXFLAGS='-O0 -g'按照您的描述配置您的开发系统。如果您的 configure.ac 编写正确,那将在没有优化的情况下配置您的构建,同时保持(良好)默认值不变。

简短版:您现在做的方式是正确的方式。

编辑添加:

一般来说,如果一个 shell 变量作为一个参数出现AC_SUBST(或者显式地出现,或者在类似的情况下CXXFLAGS,隐式地出现在某个其他命令中),那么它将被替换到输出文件中。也就是说,在 之后,脚本中变量AC_SUBST(foo)的值将被代入实例中。$foo./configure@foo@

于 2010-06-25T09:39:19.160 回答
1

基于上述答案,我将其添加到 configure.ac:

AC_ARG_WITH(debug, [  --with-debug            add the debugging module], [AC_DEFINE(WITH_DEBUG,1,0)
AC_SUBST(WITH_DEBUG,1)
CXXFLAGS="-O0 -ggdb"])

它还在 AC_CONFIG_HEADERS(config.h) 中定义 WITH_DEBUG,并使用 AC_SUBST() 将其添加到 Makefile。

于 2018-02-03T13:10:43.950 回答
0

在您的 Makefile.am 上,您可以使用

programname_CXXFLAGS=-O0 -g

更新:20100628

在调用 AC_PROG_CXX 之前,您应该尝试在 configure.in 中添加 CXXFLAGS。我没有测试它,但你的 configure.in 应该看起来像

AC_INIT
...
CXXFLAGS=-MY -FLAGS
...
AC_PROG_CXX

请让我知道这是否可行,因为我很好奇:-)

于 2010-06-25T08:58:52.513 回答
0

关于用户不足为奇的观点是有效的,但是默认情况下某些标志是合理的(例如-Wall -Wextra),而其他标志是代码库特定的并且有时是需要的(例如-std=gnu99)。

那么问题就变成了如何便携地做到这一点。我个人从 libuv 项目中窃取了标志检查宏。为此,我添加libuv-check-flags.m4m4我的项目目录中。然后我可以在我的configure.ac

m4_include([m4/libuv-check-flags.m4])
AM_INIT_AUTOMAKE([-Wall -Werror foreign 1.11.2])

# Checks for programs.
AC_PROG_CC
CC_CHECK_CFLAGS_APPEND([-std=gnu99])
CC_CHECK_CFLAGS_APPEND([-Wall])
CC_CHECK_CFLAGS_APPEND([-Wextra])
AC_PROG_LIBTOOL

我生成的配置文件然后生成一个编译器命令行:

gcc -g -O2 -std=gnu99 -Wall -Wextra

我仍然可以-g -O2使用上面的解决方案覆盖默认值,例如:

./configure CFLAGS='-O0 -g'

产生一个命令行:

gcc -O0 -g -std=gnu99 -Wall -Wextra

如果需要,我仍然可以利用 gcc 语义禁用基本标志。例如,如果我真的很想禁用警告:

./configure CFLAGS='-Wno-all -Wno-extra'

你可能会说,“如果编译器不支持这些标志怎么办?” 这就是为什么这些宏如此有用和伟大的原因,因为它们确保首先检查编译器功能,因此-Wall如果-Wextra不支持它们就不会首先添加。

libuv 是地球上最便携和使用最广泛的 C 库之一,所以我认为跟随他们的领导是合理的。虽然这些宏是纯 C 特定的,但将它们与 CXXFLAGS 一起使用将是微不足道的。

参考:

于 2019-02-17T03:30:43.203 回答