首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么gnu会忽略模式规则缺少的依赖项?

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

Stack Overflow用户
提问于 2020-07-14 08:55:56
回答 1查看 275关注 0票数 1

一个最小的例子是:

代码语言:javascript
复制
%.bar: missing_file.pckl
   @echo executed

当我输入make foo.bar时,make说“没什么可做的”。为什么?missing_file.pckl不存在,它的规则也不存在。这难道不应该引起错误吗?(我知道,你可以通过将规则变成静态的-我只是想理解其中的推理。)

另外--我试图更好地理解make背后的逻辑--模式规则和隐式规则之间的区别是什么(这些术语似乎可以互换使用)?为什么模式规则不能被伪造呢?我读到隐式规则是用来生成文件的,但对我来说,使用模式规则对假目标同样有意义。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-14 18:03:05

模式规则是隐式规则。但后缀规则也是隐含的规则。

makefile中有两种基本的规则类型:显式规则和隐式规则。显式规则包括显式目标的规则,也包括静态模式规则(这肯定会让人感到困惑,即“静态模式规则”实际上是显式的,但它们实际上是显式的:它们只是编写大量显式规则的缩写)。隐式规则由模式规则和后缀规则组成。

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

重要的是要理解有许多模板可以构建相同的目标。甚至内置的make规则也提供了许多不同的方法来构建对象文件,例如:通过使用C编译器、C++编译器、FORTRAN编译器等等,用户可以添加自己的。

如果没有为目标找到显式规则,那么make将开始搜索隐式规则。它可能会查看其中的许多,您肯定不希望看到错误或消息的每一个不匹配!

这几乎给出了你所有问题的答案,但总括而言:

得到这条消息的原因是,让搜索所有可用于构建目标的隐式规则,而没有找到可以使用的规则(您提供的规则不起作用,因为前提条件不存在……但是make并不认为这是一个错误,因为它只是构建目标的一种方式。人们有时会使用这个非常方便的功能!所以它说,“我不知道如何建立这个目标”。

当然,make可以在这里产生更多的细节。它可以说:“哦,我碰巧知道只有一个隐含的规则可以匹配,所以我可以更具体地说明为什么那条规则不起作用,并说前提条件缺失了”。但是,如果您有两个可能匹配的隐含规则,那么这将是令人困惑的。或者,它可以列出它无法找到的所有可能的先决条件。或者别的什么。我不确定这些是否真的会是一个整体上的进步。它们在某些情况下会更好,而在其他情况下则会非常烦人。

不能将.PHONY应用于模式规则的原因是模式规则不是目标。当然,一个合理的增强是允许.PHONY采取一个模式,然后将虚假应用于所有匹配该模式的目标。但是,无论出于什么原因,这种增强都没有实现。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62891477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档