Makefile 为什么gnu要忽略模式规则缺少的依赖项?

Makefile 为什么gnu要忽略模式规则缺少的依赖项?,makefile,gnu-make,Makefile,Gnu Make,一个简单的例子: %.bar: missing_file.pckl @echo executed 当我键入make foo.bar时,make表示“无事可做”。为什么?缺少的_文件.pckl不存在,也没有相应的规则。这不应该引起错误吗?(我知道你可以通过使规则保持静态来规避这个问题——我只想理解其中的原因。) 另一方面,我试图理解makebetter>背后的逻辑,模式规则和隐式规则(这些术语似乎可以互换使用)之间有什么区别?模式规则不能被伪造的原因是什么?我读到隐式规则是用来生成文件的—

一个简单的例子:

%.bar: missing_file.pckl
   @echo executed
当我键入
make foo.bar
时,
make
表示“无事可做”。为什么?
缺少的_文件.pckl
不存在,也没有相应的规则。这不应该引起错误吗?(我知道你可以通过使规则保持静态来规避这个问题——我只想理解其中的原因。)

另一方面,我试图理解
make
better>背后的逻辑,模式规则和隐式规则(这些术语似乎可以互换使用)之间有什么区别?模式规则不能被伪造的原因是什么?我读到隐式规则是用来生成文件的——但对我来说,对虚假目标使用模式规则同样有意义


谢谢

模式规则是一种隐式规则。但也有隐含的规则

makefile中有两种基本类型的规则:显式规则和隐式规则。显式规则包括用于显式目标的规则,以及静态模式规则(这确实令人困惑,因为“静态模式规则”实际上是显式的,但它们是:它们只是编写大量显式规则的简写)。隐式规则由模式规则和后缀规则组成

将隐式规则视为模板。它实际上根本没有定义任何目标。它只提供如何创建目标(与模式/后缀匹配)的模板。如果您的makefile只包含隐式规则,那么当您键入
make
时,它将不会执行任何操作,因为您的makefile实际上没有定义任何目标。。。它只创建了模板

重要的是要理解,可以有许多模板构建相同的目标。甚至内置的生成规则也提供了许多不同的方法来构建一个对象文件,例如:通过使用C编译器、C++编译器、FORTRAN编译器等,用户可以自己添加。 如果找不到目标的显式规则,make将开始搜索隐式规则。它可能会浏览其中的许多内容,您肯定不希望看到每个不匹配的错误或消息

这几乎回答了你所有的问题,但概括起来:

您收到此消息的原因是make搜索了可用于构建该目标的所有隐式规则,但没有找到可用于构建该目标的隐式规则(你所提供的一个不起作用,因为前提不存在……但是,不要认为这是一个错误,因为它只是一个可以建立目标的方式。人们实际上使用这个非常方便的特性,有时!!)所以它说,“我不知道如何构建这个目标”。 当然,make可以在这里生成更多细节。它可以说“哦,我碰巧知道只有一个隐式规则可以匹配,所以我可以更具体地说明为什么这一规则不起作用,并说缺少先决条件”.但是如果你有两个可能匹配的隐式规则,那会让人困惑。或者,它可以列出所有它找不到的可能的先决条件。或者其他什么。我不确定这些是否真的会在总体上有所改进。它们在某些情况下会更好,在其他情况下会非常烦人


不能将
.PHONY
应用于模式规则的原因是模式规则不是目标。当然,合理的增强是允许
.PHONY
采用模式,然后将虚假性应用于与该模式匹配的所有目标。但是,无论出于何种原因,该增强尚未实现。

告诉,模式规则是在makefile中写入的隐式规则。我同意术语可能更好。(我没有发布答案,因为我很清楚为什么
什么都不做
,但不清楚为什么Make的行为方式与
时的行为方式相同。
满足
%.bar
)您也可以发布部分答案,我将不胜感激:)谢谢您的回答好吧,我明白了,你不想列出所有不起作用的隐式规则。但是当我键入
makefoo.bar
时,我希望它能像处理目标一样处理。因此,如果它最终只找到不匹配的隐式规则,它应该给出一个错误“no rule to make target[…]”。或者“我不知道如何建立目标”,就像你说的。但是“什么都不做”意味着在我看来一切都很好-因为这和你得到的最新目标的信息是一样的。好吧,也许现在我明白了-因为文件存在并且可以找到匹配(隐式)规则,实际上可以应用,
make
假装此文件根本没有规则,只是将其视为输入。对的(对不起,我忘了
foo.bar
已经存在。如果不是这样的话,“什么都不做”真的没有任何意义。)对。这就好像您在一个包含源文件的目录中键入了
make foo.c
。那份文件没有任何用处。