Makefile "E;%&引用;在$(通配符)中是否未展开?

Makefile "E;%&引用;在$(通配符)中是否未展开?,makefile,gnu-make,Makefile,Gnu Make,我想对规则进行编码“要生成.done,您需要模式.needed.”的所有文件。我已尝试使用此生成文件编写此代码: %.done: $(wildcard %.needed.*) cat $^ > $@ 然而,当我运行touch foo.needed.bar&&make foo.done时,我得到的只是 cat > foo.done $(通配符)中的%似乎被解释为文本“%”。如何将其展开为正确的值(“foo”)该%只是“任意字符串”的占位符“在模式匹配中。它在通配符函数中没

我想对规则进行编码“要生成
.done
,您需要模式
.needed.
”的所有文件。我已尝试使用此生成文件编写此代码:

%.done: $(wildcard %.needed.*)
    cat $^ > $@
然而,当我运行
touch foo.needed.bar&&make foo.done
时,我得到的只是

cat  > foo.done

$(通配符)
中的
%
似乎被解释为文本“%”。如何将其展开为正确的值(“foo”)

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

您可以尝试改用
$*
(这将扩展到文件名的末尾),但不幸的是,它也不起作用:

%.done: $(wildcard $*.needed.*)
它不起作用的原因是自动变量(
$*
是其中之一)在依赖项列表中不可用

解决方法是为目标请求一个:

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

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

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

您可以尝试改用
$*
(这将扩展到文件名的末尾),但不幸的是,它也不起作用:

%.done: $(wildcard $*.needed.*)
它不起作用的原因是自动变量(
$*
是其中之一)在依赖项列表中不可用

解决方法是为目标请求一个:

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

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

widcard
->
通配符
可能解释它不起作用的原因:配方参数(源、输入和依赖项)在解析过程中已经被评估/展开,因此
$(通配符)
用literal
%
调用,找不到任何文件,并替换为空字符串。延迟求值仅应用于命令。仅供参考。
widcard
->
通配符
可能无法工作的解释:配方参数(源、输入和依赖项)在解析过程中已经进行了计算/扩展,因此
$(通配符)
使用文本
%
调用,未找到任何文件,并替换为空字符串。延迟求值仅应用于命令。仅供参考。谢谢,这解决了我的问题。另外,有人在前面评论了一个更简单但不太通用的解决方案:
%.done:%.needed.
@BrianMalehorn好吧,这在某些情况下会起作用,但如果您使用
$Thank,这就解决了我的问题。另外,有人在前面评论了一个更简单但不太通用的解决方案:
%.完成:%.需要。*
@BrianMalehorn好吧,这在某些情况下是可行的,但如果您使用的是
$