2009-10-27 25 views
42

Come posso compattare i seguenti target Makefile?Destinazioni con caratteri jolly in un 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 

-

Utilizzando GNU Make 3.81.

risposta

45

Il concetto si chiama regole modello. Puoi leggere a riguardo in GNU make manual.

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

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

o semplicemente

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

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

roba avanzata: è divertente notare che c'è una ripetizione lassù ...

PNG_pattern=$(GRAPHDIR)/%.png 

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

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

Come su "% .png:% .dot"? – Beta

+1

@ Beta, bene, non so. Di solito mi occupo di situazioni in cui l'elaborazione è specifica per directory, quindi mi ci sono abituato. :) –

8

Penso che si desidera alcune regole del modello . Prova questo.

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

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

graphs: $(TARGETS) 
+2

molto più gestibile: 'NOME: = Complesso semplice IFileReader McCabe-lineare' e poi 'OBIETTIVI: = $ (NOMI:% = $ (GRAPHDIR) \%. Png' –

17

Nel caso in cui si vuole realmente generare un .PNG per ogni .DOT all'interno di directory corrente:

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

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

sono arrivato fino a questo Makefile dopo aver letto la risposta da @Pavel.

+0

Non basename fermato il GRAPHDIR? – monokrome

+1

No: dai documenti: "$ (nomi di nomi di basi ...) Estrae tutti i nomi tranne il suffisso di ciascun nome di file. Se il nome del file contiene un punto, il nome di base è tutto che inizia (fino a non includere) nell'ultimo periodo. la parte della directory viene ignorata Se non vi sono punti, il basename è l'intero nome del file.Ad esempio, $ (basename src/foo.c src-1.0/bar hack) produce il risultato 'src/foo src-1.0/bar hack "." – Miguel