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
发布于 2016-12-29 13:19:38
原因是make必须回溯依赖关系才能使您成为foo。
当您键入make foo时,make会认为您是在请求它创建一个名为foo的文件。因此,由于foo不存在(假设),它试图找出如何制作foo。您创建了一个通配符规则,%可以是任何东西,由于没有更好的选项,make将尝试使用此规则来创建foo。现在要创建foo,需要先执行一个依赖项force,然后才能开始创建foo。由于文件force不存在,make确定它需要执行目标来生成force。
因此,我们已经到达了在产出方面开始发生事情的地步。force执行回显force,然后执行通配符规则,该通配符规则回显foo最终使其相信它已准备好创建foo,并且该命令仅回显hello。
因此,它实际上是逆序的,从最外层的依赖首先到最终目标最后。
当您将force作为通配符规则的依赖项删除时,通配符规则将确定无需执行任何操作来创建强制,因此不会执行其主体(回显foo),但由于hello不存在,它将执行foo目标的主体。
如果您在强制目标(例如touch force)中包含了使文件强制的内容,那么现在您将看到打印的是foo和hello,而不是force。
如果在命令行上传递标志--debug=a (all) to make,就可以看到make所采取的步骤。
https://stackoverflow.com/questions/41373392
复制相似问题