并行make(gmake)执行顺序

问题描述 投票:0回答:1

我有一个makefile,其中包含许多独立的目标,每个目标都取决于一个中间目标。这是一个简化的makefile示例:

.PHONY: %.world %.hello

all: 0.world 1.world 2.world 3.world 4.world 5.world 6.world

%.world: %.hello
    @echo $@

%.hello:
    @echo $@

.INTERMEDIATE: %.hello

当我连续运行make时,它按以下顺序处理:

0.hello
0.world
1.hello
1.world
2.hello
2.world
3.hello
3.world
4.hello
4.world
5.hello
5.world
6.hello
6.world

但是当我使用-j2运行时,它首先运行all中间文件,然后最终文件:

0.hello
1.hello
2.hello
3.hello
4.hello
5.hello
6.hello
0.world
1.world
2.world
3.world
4.world
5.world
6.world

两种顺序都是正确的,但是当处理许多100个目标时,我宁愿更快地拥有最终文件(*.world),而不是等待all中间文件。有什么方法可以调整执行顺序,以便执行起来更像这样:

0.hello
1.hello
0.world
1.world
2.hello
3.hello
2.world
3.world
4.hello
5.hello
4.world
5.world
6.hello
6.world

我知道我可以通过依赖关系人为地强制执行任何通用排序,但是我需要一个更通用的解决方案,因为我正在使用模式规则和100多个自动生成的目标。

makefile parallel-processing gnu-make order-of-execution
1个回答
0
投票

不,您无法更改此行为。 Make在一个方向上走动图,直到完成后才重新开始。即使看到某些先决条件已完成构建,它也将一直遍历图直到完成,然后从头开始重新构建并准备好要构建的事物。

© www.soinside.com 2019 - 2024. All rights reserved.