Makefile 似乎一次接受两个输入而不是一个输入

Makefile seems to take both inputs instead of one at a time

我有两个文件 1.gv2.gv,它们是 Graphviz 文件。

我根据自己的理解写了这个 Makefile:

DOT=dot
FORMAT=svg
SRC=$(wildcard *.gv)
OUT=$(subst .gv,.$(FORMAT),$(SRC))

all: $(OUT)

$(OUT): $(SRC)
    $(DOT) -T$(FORMAT) $^ -o $@

.PHONY: clean
clean:
    rm -f $(OUT)

清洁似乎有效,唯一的问题似乎是它运行:

dot -Tsvg 1.gv 2.gv -o 1.svg
dot -Tsvg 1.gv 2.gv -o 2.svg

而不是:

dot -Tsvg 1.gv -o 1.svg
dot -Tsvg 2.gv -o 2.svg

在您的 Makefile 中,make 发现它需要所有 gv 文件 (SRC) 来制作一个文件:1.gv (OUT) 因此在循环中先决条件更改 $< 但不是目标 $@.
您需要匹配一个模式并使用 patsubst 而不是 subst 所以 OUT 是一个文件模式。

为了清楚起见,我删除了大部分变量。请随时将它们添加回去。

SRC = $(wildcard *.gv)
OUT = $(patsubst %.gv,%.svg,$(SRC))

%.svg: %.gv
    dot -Tsvg $< -o $@

all: $(OUT)

.PHONY: clean
clean:
    $(RM) *.svg