2010-09-19 18 views
11

Quiero escribir algo así como expresiones regulares:reglas de patrón multi-comodín de GNU make

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

modo que a.dat.1 y a.dat.2 dará a.rlt. 1 y a.rlt.2.

En la página GNU Make information, dice "el% se puede usar solo una vez".

¿Hay algún truco para lograr esto en GNU Make?

+0

No, esto no se encuentra. Una solución alternativa es agregar reglas dinámicamente (con eval o include). Ver p. [esta pregunta relacionada] (http://stackoverflow.com/questions/2880975/make-invoke-command-for-multiple-targets-of-multiple-files) or [this one] (http://stackoverflow.com/ preguntas/3545700/make-like-tool-that-supports-automatic-deletion-of-temp-files-and-regular-express). – reinierpost

Respuesta

5

Me temo que lo que está tratando de hacer no es posible sugerir la forma en que lo haga, ya que - como ya se mencionó - (GNU) que sólo permite un único tallo '%', ver http://www.gnu.org/software/make/manual/make.html#Pattern-Rules:

Una regla de patrón parece una regla ordinaria, excepto que su objetivo contiene el carácter '%' (exactamente uno de ellos).

Sin esto, la creación de objetivos "multidimensionales" es engorrosa.

Una forma de evitar esto es mediante la reconstrucción del nombre de la dependencia en el comando (en lugar de en la lista de dependencias):

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

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

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

Por supuesto, sin embargo, de esta manera se perdería la dependencia, lo hará no reconstruir una vez que se ha actualizado el rlt.

La única manera que puedo ver para hacer frente a esto es mediante la generación de las reglas de forma explícita:

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

Para el ejemplo que diste limitada, que puede utilizar un patrón con una %.

SRC := a.dat.1 a.dat.2 
${SRC}: a.dat.%: a.rlt.%  
     dat2rlt $^ [email protected] 
  1. $* en la receta se ampliará a lo que el % emparejados.
  2. Tenga en cuenta que " s alrededor de su macro original son definitivamente incorrectos.
  3. Eche un vistazo a .SECONDEXPANSION en el manual para cosas más complicadas (o over here).
+0

lo siento, tal vez el ejemplo no sea exhaustivo, pero también quiero cubrir b.dat.1, b.dat.2. – heroxbd

Cuestiones relacionadas