Порядок параллельного выполнения (gmake) - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть make-файл со многими независимыми целями, каждая из которых зависит от одной промежуточной цели. Вот пример упрощенного make-файла:

.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, он запускается все сначала промежуточные файлы, , затем последние:

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

Оба порядка верны, но при обработке многих сотен целей я бы предпочел Конечные файлы (*.world) скорее, чем ожидают всех промежуточных файлов. Есть ли способ настроить порядок выполнения так, чтобы он выполнялся примерно так:

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

Я знаю, что мог бы искусственно принудить принудительно упорядочить любой шаблон c с зависимостями, но мне нужно более общее решение так как я работаю с шаблонными правилами и сотнями автоматически сгенерированных целей.

1 Ответ

2 голосов
/ 20 февраля 2020

Нет, вы никак не можете изменить это поведение. Make ходит по графику в одном направлении, и он не начинается заново, пока не закончится. Даже если он видит, что какое-то предварительное условие завершило сборку, он будет продолжать проходить график до тех пор, пока не выполнит его, перед тем как перезапустить в начале и построить вещи, которые теперь готовы для сборки.

...