在我的makefile中:
default: *.s
echo $(basename $<)
回显基本名,但是
default: %.s
echo $(basename $<)
输出:
make: *** No rule to make target '%.s', needed by 'default'. Stop.
我在makefile所在的目录中有smf.s
个文件。那么,为什么makefile不将其用作前提条件? (只有类似shell的*
可以,但是%
不能),为什么?
您的第一条规则:
default: *.s
echo $(basename $<)
如您所愿,因为*
在GNU Make中是wildcard character。
另一方面,您的第二条规则:
default: %.s
echo $(basename $<)
具有%.s
作为先决条件。由于没有名为%.s
的文件,因此Make需要附加规则来生成此丢失的文件%.s
。这是关于错误消息的内容:
make: *** No rule to make target '%.s', needed by 'default'. Stop.
您可能会认为%
是通配符。实际上,它的行为在pattern rules中是这样的。但是,您的第二个规则不是模式规则。以下是文档摘录:
一个模式规则看起来像一个普通规则,只是其目标包含字符'%'(恰好是其中的一个)。
您的第二个规则的目标,即default
,不包含字符%
。因此,它不能被视为模式规则。