【问题标题】:Can you explicitly declare a mentioned file .INTERMEDIATE?你能明确声明一个提到的文件 .INTERMEDIATE 吗?
【发布时间】:2019-02-18 17:19:26
【问题描述】:

this answer, MadScientist 的 cmets 中,GNU Make 的当前维护者在明确声明的 .INTERMEDIATE 目标上说:

只需在任何规则(而非配方)中明确提及[文件],即可取消其获得中间状态的资格。

另一方面,the GNU make manual

但是,您可以通过将文件列为特殊目标 .INTERMEDIATE 的先决条件来将文件显式标记为中间文件。即使以其他方式明确提及该文件,这也会生效。

哪个是对的,或者我做错了什么?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    有一个误解:上述两个陈述都是正确的,但是您应用的上下文(在显式声明的 .INTERMEDIATE 目标上)不正确;该声明是对我回答的评论中提出的问题的回应,该问题与原始问题不同。

    在没有特殊覆盖的情况下,如果目标完全由 make 推断(未在 makefile 中明确列出,仅通过隐式规则搜索发现),则它有资格成为中间目标。

    如果目标在 makefile 中列为目标或先决条件,则默认情况下它不符合中间条件。 .INTERMEDIATE 特殊形式允许您声明被提及的目标是中间目标。

    为了确保一个目标不是中间的,只需在makefile中将它作为目标或某个目标的先决条件提及就足够了,某处(不一定是在make 的调用)。

    为了确保目标中间的,它要么不应该被提及,要么应该被声明为.INTERMEDIATE的先决条件。

    【讨论】:

    • 你能指出正确的上下文是什么吗?据我了解,问题和answer 都包含一个明确的 .INTERMEDIATE 目标声明(.INTERMEDIATE: twice.dep)。有问题的评论然后只是添加(并再次删除)另一个声明。 .dep 文件是否甚至被视为中间目标?
    • 我的意思是,您引用的文字不是来自我的回答,而是来自对我的回答的评论......并且该评论与原始问题无关,它正在回答问题在另一条评论中提出:如果没有“另一个:两次.dep”,则两次.dep 被认为是中间并适当地删除(如果已创建)。有了这条线,它不再被视为中间产品。为什么? 我的评论解释了为什么添加 another: twice.dep 可以确保 twice.dep 不被视为中间值。
    • Make 对.dep 文件一无所知。它像对待任何其他文件一样对待它们。事实上,make 没有任何特殊的目标类,它本质上会根据名称等与任何其他类进行不同的处理(除了我猜受默认隐式目标影响的目标)。
    • 这也是我的印象(不过,我不知道除了默认的隐式目标之外是否还有其他东西)。因此,如果它没有被隐含地认为是中间的,并且.INTERMEDIATE: 不在乎它是否在某处被提及,那么另一行有什么问题呢?在这种情况下似乎没有任何改变:.INTERMEDIATE: + 其他行:中间,.INTERMEDIATE: + 没有其他行:中间,没有 .INTERMEDIATE: + 其他行:不是中间,没有 .INTERMEDIATE: + 没有其他行: 不是中间...
    • 这很简单,所以我不确定哪里出了问题。我已经多次说过:如果makefile中没有提到目标(但由于隐含规则而被发现),那么它就是中间的。如果提到,它不是中间的。另外,如果目标被列为.INTERMEDIATE 的先决条件,那么无论是否提及,它都是中间的。仅此而已。
    猜你喜欢
    • 2021-02-17
    • 2010-11-19
    • 1970-01-01
    • 2015-02-23
    • 2020-08-19
    • 2010-09-28
    • 2019-10-17
    • 1970-01-01
    • 2010-12-22
    相关资源
    最近更新 更多