如何替换CFLAGS或CXXFLAGS中的选项

时间:2017-05-07 01:27:57

标签: text makefile gnu-make options

我正在尝试使用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))

这是一个类似的问题,其答案提示substfilter-outHow to strip parameters from a variable in a makefile。但我似乎无法使方法按预期工作。

如何进行更换?

1 个答案:

答案 0 :(得分:1)

为什么不使用'%'而不是'?'像这样?

CXXFLAGS := $(CXXFLAGS:-g%=-g3)

CXXFLAGS := $(patsubst -g%,-g3,$(CXXFLAGS))

我现在无法访问任何Linux机箱。 所以,我无法证实这一点。 :P