Подстановочные цели в 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
.
Ответы
Ответ 1
Концепция называется шаблоном. Вы можете прочитать об этом в GNU make manual.
$(GRAPHDIR)/%.png: $(GRAPHDIR)/%.dot
dot $< -Tpng -o [email protected]
graphs: $(patsubst %,$(GRAPHDIR)/%.png, Complex Simple IFileReader McCabe)\
или просто
%.png: %.dot
dot $< -Tpng -o [email protected]
graphs: $(patsubst %,$(GRAPHDIR)/%.png, Complex Simple IFileReader McCabe)
Продвинутый материал: забавно заметить, что там есть повторение...
PNG_pattern=$(GRAPHDIR)/%.png
$(PNG_pattern): $(GRAPHDIR)/%.dot
dot $< -Tpng -o [email protected]
graphs: $(patsubst %,$(PNG_pattern), Complex Simple IFileReader McCabe)
Ответ 2
На всякий случай вы действительно хотите создать .PNG для каждого .DOT в текущем каталоге:
%.png : %.dot
dot -Tpng -o [email protected] $<
all: $(addsuffix .png, $(basename $(wildcard *.dot)))
Я придумал этот Makefile после прочтения ответа от @Pavel.
Ответ 3
Я думаю, вам нужны некоторые правила шаблонов. Попробуйте это.
TARGETS = $(GRAPHDIR)/Complex.png \
$(GRAPHDIR)/Simple.png \
$(GRAPHDIR)/IFileReader.png \
$(GRAPHDIR)/McCabe-linear.png
%.png : %.dot
dot $^ -Tpng -o [email protected]
graphs: $(TARGETS)