2009-10-27 13 views
42

W jaki sposób mogę skompresować kolejne pliki Makefile?Cele wieloznaczne w pliku 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 

-

Korzystanie GNU Make 3.81.

Odpowiedz

45

Ta koncepcja nazywa się regułami wzoru. Możesz przeczytać o tym w GNU make manual.

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

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

lub po prostu

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

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

zaawansowane rzeczy: to jest zabawne zauważyć, że istnieje tam powtórka ...

PNG_pattern=$(GRAPHDIR)/%.png 

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

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

Co powiecie "% .png:% .dot"? – Beta

+1

@ Beta, cóż, dunno. Zazwyczaj zajmuję się sytuacjami, w których przetwarzanie jest specyficzne dla katalogu, więc po prostu się do tego przyzwyczaiłem. :) –

8

Myślę, że chcesz kilka reguł wzorców . Wypróbuj to.

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

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

graphs: $(TARGETS) 
+2

o wiele łatwiejsze do zarządzania: 'NAZWISKO: = Złożony prosty IFileReader McCabe-linear', a następnie' CELE: = $ (NAZWA:% = $ (GRAPHDIR) \%. Png' –

17

wszelki wypadek rzeczywiście chcesz wygenerować .png dla każdego .dot ciągu bieżącego katalogu:

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

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

wymyśliłem tego Makefile po przeczytaniu odpowiedzi od @Pavel.

+0

Wont basename wytnie GRAPHDIR? – monokrome

+1

Nie: z dokumentów: "$ (nazwy do katalogów ...) Wyodrębnia wszystkie z wyjątkiem sufiksów nazw plików w nazwach .Jeżeli nazwa pliku zawiera kropkę, to nazwa bazowa jest wszystkim, począwszy od ostatniego okresu (i nie wliczając go). część katalogu jest ignorowana.Jeśli nie ma okresu, nazwa_karty to cała nazwa pliku.Na przykład: $ (nazwa systemu src/foo.c src-1.0/bar hacks) generuje wynik 'src/foo src-1.0/bar hacks "." – Miguel

Powiązane problemy