Makefile:执行makefile的顺序

时间:2016-12-29 05:01:12

标签: makefile

生成文件:

foo: 
    @echo hello

%: force
    @echo foo

force:
    @echo force

如果输入`make foo',则输出为:

force
foo
hello

为什么不hello

但是,如果我改为:

foo: 
    @echo hello

%:
    @echo foo

force:
    @echo force

仅输出hello

1 个答案:

答案 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),您现在会看到foohello打印,而不是force

如果在命令行上传递标记--debug=a(全部),则可以看到生成的步骤。