1

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.

Répondre

0

Il n'y a clairement aucun moyen pour un système de make récursif de le "synchroniser" automatiquement; ce sont des processus complètement séparés et ils n'ont aucun moyen de se dire qu'ils exécutent une cible donnée.

Vous avez deux choix. Le premier, qui est le meilleur, mais peut-être beaucoup de travail, est de retravailler votre système de construction pour qu'il ne soit pas récursif. Si vous avez une seule invocation make qui construit le système entier, alors il n'y a qu'une seule instance de make, et elle va globalement coordonner la création de toutes les cibles. Vous n'aurez pas besoin des règles $(MAKE) -C ../lib lib.a. Si ce n'est pas faisable, alors vous devez réécrire votre makefile de haut niveau afin que vous appliquiez un ordre de sorte que vous ne commenciez jamais à créer deux répertoires qui dépendent de la même cible externe, en même temps. Par exemple au lieu du makefile de haut niveau vous montrer ci-dessus, écrivez comme ceci:

default: p1 p2 p3 

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

.PHONY: default p1 p2 p3 

Supposons maintenant que vous voulez vous assurer que p1 fonctionne avant p2 et p3 parce que vous voulez p1 construire tous les objectifs communs; alors vous ajoutez une règle comme celle-ci le makefile haut niveau:

p2 p3: p1 

Et vous pouvez ajouter d'autres ordonnancements au besoin.

+0

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

+0

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

+0

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