Вопрос уже ответил на уровне файла. Но у меня есть более крупный проект, у которого довольно много межпроектных зависимостей (вызванных заголовками 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 подпроектов - большинство из них имеют межпроектные зависимости - ручная синхронизация будет довольно сложной.
Я потратил часы, пытаясь заставить это работать с параллельным оформлением. Вы полностью уверены, что это работает? Как выглядит правило ссылок, которое зависит от библиотек подпроектов?Я могу только заставить его пересматривать каждый раз или даже не ссылаться после создания подпроектов. Мой Makefile идеален без '-j'. – doug65536
В этом примере недостаточно подробных ответов на ваш вопрос. Это абстрактный дизайн высокого уровня. И комментариев SO недостаточно для этих объяснений. Если у вас есть подробный вопрос, я рекомендую вам задать новый вопрос с более подробной информацией. – MadScientist
Но да, дизайн здесь работает. Если вам нужно предоставить еще одну цель на корневом уровне, которая завершает всю работу, выполняемую на отдельных уровнях каталогов, это совершенно другая вещь, о которой здесь не говорится или не рассказано, потому что это не то, о чем этот вопрос задал. – MadScientist