我的问题是更好地理解我在制作过程中错过的内容和.SECONDARY目的与.PRECIOUS,而不是让我的脚本工作,因为它确实有效.
我正在使用make来打开文件上的emacs编辑器(java但与此问题无关)或者如果不存在则使用模板创建它.
如果它适用于现有文件,则在使用生成的文件时,最后会将其删除.
我在.SECONDARY中添加了先决条件但没有帮助,我不得不将其添加到.PRECIOUS中.
这就是为什么不在它工作的问题.SECONDARY?.
从我在SO上找到的 .SECONDARY不能用于模式(%),但即使知道它是否是设计或是否是make中的错误.(.SECONDARY用于GNU Make和Makefile模式规则的模式规则要么忽略虚假规则,要么自发删除输出文件)
这里是我的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
# …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个makefile以使用模式规则为多个源中的每个源生成多个输出文件。
我有以下Makefile(GNU Make 3.8.1):
all : foo.all bar.all
%.all : %.pdf %.svg
@echo Made $*
%.pdf :
touch $@
%.svg :
touch $@
.PHONY: foo.all bar.all
Run Code Online (Sandbox Code Playgroud)
由于*.all不代表实际的输出文件,因此我尝试将其标记为.PHONY。但是,运行make则不起作用:
$ ls
Makefile
$ make
make: Nothing to be done for `all'.
Run Code Online (Sandbox Code Playgroud)
根据make -d:
No implicit rule found for `all'.
Considering target file `foo.all'.
File `foo.all' does not exist.
Finished prerequisites of target file `foo.all'.
Must remake target `foo.all'.
Successfully remade target file …Run Code Online (Sandbox Code Playgroud) 为了调试一个复杂的 XSLT 转换,我将它分成几个部分:首先我构建%.1.xml,然后我用它来构建%.2.xml,最后我构建%.3.xml. 一切正常,但是如果我要求 Make 构建最后一个,那么 Make 总是会删除中间的%.1.xml和%.2.xml,而我宁愿保留它们。我试图将所有.xml文件标记为.PRECIOUS:
.PRECIOUS: %.xml
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。(我也尝试使用%.1.xmland %.2.xml,但这也不起作用。然后我尝试以.SECONDARY相同的方式将它们标记为相同的负面结果。它不删除中间文件的唯一方法是当文件已经存在;在这种情况下,它只重建它们。但如果文件不存在,它总是删除它们。
我错过了什么?
GNU 制作 4.1。
更新: Makefile,>>代表TAB:
sample-%.1.xml: sample-%.0.xml job.1.xslt job.xslt
>> xsltproc $(filter %.1.xslt,$^) $(filter %.xml,$^) > $@
sample-%.2.xml: sample-%.1.xml job.2.xslt job.xslt
>> xsltproc $(filter %.2.xslt,$^) $(filter %.xml,$^) > $@
sample-%.3.xml: sample-%.2.xml job.3.xslt job.xslt
>> xsltproc $(filter %.3.xslt,$^) $(filter %.xml,$^) > $@
.SECONDARY: %.xml # …Run Code Online (Sandbox Code Playgroud)