我有一个类似以下的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 $^
关键是
%: $$(patsubst \%,\%_,$$($$@_DEPS))
我正在使用模式规则和patsubst,它本身使用百分号。我以为我可以用%
来逃避\
字符,但我仍然没有达到预期的行为。运行“make m3”会给出输出
building m2
building m1
Building m3
Dependencies are m2 m1
但是,我希望得到
building m2_
building m1_
Building m3
Dependencies are m2_ m1_
注释掉该行并通过变量间接调用patsubst
确实会产生该输出。
SUBSTITUTE=$(patsubst %,%_,$($@_DEPS))
%: $$(SUBSTITUTE)
另外,我测试过使用非模式规则有效,这让我觉得它与模式规则和百分号的交互有关:
m3: $$(patsubst %,%_,$$($$@_DEPS))
答案 0 :(得分:15)
\
用于行继续,而不是用于“转义”。为了逃避事情,你将它们隐藏在一个变量中:
PERCENT := %
这个想法是,当解析一个makefile片段,其中转义字符有意义时,你将它转义。
因此,在您的情况下,您必须使用$$(PERCENT)
:
$$(patsubst $$(PERCENT),$$(PERCENT)_,$$($$@_DEPS))
答案 1 :(得分:1)
我不知道如何隐藏模式规则中的'%',但在这种情况下你可以解决它:
%: $$(addsuffix _,$$($$*_DEPS))
@echo Building $@
@echo Dependencies are $^
答案 2 :(得分:0)
这似乎不可能。
有一些解决方法,请参阅问题和Beta的答案。