我正在以下各种管道的:
digestA: hugefileB hugefileC
cat $^ > $@
rm $^
hugefileB:
touch $@
hugefileC:
touch $@
这些目标hugefileB和hugefileC都非常大,需要很长的时间来计算(和制作所需的功率)。 但是,一旦消化已经建立,就没有必要保持其相关性:它删除那些依赖于释放磁盘空间。
现在,如果我调用“制作”再次,hugefileB和hugefileC将被重建,而食糜已经确定。
有没有办法告诉“使”,以避免重新comile的依赖?
注:我不希望建立“消化”规则中的两个依赖。
使用“中间文件” GNU的功能品牌:
中间文件重拍使用他们的规则,就像所有其他文件。 但是中间文件以两种方式区别对待。
第一个区别是如果中间文件不存在,会发生什么。 如果是普通的文件B不存在,并使认为依赖于B的目标,这必然造成B,然后从B更新目标。 但是,如果b为中间文件,然后做可以独自离开不够好。 它不会打扰更新b或最终目标,除非B的一些前提条件是较新的目标或者有一些其他的原因,以更新的目标。
第二个区别是,如果化妆确实为了别的东西更新创造B,它会删除乙则后它不再需要了。 因此,这并没有使之前存在一个中间文件也不会使后存在。 通过打印使报告的缺失给你rm -f
命令显示哪些文件被删除。
通常,如果在生成文件作为目标或先决条件提到一个文件不能中间。 但是,可以明确将其列为特殊目标的先决条件文件标记为中间.INTERMEDIATE
。 这需要即使该文件以其他方式明确提及的效果。
可以通过将其标记为次级文件防止中间文件的自动删除。 要做到这一点,将其列为特殊目标的先决条件.SECONDARY
。 当一个文件是次要的,让不会创建仅仅因为它已经不存在的文件,但要不会自动删除该文件。 将文件标记为仲也标记为中间。
所以,把下面的一行到Makefile中应该足够:
.INTERMEDIATE : hugefileB hugefileC
调用使首次:
$ make
touch hugefileB
touch hugefileC
cat hugefileB hugefileC > digestA
rm hugefileB hugefileC
而接下来的时间:
$ make
make: `digestA' is up to date.
如果标记hugefileB
和hugefileC
作为中间文件 ,你会得到你想要的行为:
digestA: hugefileB hugefileC
cat $^ > $@
hugefileB:
touch $@
hugefileC:
touch $@
.INTERMEDIATE: hugefileB hugefileC
例如:
$ gmake
touch hugefileB
touch hugefileC
cat hugefileB hugefileC > digestA
rm hugefileB hugefileC
$ gmake
gmake: `digestA' is up to date.
$ rm -f digestA
$ gmake
touch hugefileB
touch hugefileC
cat hugefileB hugefileC > digestA
rm hugefileB hugefileC
请注意,您不需要明确的rm $^
命令了- GMAKE在构建结束时自动删除中间文件。
我建议你创建一个由创建伪缓存文件hugefileB
和hugeFileC
目标。
然后有digestA
取决于这些缓存文件,因为你知道,直到你手动调用昂贵的目标,他们不会再改变。
正确的方法是不删除这些文件,因为这将删除的信息make
的用途来确定是否要重建文件。
重塑他们作为空没有帮助,因为make
那么就会认为空文件完全建立。
如果有合并摘要的方式,那么你可以创建一个从每个大文件,将其保持的,而且因为它是一个中间大文件自动删除。