生成文件:
foo:
@echo hello
%: force
@echo foo
force:
@echo force
如果我输入“make foo”,输出是:
force
foo
hello
那为什么不 hello
但是,如果我改成这样:
foo:
@echo hello
%:
@echo foo
force:
@echo force
它只输出hello
最佳答案
原因是因为 make 必须通过依赖项进行回溯才能使您成为 foo
。
当您输入make foo
时,make 认为您要求它创建一个名为foo
的文件。因此,由于 foo
不存在(假设),它会尝试找出如何制作 foo
。你制定了一个通配符规则 %
可以是任何东西,因为没有更好的选择 make 将尝试使用这个规则来制作一个 foo
。要制作 foo
现在有一个依赖项 force
,它需要在我们开始制作 foo
之前执行。由于文件 force
不存在,因此 make 确定它需要执行目标以生成 force
。
因此,就输出而言,我们已经到了事情开始发生的地步。 force
执行,回显 force
,然后执行通配符规则,回显 foo
最后 make 相信它已准备好创建 foo,命令只是为了echo 你好
。
所以它实际上是倒序的,从最外层的依赖到最后的最终目标。
当您将 force
作为通配符规则的依赖项移除时,通配符规则将确定无需执行任何操作来创建力,因此不会执行其主体(回显 foo
),但由于 hello
不存在,它将执行您的 foo
目标的主体。
如果您在强制目标中包含一些内容来创建文件强制(例如 touch force
),您现在将看到 foo
和 hello
打印,但不是force
。
如果您在命令行上将标志 --debug=a
(all) 传递给 make,您可以看到 make 执行的步骤。
关于Makefile:执行makefile的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41373392/