2010-09-19 9 views
11

ich so etwas wie regex schreiben wollen:Mehr Wildcard Muster Regeln der GNU Make

SRC:="a.dat.1 a.dat.2"  
$(SRC): %.dat.%: (\\1).rlt.(\\2)  
     dat2rlt $^ [email protected] 

so dass a.dat.1 und a.dat.2 wird a.rlt geben. 1 und a.rlt.2.

In GNU Make Info-Seite heißt es "das% kann nur einmal verwendet werden".

Gibt es einen Trick, dies in GNU Make zu erreichen?

+0

Nein, das fehlt. Eine Problemumgehung besteht darin, Regeln dynamisch hinzuzufügen (mit eval oder include). Siehe z.B. [diese verwandte Frage] (http://stackoverflow.com/questions/2880975/make-invoke-command-for-multiple-targets-of-multiple-files) oder [diese] (http://stackoverflow.com/ questions/3545700/make-like-tool-das-unterstützt-automatisch-deletion-of-temp-files-and-regulary-express). – reinierpost

Antwort

5

Ich habe Angst, was Sie zu tun versuchen, ist nicht möglich, wie Sie vorschlagen, es zu tun, da - wie bereits erwähnt - (GNU) machen läßt nur einen einzigen Stamm ‚%‘, siehe http://www.gnu.org/software/make/manual/make.html#Pattern-Rules:

Ein Muster Regel sieht aus wie eine gewöhnliche Regel, mit der Ausnahme, dass sein Ziel enthält das Zeichen ‚%‘ (genau einer von ihnen).

Ohne sie ist die Erstellung solcher "multidimensionalen" Ziele mühsam.

Ein Weg, um dies ist durch den Namen der Abhängigkeit in dem Befehl Wiederaufbau (anstatt in der Abhängigkeitsliste):

SRC := a.dat.1 a.dat.2 

all : $(SRC:%=%.dat2rlt) 

%.dat2rlt : 
    dat2rtl $(word 1,$(subst ., ,$*)).rlt.$(word 2,$(subst ., ,$*)) $* 

Natürlich aber diese Art und Weisen Sie die Abhängigkeit verlieren würden, wird es nicht neu erstellt, sobald die RLT aktualisiert wurde.

Der einzige Weg, ich sehe zu tragen, dass durch die Regeln explizit zu erzeugen:

SRC := a.dat.1 a.dat.2 

all : $(SRC) 

define GEN_RULE 
$1.dat.$2 : $1.rlt.$2 
    dat2rtl $$< [email protected] 
endef 

$(foreach src,$(SRC),$(eval $(call GEN_RULE,$(word 1,$(subst ., ,$(src))),$(word 3,$(subst ., ,$(src)))))) 
-1

Für das begrenzte Beispiel, das Sie gaben, können Sie ein Muster mit einem % verwenden.

SRC := a.dat.1 a.dat.2 
${SRC}: a.dat.%: a.rlt.%  
     dat2rlt $^ [email protected] 
  1. $* im Rezept wird, was auch immer erweitern die % abgestimmt.
  2. Beachten Sie, dass die " s um Ihr Original-Makro definitiv falsch sind.
  3. Werfen Sie einen Blick auf .SECONDEXPANSION in der Anleitung für kompliziertere Sachen (oder over here).
+0

Entschuldigung, vielleicht ist das Beispiel nicht umfassend, aber ich möchte auch b.dat.1, b.dat.2 behandeln. – heroxbd

Verwandte Themen