16

我有一个如下的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))
4

3 回答 3

20

\在 makefile 上下文中是为了行继续,而不是为了“转义”。为了逃避事情,你将它们隐藏在一个变量中:

PERCENT := %

这个想法是,在解析转义字符有意义的生成文件片段时,您将其转义。

因此,在您的情况下,您必须使用$$(PERCENT)

$$(patsubst $$(PERCENT),$$(PERCENT)_,$$($$@_DEPS))

于 2013-10-11T17:41:21.747 回答
1

我不知道从模式规则中隐藏 '%' 的方法,但在这种情况下,您可以解决它:

%: $$(addsuffix _,$$($$*_DEPS))
    @echo Building $@
    @echo Dependencies are $^
于 2013-10-07T20:03:35.907 回答
0

这似乎是不可能的。

有关一些解决方法,请参阅问题和 Beta 的答案。

于 2013-10-09T16:24:03.680 回答