2016-05-06 7 views
1

Beim Testen der Parallelisierungsmöglichkeiten im Falle rekursiver make bin ich auf ein merkwürdiges Verhalten mit den Musterregeln gestoßen.Musterregel für Unterverzeichnisse erstellen

Die Makefile:

## prepare the dir structure 
# mkdir -p bs{1,2,3} 
# for i in 1 2 3; do ln -s ../Makefile bs$i ; done 

aaa: 
     @echo $(CURDIR) 
     sleep 1 

s: bs1 bs2 bs3 
     true 

## alt1 
bs1 bs2 bs3: ; +make -C [email protected] aaa 

## alt2 
#bs%: ; +make -C [email protected] aaa 

.PHONY: s bs1 bs2 bs3 

Es gibt zwei Alternativen, wie die Ziele bestimmen: entweder buchstäblich alle Ziele in der Rezeptliste, alt1-bs1 bs2 bs3 - oder verwenden Sie das % Muster, alt2 - bs%.

Wenn ich make -j s mit der alt1 ausführen, funktioniert es wie erwartet.

Aber wenn ich zu alt2 (Kommentar aus alt1 Regel Kommentar in alt2 Regel) wechseln, die make -j s läuft nur die true und ignorieren leise die Voraussetzung bs1, bs2 und bs3 Ziele.

Ebenso mit alt1, make bs1 ruft die Unter machen, während mit alt2, make bs1 sagt, dass Nothing to be done for 'bs1'. Der Trick mit dem .force Dummy-Ziel nicht das Verhalten geändert hat.

Warum?

Antwort

1

Vom manual

Die implizite Regel suchen (siehe Implicit Rules) wird für .PHONY Ziele übersprungen.

bs%: ist eine implizite Regel, daher wird sie ignoriert.

+0

Mit anderen Worten, in diesem Fall stimmt der Zielname möglicherweise nicht mit dem Verzeichnisnamen überein. – Dummy00001

+0

@ Dummy00001 Es kann, wie Sie gesehen haben, mit der ersten Regel, die Sie definiert haben, Sie können Musterregeln nicht zusammen mit '.PHONY' Zielen verwenden. – user657267