Gav*_*ith 12 makefile gnu-make
我有一个如下所示的makefile:
m1:
@echo building m1
m1_:
@echo building m1_
m2:
@echo building m2
m2_:
@echo building m2_
m3_DEPS = m2 m1
SUBSTITUTE=$(patsubst %,%_,$($@_DEPS))
.SECONDEXPANSION:
#%: $$(SUBSTITUTE)
%: $$(patsubst \%,\%_,$$($$@_DEPS))
@echo Building $@
@echo Dependencies are $^
Run Code Online (Sandbox Code Playgroud)
关键是
%: $$(patsubst \%,\%_,$$($$@_DEPS))
Run Code Online (Sandbox Code Playgroud)
我正在使用模式规则和patsubst,它本身使用百分号.我以为我可以%用a 逃脱角色\,但我仍然没有得到预期的行为.运行"make m3"给出输出
building m2
building m1
Building m3
Dependencies are m2 m1
Run Code Online (Sandbox Code Playgroud)
但是,我希望得到
building m2_
building m1_
Building m3
Dependencies are m2_ m1_
Run Code Online (Sandbox Code Playgroud)
注释掉该行并patsubst通过变量间接调用确实产生了该输出.
SUBSTITUTE=$(patsubst %,%_,$($@_DEPS))
%: $$(SUBSTITUTE)
Run Code Online (Sandbox Code Playgroud)
另外,我已经测试过使用非模式规则有效,这让我觉得它与模式规则和百分号的交互有关:
m3: $$(patsubst %,%_,$$($$@_DEPS))
Run Code Online (Sandbox Code Playgroud)
Mar*_*eck 15
\在makefile上下文用于行继续,而不是用于"转义".为了逃避事情,你将它们隐藏在一个变量中:
PERCENT := %
Run Code Online (Sandbox Code Playgroud)
这个想法是,当一个makefile片段被解析,其中转义字符是有意义的,你逃脱它.
所以,在你的情况下,你必须使用$$(PERCENT):
$$(patsubst $$(PERCENT),$$(PERCENT)_,$$($$@_DEPS))