Makefile:具有中等先决条件的目标每次都会被重建

问题描述 投票:0回答:1

我正在使用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
1个回答
1
投票

请确保您提供的示例确实显示了问题。您的实际情况必须与此处显示的有所不同,因为您在此处显示的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已过时。

© www.soinside.com 2019 - 2024. All rights reserved.