我正在使用Pandoc从许多Mardown源文件out.docx
中输出Word文档file1.md file2.md ...
。但是,这些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=...
现在,我只希望在源文件out.docx
更改时重建$(SRC)
。但是,由于中间文件$(TMP)
在每次构建结束时都会被删除,因此make
认为out.docx需要每一次重新构建。当然,在$(SRC)
的前提条件中使用$(TMP)
代替out.docx
将不起作用,因为根据the docs:
make
将不考虑任何非末尾匹配规则(即“%:”)搜索规则以构建隐式规则的先决条件时。
所以,如何优化此构建,并在不需要时不运行它?
请确保您提供的示例确实显示了问题。您的实际情况必须与此处显示的有所不同,因为您在此处显示的makefile将按预期工作。我没有安装pandoc
,所以我替换了touch
,它可以正常工作:
SRC = $(wildcard *.md)
TMP := $(patsubst %.md,%.tmp,$(SRC))
.INTERMEDIATE: $(TMP)
out.docx: $(TMP)
touch $@
%.tmp: %.md
touch $@
现在:
$ touch foo.md bar.md biz.md
$ make
touch bar.tmp
touch biz.tmp
touch foo.tmp
touch out.docx
rm foo.tmp bar.tmp biz.tmp
$ make
make: 'out.docx' is up to date.
$ touch biz.md
$ make
touch bar.tmp
touch biz.tmp
touch foo.tmp
touch out.docx
rm foo.tmp bar.tmp biz.tmp
您可以运行make -d
(重定向输出以供以后调查),以了解为什么make认为out.docx
已过时。