2009-10-27 22 views
42

¿Cómo puedo compactar los siguientes objetivos Makefile?Objetivos comodín en un archivo Makefile

$(GRAPHDIR)/Complex.png: $(GRAPHDIR)/Complex.dot 
     dot $(GRAPHDIR)/Complex.dot -Tpng -o $(GRAPHDIR)/Complex.png 

$(GRAPHDIR)/Simple.png: $(GRAPHDIR)/Simple.dot 
     dot $(GRAPHDIR)/Simple.dot -Tpng -o $(GRAPHDIR)/Simple.png 

$(GRAPHDIR)/IFileReader.png: $(GRAPHDIR)/IFileReader.dot 
     dot $(GRAPHDIR)/IFileReader.dot -Tpng -o $(GRAPHDIR)/IFileReader.png 

$(GRAPHDIR)/McCabe-linear.png: $(GRAPHDIR)/McCabe-linear.dot 
     dot $(GRAPHDIR)/McCabe-linear.dot -Tpng -o $(GRAPHDIR)/McCabe-linear.png 

graphs: $(GRAPHDIR)/Complex.png $(GRAPHDIR)/Simple.png $(GRAPHDIR)/IFileReader.png $(GRAPHDIR)/McCabe-linear.png 

-

Usando GNU Make 3.81.

Respuesta

45

El concepto se llama reglas de patrón. Puede leer sobre esto en GNU make manual.

$(GRAPHDIR)/%.png: $(GRAPHDIR)/%.dot 
     dot $< -Tpng -o [email protected] 

graphs: $(patsubst %,$(GRAPHDIR)/%.png, Complex Simple IFileReader McCabe)\ 

o simplemente

%.png: %.dot 
     dot $< -Tpng -o [email protected] 

graphs: $(patsubst %,$(GRAPHDIR)/%.png, Complex Simple IFileReader McCabe) 

cosas avanzadas: es curioso notar que hay una repetición allá arriba ...

PNG_pattern=$(GRAPHDIR)/%.png 

$(PNG_pattern): $(GRAPHDIR)/%.dot 
     dot $< -Tpng -o [email protected] 

graphs: $(patsubst %,$(PNG_pattern), Complex Simple IFileReader McCabe) 
+2

¿Qué hay de "% .png:% .dot"? – Beta

+1

@ Beta, bueno, no sé. Por lo general, me ocupo de situaciones en las que el procesamiento es específico del directorio, así que me acostumbré. :) –

8

Creo que quieres algunas reglas de patrón . Probar esto.

TARGETS = $(GRAPHDIR)/Complex.png \ 
      $(GRAPHDIR)/Simple.png \ 
      $(GRAPHDIR)/IFileReader.png \ 
      $(GRAPHDIR)/McCabe-linear.png 

%.png : %.dot 
     dot $^ -Tpng -o [email protected] 

graphs: $(TARGETS) 
+2

mucho más manejable: 'NAMES: = Compleja Simple IFileReader McCabe-linear' y luego' TARGETS: = $ (NAMES:% = $ (GRAPHDIR) \%. Png' –

17

Sólo en caso de que realmente desea generar un PNG para cada .DOT dentro del directorio actual:

%.png : %.dot 
    dot -Tpng -o [email protected] $< 

all: $(addsuffix .png, $(basename $(wildcard *.dot))) 

me ocurrió con este Makefile después de leer la respuesta de @Pavel.

+0

¿No se corta el GRAPHDIR? – monokrome

+1

No: from the docs: "$ (nombres de nombre de base ...) Extrae todos menos el sufijo de cada nombre de archivo en los nombres. Si el nombre de archivo contiene un punto, el nombre base es todo lo que comienza (y no incluye) el último período. se omite la parte del directorio. Si no hay un punto, el nombre base es el nombre completo del archivo. Por ejemplo, $ (basename src/foo.c src-1.0/bar hacks) produce el resultado 'src/foo src-1.0/bar hacks '. " – Miguel

Cuestiones relacionadas