【问题标题】:Makefile seems to take both inputs instead of one at a timeMakefile 似乎一次接受两个输入而不是一个输入
【发布时间】:2022-01-22 21:12:38
【问题描述】:

我有两个文件 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

【问题讨论】:

  • 你需要一个规则来制定一个目标。这:$(OUT): $(SRC) 扩展为:1.svg 2.svg: 1.gv 2.gv。这不是针对一个目标的规则。使用模式规则,如下所示,将允许您创建一个匹配具有该模式的任何目标的规则。

标签: makefile gnu-make


【解决方案1】:

在您的 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

【讨论】:

  • 啊。我以为我和$&lt; 很亲近。我注意到虽然这给了我Makefile:5: *** missing separator. 我看了patsubst 并且该功能的使用看起来不错。嗯。
  • 您需要确保配方行以 TAB 字符而不是空格开头。该错误消息的谷歌将为您提供 1,000 次点击。
  • 啊,当然....自从我使用 GNU Make 以来已经有一段时间了,我忘记了这一点。
猜你喜欢
  • 1970-01-01
  • 2013-12-13
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
相关资源
最近更新 更多