Makefile 似乎一次接受两个输入而不是一个输入
Makefile seems to take both inputs instead of one at a time
我有两个文件 1.gv
和 2.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
我有两个文件 1.gv
和 2.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