Makefile中的通配符目标

Rob*_*anu 49 makefile gnu-make

如何压缩以下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
Run Code Online (Sandbox Code Playgroud)

-

GNU Make 3.81.

P S*_*ved 53

这个概念称为模式规则.您可以在GNU make手册中阅读它.

$(GRAPHDIR)/%.png: $(GRAPHDIR)/%.dot
        dot $< -Tpng -o $@

graphs: $(patsubst %,$(GRAPHDIR)/%.png, Complex Simple IFileReader McCabe)\
Run Code Online (Sandbox Code Playgroud)

要不就

%.png: %.dot
        dot $< -Tpng -o $@

graphs: $(patsubst %,$(GRAPHDIR)/%.png, Complex Simple IFileReader McCabe)
Run Code Online (Sandbox Code Playgroud)

先进的东西:很有趣的是注意到那里有重复......

PNG_pattern=$(GRAPHDIR)/%.png

$(PNG_pattern): $(GRAPHDIR)/%.dot
        dot $< -Tpng -o $@

graphs: $(patsubst %,$(PNG_pattern), Complex Simple IFileReader McCabe)
Run Code Online (Sandbox Code Playgroud)

  • "%.png:%.dot"怎么样? (2认同)

Met*_*hox 21

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

%.png : %.dot
    dot -Tpng -o $@ $<

all: $(addsuffix .png, $(basename $(wildcard *.dot)))
Run Code Online (Sandbox Code Playgroud)

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

  • 否:来自文档:“$(basename names...) 提取除名称中每个文件名的后缀之外的所有内容。如果文件名包含句点,则基名是从(不包括)最后一个句点开始的所有内容。句点在目录部分被忽略。如果没有句点,basename 是整个文件名。例如 $(basename src/foo.c src-1.0/bar hacks) 产生的结果 'src/foo src-1.0/酒吧黑客'。” (2认同)

Car*_*rum 8

我想你想要一些模式规则.试试吧.

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

%.png : %.dot
        dot $^ -Tpng -o $@

graphs: $(TARGETS)
Run Code Online (Sandbox Code Playgroud)

  • 更容易管理:`NAMES:=复杂的简单IFileReader McCabe-linear`然后`TARGETS:= $(NAMES:%= $(GRAPHDIR)\%.png` (3认同)