我想对规则&#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;在这种情况下)?
答案 0 :(得分:1)
%
只是模式匹配中“任意字符串”的占位符。它在wildcard
函数中没有特殊含义,按字面解释。
您可能会尝试使用$*
(这将扩展到文件名的词干),但不幸的是它也不会有效:
%.done: $(wildcard $*.needed.*)
它不起作用的原因是自动变量($*
就是其中之一)无法在依赖项列表中使用。
解决方法是为目标请求secondary expansion:
.SECONDEXPANSION:
%.done: $$(wildcard $$*.needed.*)
这将提示GNU Make像往常一样处理Makefile后第二次检查规则,扩展第一次未扩展的任何转义变量。第二次,自动变量有适当的值。