我正在尝试使用GNU Make的text substitution来更改-O1
的现有(可能缺少)优化级别。这是我正在使用的:
# Valgrind testing. Issue 'make valgrind'.
ifneq ($(filter valgrind,$(MAKECMDGOALS)),)
$(info: Valgrind build)
CXXFLAGS := $(CXXFLAGS:-g?=-g3)
CXXFLAGS := $(CXXFLAGS:-O?=-O1)
ifeq ($(findstring -DVALGRIND_BUILD,$(CXXFLAGS)),)
$(info: adding -DVALGRIND_BUILD)
CXXFLAGS += -DVALGRIND_BUILD
endif # -DVALGRIND_BUILD
ifeq ($(findstring -O,$(CXXFLAGS)),)
$(info: adding -O1)
CXXFLAGS += -O1
endif # Optimizations
endif # Valgrind
我相信我正在从手册中调用此规则或功能:
$(var:pattern=replacement)
事情没有按预期发挥作用。添加了define,但未进行替换:
$ CXXFLAGS="-DNDEBUG -g2 -O3" make valgrind
g++ -DNDEBUG -g2 -O3 -DVALGRIND_BUILD -c cryptlib.cpp
g++ -DNDEBUG -g2 -O3 -DVALGRIND_BUILD -c cpu.cpp
g++ -DNDEBUG -g2 -O3 -DVALGRIND_BUILD -c integer.cpp
...
我也试过$(filter-out ...)
(以为我之后可以添加所需的优化),但这也不起作用:
CXXFLAGS := $(filter-out -g?,$(CXXFLAGS))
CXXFLAGS := $(filter-out -O?,$(CXXFLAGS))
这是一个类似的问题,其答案提示subst
和filter-out
:How to strip parameters from a variable in a makefile。但我似乎无法使方法按预期工作。
如何进行更换?
答案 0 :(得分:1)
为什么不使用'%'而不是'?'像这样?
CXXFLAGS := $(CXXFLAGS:-g%=-g3)
或
CXXFLAGS := $(patsubst -g%,-g3,$(CXXFLAGS))
我现在无法访问任何Linux机箱。 所以,我无法证实这一点。 :P