告诉'make'在创建最高目标时忽略依赖项

问题描述 投票:23回答:5

我正在运行以下类型的管道:

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

hugefileB:
    touch $@

hugefileC:
    touch $@

目标hugefileBhugefileC很大,计算时间很长(需要Make的功能)。但是一旦创建了[[digestA,就无需保留其依赖项:它将删除那些依赖项以释放磁盘空间。

现在,如果我再次调用'make',则将重新构建

hugefileB

hugefileC,而digestA已经可以。有没有办法告诉'make'以避免重新编译依赖项?

注意:我不想在'digestA'的规则中建立两个依赖关系。

makefile gnu-make
5个回答
30
投票

与所有其他文件一样,使用其规则重新制作中间文件。但是中间文件在两种方式上有区别。

第一个区别是如果中间文件不存在会发生什么。如果普通文件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.

3
投票

1
投票

0
投票

-1
投票
© www.soinside.com 2019 - 2024. All rights reserved.