我正在运行以下类型的管道:
digestA: hugefileB hugefileC
cat $^ > $@
rm $^
hugefileB:
touch $@
hugefileC:
touch $@
目标hugefileB和hugefileC很大,计算时间很长(需要Make的功能)。但是一旦创建了[[digestA,就无需保留其依赖项:它将删除那些依赖项以释放磁盘空间。
现在,如果我再次调用'make',则将重新构建hugefileB
和hugefileC,而digestA已经可以。有没有办法告诉'make'以避免重新编译依赖项?注意:我不想在'digestA'的规则中建立两个依赖关系。
与所有其他文件一样,使用其规则重新制作中间文件。但是中间文件在两种方式上有区别。
第一个区别是如果中间文件不存在会发生什么。如果普通文件b不存在,并且make考虑依赖于b的目标,则它总是创建b,然后从b更新目标。但是如果b是一个中间文件,那么make可以足够独立。除非b的某些先决条件比该目标新,或者有其他原因更新该目标,否则它不会麻烦更新b或最终目标。
第二个区别是,如果make确实创建了b以便更新其他内容,它将在不再需要b之后删除b。 因此,在make之前不存在的中间文件在make之后也不存在。 make通过打印显示要删除哪个文件的
rm -f
命令向您报告删除。通常,如果文件在makefile中被提及为目标或先决条件,则该文件不能是中间文件。 但是,您可以通过将文件列出为特殊目标
.INTERMEDIATE
的先决条件来将其明确标记为中间文件。即使该文件以其他某种方式被明确提及,此方法也会生效。您可以通过将中间文件标记为辅助文件来防止其自动删除。
为此,请将其列出为特殊目标.SECONDARY
的先决条件。当文件为辅助文件时,make不会仅仅因为该文件不存在而创建该文件,而是make不会自动删除该文件。将文件标记为辅助文件也将其标记为中间文件。因此,将以下行添加到Makefile中就足够了:
.INTERMEDIATE : hugefileB hugefileC
第一次调用make:
$ make touch hugefileB touch hugefileC cat hugefileB hugefileC > digestA rm hugefileB hugefileC
下一次:
$ make
make: `digestA' is up to date.