在创建顶层目标时告诉'make'忽略依赖关系

Pie*_*rre 23 makefile gnu-make

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

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

hugefileB:
    touch $@

hugefileC:
    touch $@
Run Code Online (Sandbox Code Playgroud)

目标hugefileBhugefileC非常大,需要很长时间才能计算(并需要Make的强大功能).但是一旦创建了digestA,就不需要保留它的依赖关系:它会删除这些依赖关系以释放磁盘空间.

现在,如果我再次调用'make',将重建hugefileBhugefileC,而digestA已经可以了.

有没有办法告诉'make'避免重新编译依赖项?

注意:我不想在'digestA'的规则中构建两个依赖项.

Eld*_*mov 30

使用GNU Make的"中间文件"功能:

中间文件使用其规则重制,就像所有其他文件一样.但是中间文件以两种方式区别对待.

第一个区别是如果中间文件不存在会发生什么.如果普通文件b不存在,并且make考虑依赖于b的目标,则它总是创建b,然后从b更新目标.但是如果b是一个中间文件,那么make就可以单独留下.它不会打扰更新b或最终目标,除非b的某些先决条件比该目标更新或者有更新该目标的其他原因.

第二个区别是,如果make确实创建了b以便更新其他东西,那么它会在不再需要之后删除b.因此,make之后不存在的中间文件也不存在.通过打印rm -f显示正在删除哪个文件的命令,向您报告删除.

通常,如果文件在makefile中被提及为目标或先决条件,则文件不能是中间文件.但是,您可以通过将文件列为特殊目标的先决条件将文件显式标记为中间文件.INTERMEDIATE.即使以某种其他方式明确提到文件,这也会生效.

您可以通过将中间文件标记为辅助文件来阻止自动删除它.为此,请将其列为特殊目标的先决条件.SECONDARY.当文件是辅助文件时,make不会仅因为它尚不存在而创建文件,但make不会自动删除该文件.将文件标记为辅助文件也将其标记为中间文件.

因此,将以下行添加到Makefile应该就足够了:

.INTERMEDIATE : hugefileB hugefileC
Run Code Online (Sandbox Code Playgroud)

第一次调用make:

$ make
touch hugefileB
touch hugefileC
cat hugefileB hugefileC > digestA
rm hugefileB hugefileC
Run Code Online (Sandbox Code Playgroud)

下一次:

$ make
make: `digestA' is up to date.
Run Code Online (Sandbox Code Playgroud)