生成文件:
foo:
@echo hello
%: force
@echo foo
force:
@echo force
如果输入`make foo',则输出为:
force
foo
hello
为什么不hello
但是,如果我改为:
foo:
@echo hello
%:
@echo foo
force:
@echo force
仅输出hello
答案 0 :(得分:2)
原因是因为make必须追溯依赖关系以使您成为foo
。
当您输入make foo
时,make会认为您要求它创建一个名为foo
的文件。因此foo
不存在(假设)它试图找出如何制作foo
。您制作了通配符规则%
可以是任何内容,因为没有更好的选项,make会尝试使用此规则来生成foo
。要使foo
现在有一个依赖项force
,需要在我们开始制作foo
之前执行。由于文件force
不存在,因此确定需要执行目标才能生成force
。
所以我们已经达到了输出开始发生的程度。 force
执行哪个echos force
,然后执行通配符规则,echos foo
最终认为它已准备好创建foo并且该命令仅用于回显hello
。
所以它实际上是以相反的顺序,从最外层依赖首先到最终目标。
当你将force
作为通配符规则的依赖关系时,通配符规则将确定无法创建强制,因此不会执行其正文(回显foo
),但是由于hello
不存在,它将执行foo
目标的正文。
如果您在强制目标中包含了一些文件强制内容(例如touch force
),您现在会看到foo
和hello
打印,而不是force
。
如果在命令行上传递标记--debug=a
(全部),则可以看到生成的步骤。