告诉“制作”忽略依赖的头号目标已经被创建时(telling 'make' to ig

2019-07-31 06:47发布

我正在以下各种管道的:

digestA: hugefileB hugefileC
    cat $^ > $@
    rm $^

hugefileB:
    touch $@

hugefileC:
    touch $@

这些目标hugefileBhugefileC都非常大,需要很长的时间来计算(和制作所需的功率)。 但是,一旦消化已经建立,就没有必要保持其相关性:它删除那些依赖于释放磁盘空间。

现在,如果我调用“制作”再次,hugefileBhugefileC将被重建,而食糜已经确定。

有没有办法告诉“使”,以避免重新comile的依赖?

注:我不希望建立“消化”规则中的两个依赖。

Answer 1:

使用“中间文件” 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.


Answer 2:

如果标记hugefileBhugefileC作为中间文件 ,你会得到你想要的行为:

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在构建结束时自动删除中间文件。



Answer 3:

我建议你创建一个由创建伪缓存文件hugefileBhugeFileC目标。

然后有digestA取决于这些缓存文件,因为你知道,直到你手动调用昂贵的目标,他们不会再改变。



Answer 4:

正确的方法是不删除这些文件,因为这将删除的信息make的用途来确定是否要重建文件。

重塑他们作为空没有帮助,因为make那么就会认为空文件完全建立。

如果有合并摘要的方式,那么你可以创建一个从每个大文件,将其保持的,而且因为它是一个中间大文件自动删除。



文章来源: telling 'make' to ignore dependencies when the top target has been created