通配符目标在一个Makefile中

我怎样才能压缩下面的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 

使用GNU Make 3.81

这个概念被称为模式规则 。 你可以在GNU make手册中阅读 。

 $(GRAPHDIR)/%.png: $(GRAPHDIR)/%.dot dot $< -Tpng -o $@ graphs: $(patsubst %,$(GRAPHDIR)/%.png, Complex Simple IFileReader McCabe)\ 

要不就

 %.png: %.dot dot $< -Tpng -o $@ graphs: $(patsubst %,$(GRAPHDIR)/%.png, Complex Simple IFileReader McCabe) 

先进的东西:有趣的是,有一个重复在那里…

 PNG_pattern=$(GRAPHDIR)/%.png $(PNG_pattern): $(GRAPHDIR)/%.dot dot $< -Tpng -o $@ graphs: $(patsubst %,$(PNG_pattern), Complex Simple IFileReader McCabe) 

以防万一你真的想在当前目录下为每个.DOT生成一个.PNG:

 %.png : %.dot dot -Tpng -o $@ $< all: $(addsuffix .png, $(basename $(wildcard *.dot))) 

在阅读@Pavel的答案之后,我想出了这个Makefile。

我想你想要一些模式规则。 试试这个。

 TARGETS = $(GRAPHDIR)/Complex.png \ $(GRAPHDIR)/Simple.png \ $(GRAPHDIR)/IFileReader.png \ $(GRAPHDIR)/McCabe-linear.png %.png : %.dot dot $^ -Tpng -o $@ graphs: $(TARGETS)