我的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
没有将值添加到变量中?我怎样才能达到我想要的行为?
答案 0 :(得分:1)
通过命令行传递变量,您告诉make
您正在覆盖文件中的任何定义,这允许用户按照他们的意图而不是您想要的方式进行编译。忽略用户自由的限制,您可以使用override
directive:
要将更多文本附加到命令行中定义的变量,请使用:
override variable += more text
标有
override
标志的变量分配具有更高的优先级 比所有其他作业,除了另一个override
。随后 分配或附加到此变量未标记override
将被忽略。
我会阻止你在可能的情况下使用override
,因为要知道在我不希望它们启用时禁用你启用的优化需要-O0
,这很烦人(毕竟,我指定了我自己的旗帜是有原因的)。当然,如果根本没有指定标志,那么默认值是完全合理的。实际上,当没有指定编译标志时,Automake项目似乎默认为-g -O2
。
当然,这个建议也有例外,比如添加一个目录来搜索includes / libs或预处理器定义,以便在某个平台上编译条件的代码段。