La question est déjà traitée au niveau du fichier. Mais j'ai un projet plus grand qui a beaucoup de dépendances inter-projets (causées par des en-têtes DBus, qui ont été générés dynamiquement).Marque parallèle - Sous-projets appelés plusieurs fois
J'ai créé l'exemple suivant (example files as ZIP - le projet réel est beaucoup plus complexe).
Le haut niveau Makefile
est le suivant:
sub-%:
$(MAKE) -C $(patsubst sub-%,%,[email protected])
default:
$(MAKE) -j12 sub-p1 sub-p2 sub-p3
Le Makefile du sous-projet ressemble à ceci (p1
, p2
et p3
):
all: p1
../lib/lib.a:
$(MAKE) -C ../lib lib.a
p1: ../lib/lib.a
cp -f ../lib/lib.a p1
Et le Makefile du lib
ressemble à ceci:
lib.a:
sleep 2
date > [email protected]
echo Done with building [email protected]
LE PROBLÈME: La bibliothèque est construite pour chaque p*
-projet séparément en parallèle - dans cet exemple ce n'est pas un problème, mais dans notre cas, il provoque des problèmes insolubles.
Quand j'appelle make
sur le haut niveau, je reçois la sortie suivante:
$ 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'
QUESTION: Est-il possible de synchroniser les sous-projets en quelque sorte automatiquement?
Puisque le real project
a 13 sous-projets - avec la plupart d'entre eux ayant des dépendances entre projets - une synchronisation manuelle serait assez difficile.
J'ai passé des heures à essayer de faire fonctionner cela avec make parallèle. Êtes-vous complètement sûr que cela fonctionne? À quoi ressemble la règle de lien qui dépend des bibliothèques de sous-projets?Je ne peux que le relier à chaque fois ou même pas le lien après la construction de sous-projets. Mon Makefile est parfait sans '-j'. – doug65536
Cet exemple ne fournit pas suffisamment de détails pour répondre à votre question. C'est un design abstrait de haut niveau. Et, SO commentaires ne sont pas suffisants pour ces explications. Si vous avez une question détaillée, je vous recommande de déposer une nouvelle question avec plus de détails. – MadScientist
Mais oui, la conception fonctionne ici. Si vous devez fournir une autre cible au niveau de la racine qui complète tout le travail effectué au niveau des répertoires individuels, c'est une chose complètement différente qui n'est pas discutée ou décrite ici car ce n'est pas ce que cette question pose. – MadScientist