使用Autotools的默认编译器标志

pet*_*ohn 24 automake autoconf makefile

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

例如,如果我没有设置任何内容,则默认编译器标志为"-O2 -g".我可以用其他东西覆盖它,例如,如果我想调试:

./configure 'CXXFLAGS=-O0 -g'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 放到progname_CXXFLAGS=whateverMakefile.am.它不起作用,因为它将标志添加到默认标志而不是替换它们.
  • 放入CXXFLAGS=whateverconfigure.ac.这有效,但后来我无法覆盖它.

mal*_*984 19

根据autoconf手册(约AC_PROG_CC):

如果使用GNU C编译器,请将shell变量GCC设置为"yes".如果尚未设置输出变量CFLAGS,则将其设置为GNU C编译器的-g -O2(在GCC不接受-g的系统上为-O2),或者为其他编译器设置-g.如果您的包不喜欢此默认值,则可以插入该行

: ${CFLAGS=""}

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

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

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

: ${CXXFLAGS=""}

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


Wil*_*ell 9

如果您只想在运行configure时为自己设置默认标志,则有(至少)3种好方法可以执行此操作.在您的环境中设置CXXFLAGS(例如在.login或.bashrc中),使用CONFIG_SITE环境变量指定配置文件,或在$ prefix/share/config.site中设置CXXFLAGS所需的值.如果要为包的所有用户将默认标志设置为"-O2 -g"以外的其他标志,则需要更改所需内容,因为这样做会违反最少意外的主体.任何熟悉autoconf的人都希望默认标志为-O2 -g,你不应该改变它.

使用上面给出的第3个选项,然后就可以了

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

(或重定向到通常设置$前缀的位置,例如$ HOME/share/config.site)作为额外的奖励,这将为您配置的所有自动混合项目设置CXXFLAGS ,而不仅仅是您自己的.(假设您正确设置了前缀.如果您希望config.site对所有项目都有效,而不考虑前缀,那么使用CONFIG_SITE设置)


pet*_*ohn 6

与此同时,我想出了如何做到这一点.我会对此作出解释.

基本的是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
Run Code Online (Sandbox Code Playgroud)

  • 这种解决方案完全违反了最不令人意外的原则.在没有明确设置CXXFLAGS的情况下运行configure时,人们希望CXXFLAGS设置为'-g -O2'.如果您想自己更改它,请使用config.site进行更改.不要在configure.ac中进行更改.这是错误的地方. (10认同)
  • 另外(虽然这看起来像是一个不寻常的用例),如果用户显式将CXXFLAGS设置为空(配置CXXFLAGS = --prefix ...),则此代码将覆盖用户.而不是测试CXXFLAGS是否为空,您应该检查它是否未定义为":$ {CXXFLAGS = -O2}" (2认同)