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好吧,这在某些情况下是可行的,但如果您使用的是$