2013-06-18 10 views
5

Mam raczej duży projekt oparty na autotoolach, który żyje w drzewie katalogów składającym się z wielu katalogów z podkatalogami. Ma cel check (w każdym podkatalogu, a także katalog główny), który wykonuje wiele automatycznych testów. Obiekt docelowy check jest tworzony rekurencyjnie.make: wyłącz równoległy budynek w podkatalogu tylko dla pojedynczego celu

Budowanie i testowanie równolegle (za pomocą opcji -j) działa dla większości katalogów. Istnieje jednak jeden katalog, który zawiera test, który nie działa, gdy jest wykonywany równolegle (czułość czasowa), ale przechodzi, gdy jest uruchamiany szeregowo.

Pytanie brzmi: czy istnieje sposób na zmuszenia do budowania celu check seryjnie w tym jednym podkatalogu podczas budowania wszystkiego innego równolegle?

+0

Jedyną sztuczką, którą mogę wymyślić jest wstawienie fałszywej zależności do sprawdzenia seryjnego. W podręczniku jest [podstawowy pomysł] (http://www.gnu.org/software/automake/manual/automake.html#true). –

+0

Dlaczego nie rozwiązać tego problemu, uzależniając cele od siebie? – reinierpost

Odpowiedz

1

Jeśli ja zrozumiałem, to po uruchomieniu rekurencyjną markę, która buduje cel check można po prostu przejść -j1 specjalnie, aby zapewnić, że działa on seryjnie:

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

Spróbuję, gdy znajdę kilka minut. – arne

+0

To nie działa: to daje mi ostrzeżenie: -jN wymuszone w submacie –

+1

To działa absolutnie. Tak, dostaniesz ostrzeżenie. Ale nie będzie równolegle wykonywać zadań. Używanie NOTPARALLEL jest czystsze, jeśli zawsze chcesz, aby każde wywołanie tego pliku Makefile było uruchamiane nie równolegle (a nie tylko określone wywołanie, które wywołuje określony cel), i możesz zmienić plik Makefile. Jeśli jedno lub oba z nich nie są prawdziwe, wówczas NOTPARALLEL jest mniej pomocny. – MadScientist

6

Dodaj do Makefile:

.NOTPARALLEL:

Zobacz dokumentację GNU make here.

Powiązane problemy