【发布时间】:2020-07-04 11:49:15
【问题描述】:
我正在使用 Pandoc 从多个 Mardown 源文件 file1.md file2.md ... 中输出一个 Word 文档 out.docx。但是,这些 Markdown 文件需要经过预处理才能连接并转换为 Word。我为此使用 GNU make:
SRC = $(wildcard *.md)
TMP := $(patsubst %.md,%.tmp, $(SRC))
.INTERMEDIATE : $(TMP)
out.docx : $(TMP)
pandoc -o $@ file1.tmp file2.tmp ... -f markdown
%.tmp : %.md
pandoc -o $@ $< --filter=...
现在,我只希望在源文件 $(SRC) 更改时重建 out.docx。但是,由于中间文件$(TMP) 在每次构建结束时都会被删除,make 认为 out.docx 每次都需要重新构建。在out.docx的先决条件中使用$(SRC)而不是$(TMP)当然是行不通的,因为根据the docs:
make不会考虑非终端匹配任何规则(即'%:') 在搜索规则以构建隐式规则的先决条件时。
那么我怎样才能优化这个构建并且在不需要的时候不让它运行呢?
【问题讨论】:
-
$(TMP)中的文件不是中间文件,make不会自动删除。您可以看到它们不是中间的,因为您将它们明确列为out.docx目标的先决条件。该明确的列表足以防止它们被认为是中间的。如果它们被删除,那么您的实际 makefile 与您在此处向我们展示的内容有所不同,而这正是导致您的问题的原因。使用上面的 makefile,.tmp文件不会被视为中间文件或已删除。 -
对不起,我忘了说我明确声明了
.INTERMEDIATE : $(TMP) -
问题是,我不需要 $(TMP) 文件来做其他任何事情,所以我宁愿删除它们,但是我希望目标是仅在 $(SRC) 文件更改时构建。
标签: makefile