CXXFLAGS的变化没有兑现?

时间:2015-07-25 06:55:41

标签: makefile gnu-make

我的GNU makefile中有以下内容:

# CXXFLAGS ?= -DNDEBUG -g2 -O3
CXXFLAGS ?=

# Add -DNDEBUG if nothing specified
ifeq ($(filter -DDEBUG -DNDEBUG,$(CXXFLAGS)),)
$(info Adding -DNDEBUG to CXXFLAGS)
CXXFLAGS += -DNDEBUG
endif

# Add a symolize if nothing specified
ifeq ($(filter -g -g1 -g2 -g3 -Oz,$(CXXFLAGS)),)
$(info Adding -g2 to CXXFLAGS)
CXXFLAGS += -g2
endif

# Add an optimize if nothing specified
$(info Adding -O3 to CXXFLAGS)
ifeq ($(filter -O -O0 -O1 -O2 -O3 -Og -Os -Oz -Ofast,$(CXXFLAGS)),)
CXXFLAGS += -O3
endif

当我运行它时:

$ make CXXFLAGS="-g3"
Adding -DNDEBUG to CXXFLAGS
Adding -O3 to CXXFLAGS
g++ -g3 -c foo.cpp
...

事实上,如果我取消注释CXXFLAGS ?= -DNDEBUG ...,那么我可以再次追加。但是这并不是很有用,因为我试图让参数可选(但是使用了默认值)。

如果我只输入make,那么它可以正常工作(-fPIC -march=native -Wall -Wextra -pipe稍后会被同一个makefile添加,并且它一直有效):

$ make
Adding -DNDEBUG to CXXFLAGS
Adding -g2 to CXXFLAGS
Adding -O3 to CXXFLAGS
g++  -DNDEBUG -g2 -O3 -fPIC -march=native -Wall -Wextra -pipe -c serpent.cpp
...

根据手册和6.6 Appending More Text to Variables

  

通常,在已定义的变量值中添加更多文本非常有用。你用一个包含'+ ='的行来做到这一点,如下所示:
  
对象+ = another.o

为什么make没有将值添加到变量中?我怎样才能达到我想要的行为?

1 个答案:

答案 0 :(得分:1)

通过命令行传递变量,您告诉make您正在覆盖文件中的任何定义,这允许用户按照他们的意图而不是您想要的方式进行编译。忽略用户自由的限制,您可以使用override directive

  

要将更多文本附加到命令行中定义的变量,请使用:

     

override variable += more text

     

标有override标志的变量分配具有更高的优先级   比所有其他作业,除了另一个override。随后   分配或附加到此变量未标记override   将被忽略。

我会阻止你在可能的情况下使用override,因为要知道在我不希望它们启用时禁用你启用的优化需要-O0,这很烦人(毕竟,我指定了我自己的旗帜是有原因的)。当然,如果根本没有指定标志,那么默认值是完全合理的。实际上,当没有指定编译标志时,Automake项目似乎默认为-g -O2

当然,这个建议也有例外,比如添加一个目录来搜索includes / libs或预处理器定义,以便在某个平台上编译条件的代码段。