2013-06-18 5 views
5

Ich habe ein ziemlich großes autotools-betriebenes Projekt, das in einem Verzeichnisbaum lebt, der aus vielen Verzeichnissen mit Unterverzeichnissen besteht. Es hat ein Ziel check (in jedem Unterverzeichnis sowie das Hauptverzeichnis), die eine ganze Reihe von automatisierten Tests ausführt. Das Ziel check wird rekursiv erstellt.make: Paralleles Bauen im Unterverzeichnis für einzelnes Ziel deaktivieren

Gebäude sowie paralleles Testen (über die -j Option zu machen) funktioniert für die meisten Verzeichnisse. Es gibt jedoch ein Verzeichnis, das Tests enthält, die nicht funktionieren, wenn sie parallel ausgeführt werden (Timing-Sensitivität), aber wenn sie seriell ausgeführt werden.

Die Frage ist: Gibt es eine Möglichkeit, zu zwingen, das check Ziel seriell in nur einem Unterverzeichnis zu bauen, während alles andere parallel aufgebaut wird?

+0

Der einzige Trick, den ich mir vorstellen kann, ist das Einfügen einer falschen Abhängigkeit für die serielle Prüfung. Es gibt eine [Grundidee] (http://www.gnu.org/software/automake/manual/automake.html#true) im Handbuch. –

+0

Warum lösen wir das nicht, indem wir die Ziele voneinander abhängig machen? – reinierpost

Antwort

1

Wenn ich Sie richtig verstanden habe, dann, wenn Sie die rekursive make ausführen, die die check Ziel baut können Sie einfach -j1 speziell passieren, um sicherzustellen, dass sie seriell ausgeführt wird:

check: ; $(MAKE) -j1 ... 
+0

Ich werde das versuchen, wenn ich ein paar Minuten finde. – arne

+0

Dies funktioniert nicht: das gibt mir eine Warnung: -JN gezwungen, in Submake –

+1

Es funktioniert absolut. Ja, Sie erhalten eine Warnung. Aber es werden keine Jobs parallel laufen. Die Verwendung von NOTPARALLEL ist sauberer, wenn jeder Aufruf dieses Makefile nicht parallel ausgeführt werden soll (und nicht nur ein bestimmter Aufruf, der ein bestimmtes Ziel aufruft), und Sie können das Makefile ändern. Wenn eins oder beide nicht wahr sind, ist NOTPARALLEL weniger hilfreich. – MadScientist

6

in Ihre Makefile:

.NOTPARALLEL:

Siehe die Dokumentation von GNU make here.