Gnu Make:调用并行 make 时,如果在构建过程中提供了先决条件,make 会尝试重新制作那些吗?

Gnu Make: When invoking parallel make, if pre-requisites are supplied during the build, will make try to remake those?

这是一个操作顺序问题。

假设我声明了一个需求列表:

required:=$(patsubst %.foo,%.bar, $(shell find * -name '.foo'))

以及制定这些要求的规则:

$(required):
   ./foo.py $@

最后,我调用工作:

make foo -j 10

进一步假设这项工作需要几天又几天(在这台慢速台式计算机上最多需要一周)。

为了加快速度,我想生成一个命令列表并在 Much 更快的笔记本电脑上完成一些工作。我无法在笔记本电脑上完成所有工作,因为无论出于何种原因,它不能在不放电和暂停的情况下保持数小时和数小时(如果我不得不猜测,可能是由于热节流):

make -n foo > outstanding_jobs

cat outstanding_jobs | sort -r | sponge outstanding_jobs
scp slow_box:outstanding_jobs fast_laptop:outstanding_jobs

ssh fast_laptop
head -n 200 outstanding_jobs | parallel -j 12
scp *.bar slow_box:.

问题是:

如果我将 *.bar 放在原始 make 作业所在的目录中 运行,make 仍然会尝试在慢速盒上完成该作业?

我是否必须停止慢速盒上的工作并重新调用 make 以在我已同步的新工作的 make 配方中“获得信用”移到慢速箱上?

注:大幅修订。

在开始构建任何东西之前,make 构建一个依赖图来指导它,基于对请求的目标、适用的构建规则以及在某种程度上已经存在的文件的分析当前的。然后它遍历图表,从目标节点开始,以确定哪些节点在其先决条件方面已过时并更新它们。

虽然它不一定会在 运行 任何配方之前评估整个图表,但一旦它决定需要更新给定的目标,make 就会致力于更新它。特别是,一旦 make 决定 T 的某些直接或间接先决条件已过时,它也会致力于(重新)构建 T,无论对 T 由另一个进程。 所以,...

If I put *.bar in the directory where the original make job was run, will make still try to do that job on the slow box?

make 开始构建之后将文件添加到构建目录不一定会影响正在进行的 make 运行 将尝试构建的目标,也不会影响它用于构建的配方他们。目标越接近依赖关系图的根,所描述的方法影响 make 是否执行重建的可能性就越小,特别是如果您 运行 正在并行 make .

您可能会看到一些时间节省,但您还必须考虑最终构建不一致的可能性。

OR do I have to halt the job on the slow box and re-invoke make to "get credit" in the make recipe for the new work that I've synced over onto the slow box?

如果构建不一致的可能性可以降低,那么这可能是一个可行的选择。新的 make 运行 将考虑当时存在的文件。根据定义的规则和适用的时间戳,仍然有可能重建一些实际上不需要的目标,但除非 makefile 参与不寻常的恶作剧,否则很有可能至少从导入的大部分构建文件辅助机无需重建即可接收使用