1

Вопрос уже ответил на уровне файла. Но у меня есть более крупный проект, у которого довольно много межпроектных зависимостей (вызванных заголовками DBus, которые генерировались динамически).Parallel Make - Sub-Projects, вызываемые несколько раз

Я создал следующее пример (example files as ZIP - настоящий проект намного сложнее).

верхнего уровня Makefile является следующее:

sub-%: 
    $(MAKE) -C $(patsubst sub-%,%,[email protected]) 

default: 
    $(MAKE) -j12 sub-p1 sub-p2 sub-p3 

Makefile, из подпроекта выглядеть следующим образом (p1, p2 и p3):

all: p1 

../lib/lib.a: 
    $(MAKE) -C ../lib lib.a 

p1: ../lib/lib.a 
    cp -f ../lib/lib.a p1 

И в Makefile из lib выглядит следующим образом:

lib.a: 
    sleep 2 
    date > [email protected] 
    echo Done with building [email protected] 

ПРОБЛЕМА: библиотека построена для каждого проекта p* - параллельно параллельно - в этом примере это не проблема, но в нашем случае это вызывает неразрешимые проблемы.

Когда я звоню make на высшем уровне, я получаю следующий вывод:

$ make 
make -j12 sub-p1 sub-p2 sub-p3 
make[1]: Entering directory '/home/kkr/tmp/parallelmake' 
make -C p1 
make -C p2 
make -C p3 
make[2]: Entering directory '/home/kkr/tmp/parallelmake/p1' 
make -C ../lib lib.a 
make[2]: Entering directory '/home/kkr/tmp/parallelmake/p2' 
make -C ../lib lib.a 
make[2]: Entering directory '/home/kkr/tmp/parallelmake/p3' 
make -C ../lib lib.a 
make[3]: Entering directory '/home/kkr/tmp/parallelmake/lib' 
make[3]: Entering directory '/home/kkr/tmp/parallelmake/lib' 
make[3]: Entering directory '/home/kkr/tmp/parallelmake/lib' 
sleep 2 
sleep 2 
sleep 2 
date > lib.a 
date > lib.a 
date > lib.a 
make[3]: Leaving directory '/home/kkr/tmp/parallelmake/lib' 
make[3]: Leaving directory '/home/kkr/tmp/parallelmake/lib' 
make[3]: Leaving directory '/home/kkr/tmp/parallelmake/lib' 
cp -f ../lib/lib.a p3 
cp -f ../lib/lib.a p1 
cp -f ../lib/lib.a p2 
make[2]: Leaving directory '/home/kkr/tmp/parallelmake/p3' 
make[2]: Leaving directory '/home/kkr/tmp/parallelmake/p1' 
make[2]: Leaving directory '/home/kkr/tmp/parallelmake/p2' 
make[1]: Leaving directory '/home/kkr/tmp/parallelmake' 

ВОПРОС: Можно ли синхронизировать подпроекты каким-то образом автоматически?

Поскольку real project имеет 13 подпроектов - большинство из них имеют межпроектные зависимости - ручная синхронизация будет довольно сложной.

ответ

0

Существует нет никакого способа для системы рекурсивного создания «автоматически» синхронизировать это; они являются полностью отдельными процессами и не могут сказать друг другу, что они выполняют заданную цель.

У вас есть два варианта. Первое, что лучше всего, но может быть очень много, - это переработать вашу систему сборки, чтобы она не была рекурсивной. Если у вас есть один вызов make, который строит всю систему, тогда есть только один экземпляр make, и он будет глобально координировать создание всех целей. Вам не понадобятся правила $(MAKE) -C ../lib lib.a.

Если это не осуществимо, вам необходимо переписать свой файл верхнего уровня, чтобы вы обеспечили выполнение заказа таким образом, чтобы вы никогда не начинали создавать два каталога, которые зависят от одной и той же внешней цели, в то же время. Например, вместо Makefile верхнего уровня вы показываете выше, писать так:

default: p1 p2 p3 

p%: ; $(MAKE) -C [email protected] 

.PHONY: default p1 p2 p3 

Теперь предположим, что вы хотите, чтобы убедиться, что p1 запускается перед p2 и p3, потому что вы хотите p1 построить все общие цели; то вы бы добавить правило, как это в Makefile верхнего уровня:

p2 p3: p1 

И вы можете добавить другие упорядоченности по мере необходимости.

+0

Я потратил часы, пытаясь заставить это работать с параллельным оформлением. Вы полностью уверены, что это работает? Как выглядит правило ссылок, которое зависит от библиотек подпроектов?Я могу только заставить его пересматривать каждый раз или даже не ссылаться после создания подпроектов. Мой Makefile идеален без '-j'. – doug65536

+0

В этом примере недостаточно подробных ответов на ваш вопрос. Это абстрактный дизайн высокого уровня. И комментариев SO недостаточно для этих объяснений. Если у вас есть подробный вопрос, я рекомендую вам задать новый вопрос с более подробной информацией. – MadScientist

+0

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

Смежные вопросы