2016-09-14 3 views
0

Ich möchte die folgenden Regeln haben:GNU make nicht Ziel bauen

foo_% bar_%: 
     @echo "Complex building instructions for [email protected]" 

all: foo_xyz bar_xyz 

und führen Sie dann 'alle machen' und erhalten:

Complex building instructions for foo_xyz 
Complex building instructions for bar_xyz 

Da jedoch die '%' passt die gleiche Zeichenfolge zweimal (xyz) es ist nur das erste Mal "gebaut", so alles, was ich bekomme, ist die erste Zeile.

Gibt es eine Möglichkeit, GNU make dazu zu bringen, das 'Echo' zweimal auszuführen, wenn '$ @' beim zweiten Mal anders ist? Immerhin, da $ @ anders ist, sind die Build-Anweisungen unterschiedlich:/

Antwort

1

Wie Sie bemerkt haben, verhalten sich mehrere Muster-Ziele anders als normale Ziele: Make wird das Rezept betrachten, das für die Erstellung aller Muster verantwortlich ist.

Ein Weg, dies zu lösen, ist eine Definition zu verwenden:

define complex-rule 
$1: 
    @echo "Complex building instructions for [email protected]" 
endef 

$(eval $(call complex-rule,foo_%)) 
$(eval $(call complex-rule,bar_%)) 

all: foo_xyz bar_xyz 

Beachten Sie, dass, da es eval ed sein, ich [email protected]-[email protected] entkommen, weil ich es will erweitert werden, wenn das Rezept ausgeführt wird, nicht wenn ich eval es. Auf der anderen Seite, ich habe nicht entkommen $1, weil ich das erste Argument auf call erweitern möchte.