"%"在$(通配符)没有扩展?

时间:2016-07-24 06:05:22

标签: makefile gnu-make

我想对规则&#34;进行编码以生成<name>.done,您需要模式<name>.needed.*的所有文件。我试图用这个Makefile写这个:

%.done: $(wildcard %.needed.*)
    cat $^ > $@

然而,当我跑touch foo.needed.bar && make foo.done时,我得到的只是

cat  > foo.done

%内的$(wildcard)似乎被解释为文字&#34;%&#34;。如何将其扩展到正确的值(&#34; foo&#34;在这种情况下)?

1 个答案:

答案 0 :(得分:1)

%只是模式匹配中“任意字符串”的占位符。它在wildcard函数中没有特殊含义,按字面解释。

您可能会尝试使用$*(这将扩展到文件名的词干),但不幸的是它也不会有效:

%.done: $(wildcard $*.needed.*)

它不起作用的原因是自动变量$*就是其中之一)无法在依赖项列表中使用。

解决方法是为目标请求secondary expansion

.SECONDEXPANSION:
%.done: $$(wildcard $$*.needed.*)

这将提示GNU Make像往常一样处理Makefile后第二次检查规则,扩展第一次未扩展的任何转义变量。第二次,自动变量有适当的值。