CXXFLAGS 更改未被兑现?
CXXFLAGS changes not being honored?
我的 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:
Often it is useful to add more text to the value of a variable already defined. You do this with a line containing ‘+=’, like this:
objects += another.o
为什么 make
没有将值添加到变量中?我怎样才能实现我想要的行为?
通过命令行传递变量,即告诉 make
您正在覆盖文件中的任何定义,这允许用户按照他们的意图而不是您的意图进行编译。忽略用户自由的限制,可以使用override
directive:
To append more text to a variable defined on the command line, use:
override variable += more text
Variable assignments marked with the override
flag have a higher priority
than all other assignments, except another override
. Subsequent
assignments or appends to this variable which are not marked override
will be ignored.
我不鼓励您尽可能使用 override
,因为意识到需要 -O0
来禁用您启用的优化,而我不想启用它们,这很烦人(毕竟,我指定自己的标志是有原因的)。当然,如果根本没有指定标志,那么默认值是完全合理的。事实上,当没有指定编译标志时,Automake 项目似乎默认为 -g -O2
。
当然这个建议也有例外,例如添加一个目录来搜索 includes/libs 或在某个平台上编译条件代码段的预处理器定义。
我的 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:
Often it is useful to add more text to the value of a variable already defined. You do this with a line containing ‘+=’, like this:
objects += another.o
为什么 make
没有将值添加到变量中?我怎样才能实现我想要的行为?
通过命令行传递变量,即告诉 make
您正在覆盖文件中的任何定义,这允许用户按照他们的意图而不是您的意图进行编译。忽略用户自由的限制,可以使用override
directive:
To append more text to a variable defined on the command line, use:
override variable += more text
Variable assignments marked with the
override
flag have a higher priority than all other assignments, except anotheroverride
. Subsequent assignments or appends to this variable which are not markedoverride
will be ignored.
我不鼓励您尽可能使用 override
,因为意识到需要 -O0
来禁用您启用的优化,而我不想启用它们,这很烦人(毕竟,我指定自己的标志是有原因的)。当然,如果根本没有指定标志,那么默认值是完全合理的。事实上,当没有指定编译标志时,Automake 项目似乎默认为 -g -O2
。
当然这个建议也有例外,例如添加一个目录来搜索 includes/libs 或在某个平台上编译条件代码段的预处理器定义。