2009-10-27 2 views
42

Wie kann ich die folgenden Makefile-Ziele komprimieren?Platzhalterziele in einem 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 

-

Mit GNU Make 3.81.

Antwort

45

Das Konzept heißt Musterregeln. Sie können darüber in GNU make manual lesen.

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

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

oder nur

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

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

Erweiterte Sachen: es ist lustig zu bemerken, dass eine Wiederholung dort gibt es ...

PNG_pattern=$(GRAPHDIR)/%.png 

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

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

Wie wäre es mit "% .png:% .dot"? – Beta

+1

@ Beta, na ja, weiß ich nicht. Ich behandle normalerweise Situationen, in denen die Verarbeitung verzeichnisspezifisch ist, also habe ich mich einfach daran gewöhnt. :) –

8

Ich glaube, Sie einige Musterregeln wollen . Probieren Sie es aus.

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

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

graphs: $(TARGETS) 
+2

viel besser überschaubar: 'NAMES: = Complex Simple IFileReader McCabe-linear' und dann' TARGETS: = $ (NAMEN:% = $ (GRAPHDIR) \%. Png' –

17

Nur im Fall, dass Sie tatsächlich eine .PNG für jeden .DOT im aktuellen Verzeichnis erzeugen:

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

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

ich mit diesem Makefile kam nach der Antwort von @Pavel lesen.

+0

Wont Basisname schneiden die GRAPHDIR? – monokrome

+1

No: aus der Dokumentation: "$ (basename names ...) Extrahiert alle außer dem Suffix jedes Dateinamens in Namen. Wenn der Dateiname einen Punkt enthält, ist der Basisname alles, was bis zum letzten Punkt (und nicht einschließlich) beginnt. Zeiträume in Wenn kein Punkt vorhanden ist, ist der Basisname der gesamte Dateiname, zB $ (Basisname src/foo.c src-1.0/bar hacks) erzeugt das Ergebnis 'src/foo src-1.0/bar Hacks. " – Miguel