我的问题是要更好地理解我在制作过程中错过的内容和.SECONDARY目的与.PRECIOUS,不要让我的脚本正常工作,因为它确实有效。
我正在使用make来打开文件上的emacs编辑器(java但与此问题无关)或者使用模板创建它(如果不存在)。
如果它适用于现有文件,使用生成的文件时会在最后删除。
我在.SECONDARY中添加了先决条件,但没有帮助,我不得不将其添加到.PRECIOUS。
这是一个问题为什么它没有在.SECONDARY工作?。
从我在SO上找到的东西 .SECONDARY不能与模式(%)一起使用,但即使知道它是否是设计或是否是make中的错误。 (.SECONDARY for a pattern rule with GNU Make和Makefile pattern rule either ignores phony rule or spontaneously deletes output file)
这里是我的Makefile的精简内容,以重现我的问题(请创建一个com / stackoverflow / question目录来测试它)。
PACKAGE=com.stackoverflow.question
PACKAGE_DIR=$(subst .,/,$(PACKAGE))
OUT=out
clean:
find $(OUT) -name "*.class" -type f -print0|xargs -0 rm
# does not work : deleted at end due to intermediate file removal.
$(PACKAGE_DIR)/%.java:
@echo "package com.stackoverflow.question;\npublic class $(subst .java,,$(subst $(PACKAGE_DIR)/,,$@))\n{\n /** TODO */ \n}" >$@
work/%: $(PACKAGE_DIR)/$(subst work/,,%).java
emacs $<
.PHONY: clean work/%
# tried to avoid intermediate file removal : does not work
.SECONDARY: $(PACKAGE_DIR)/%.java
# if not commented this does work : once precious intermediate file is not removed.
#.PRECIOUS: $(PACKAGE_DIR)/%.java
尝试
make work / SoTest
我知道这是标记为中间的。
然后查看SO我试图将其设置为.SECONDARY:目标列表:也不起作用。
查看make源代码我发现删除中间文件是在此上下文中完成的:
if (f->intermediate && (f->dontcare || !f->precious)
&& !f->secondary && !f->cmd_target)
所以我将文件设置为.PRECIOUS:现在它可以正常工作。
显示到控制台:
COM /计算器/问题/ SoTest.java
它运行带有正确模板的emacs,因此创建正常 在这里我退出emacs
并删除最后的文件
rm com / stackoverflow / question / SoTest.java
最后删除是由于中间文件,这可以在make
上看到-d选项LANG = C make -d work / SoTest
...
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
要让它正常工作,我需要取消注释.PRECIOUS段落。
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.
答案 0 :(得分:14)
感谢Alex(见答案)我进一步搜索。
我发现它在制作项目的TODO.private中被记录了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.
这些都应该是相同的,只要有意义。但没有编码。
答案 1 :(得分:5)
答案&#34;为什么.SECONDARY不适用于模式(%),而.PRECIOUS可以使用?&#34; here :文件说
您还可以将隐式规则的目标模式(例如'%.o')列为特殊目标的先决条件文件.PRECIOUS
但并未就此.SECONDARY
说出这一点。但是对于少数明确的例外,没有一个特殊目标接受模式。