Makefile 为什么.SECONDARY不能处理模式(%),而.PRECIOUS可以?

Makefile 为什么.SECONDARY不能处理模式(%),而.PRECIOUS可以?,makefile,gnu,gnu-make,Makefile,Gnu,Gnu Make,我的问题是更好地理解我在make过程中遗漏了什么,第二个目的和宝贵的,而不是让我的脚本工作,因为它已经工作了 我使用make打开文件上的emacs编辑器(java,但与本问题无关),或者使用模板(如果不存在)创建它 如果它能很好地处理现有文件,在使用生成的文件时,它会在末尾被删除 我添加了先决条件。第二个,但没有帮助,我必须添加它。珍贵 这是一个问题,为什么它在.SECONDARY中不起作用? 从我发现的那么多 .SECONDARY不适用于模式(%),但即使知道它是设计的还是制造中的一个bug,

我的问题是更好地理解我在make过程中遗漏了什么,第二个目的和宝贵的,而不是让我的脚本工作,因为它已经工作了

我使用make打开文件上的emacs编辑器(java,但与本问题无关),或者使用模板(如果不存在)创建它

如果它能很好地处理现有文件,在使用生成的文件时,它会在末尾被删除

我添加了先决条件。第二个,但没有帮助,我必须添加它。珍贵

这是一个问题,为什么它在.SECONDARY中不起作用?

从我发现的那么多 .SECONDARY不适用于模式(%),但即使知道它是设计的还是制造中的一个bug,我也不知道。(及)

这里是我的Makefile的精简内容,用来重现我的问题(请创建一个com/stackoverflow/question目录来测试它)

所以我把我的文件放进去了。宝贝:现在它工作了

它显示到控制台:

com/stackoverflow/question/SoTest.java

它使用正确的模板运行emacs,这样创建就可以了 这里我退出emacs

并删除末尾的文件

rm com/stackoverflow/question/SoTest.java

最后的删除是由于中间文件,这可以通过make上的-d选项看到

LANG=C制造-d工作/测试

...
Must remake target 'work/SoTest'.
emacs com/stackoverflow/question/SoTest.java
Putting child 0xc3b580 (work/SoTest) PID 20681 on the chain.
Live child 0xc3b580 (work/SoTest) PID 20681 
Reaping winning child 0xc3b580 PID 20681 
Removing child 0xc3b580 PID 20681 from chain.
Successfully remade target file 'work/SoTest'.
Removing intermediate files...
rm com/stackoverflow/question/SoTest.java
要使它工作,我需要取消注释。宝贵的段落

make--version

GNU Make 4.0
Construit pour x86_64-pc-linux-gnu
Copyright (C) 1988-2013 Free Software Foundation, Inc.
Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>
Ceci est un logiciel libre : vous êtes autorisé à le modifier et à la redistribuer.
Il ne comporte AUCUNE GARANTIE, dans la mesure de ce que permet la loi.
GNU Make 4.0
施工浇注x86_64-pc-linux-gnu
版权所有(C)1988年至2013年自由软件基金会。
许可证GPLv3+:GNU GPL版本3
这是一种逻辑自由:你可以自动修改并重新分配。
这是一个重要的组成部分,它是一个重要的组成部分。
关于“为什么.SECONDARY不使用模式(%),而.PRECIOUS使用模式?”的答案是:文档中说

您还可以将隐式规则的目标模式(如“%.o”)列为特殊target.xml的先决文件

但并没有说这是关于
.SECONDARY
。但是对于少数明确的例外,没有一个特殊目标接受模式。

多亏了Alex(参见答案),我在搜索中走得更远

我所发现的是,这是记录在TODO.private的make项目中的15年

使用git://git.savannah.gnu.org/make.git 您可以查看TODO.private内容的历史记录:

 6) Right now the .PRECIOUS, .INTERMEDIATE, and .SECONDARY
    pseudo-targets have different capabilities.  For example, .PRECIOUS
    can take a "%", the others can't.  Etc.  These should all work the
    same, insofar as that makes sense.

在合理的范围内,这些都应该工作相同。但没有编码。

指示。珍贵的工作模式,但奇怪的是,不是。次要的。将解释此行为。显然,我们不能使用%.out作为.SECONDARY的目标。似乎是另一种确认,注意到.PRECIOUS在用作.SECONDARY的替代品时有一个缺点:make不会在中断时删除文件,因为信号打开了部分写入的对象文件到达链接器()的可能性。这不回答“为什么”;它回答“这有文件记录吗?如果有,在哪里?”@Kaz,我同意Phillippe最终找到了一个更深层次的答案来回答为什么(还没有编码)。然而,我的“除了少数明确的例外,没有一个特殊目标接受模式”恰恰回答了这个问题。比如,为什么猕猴有尾巴?:“除了类人猿和其他很少的哺乳动物,所有的哺乳动物都有尾巴,所以猕猴也跟着潮流走。”。
GNU Make 4.0
Construit pour x86_64-pc-linux-gnu
Copyright (C) 1988-2013 Free Software Foundation, Inc.
Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>
Ceci est un logiciel libre : vous êtes autorisé à le modifier et à la redistribuer.
Il ne comporte AUCUNE GARANTIE, dans la mesure de ce que permet la loi.
 6) Right now the .PRECIOUS, .INTERMEDIATE, and .SECONDARY
    pseudo-targets have different capabilities.  For example, .PRECIOUS
    can take a "%", the others can't.  Etc.  These should all work the
    same, insofar as that makes sense.