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

Makefile:每次都会重建具有中间先决条件的目标,makefile,Makefile,我正在使用从许多Mardown源文件file1.md file2.md…输出Word文档out.docx。但是,这些标记文件需要经过预处理才能连接并转换为Word。我使用GNUmake来实现以下目的: SRC = $(wildcard *.md) TMP := $(patsubst %.md,%.tmp, $(SRC)) .INTERMEDIATE : $(TMP) out.docx : $(TMP) pandoc -o $@ file1.tmp file2.tmp ...

我正在使用从许多Mardown源文件
file1.md file2.md…
输出Word文档
out.docx
。但是,这些标记文件需要经过预处理才能连接并转换为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=$(通配符*.md)
TMP:=$(patsubst%.md、%.TMP、$(SRC))
.中级:$(TMP)
out.docx:$(TMP)
潘多克-o$@file1.tmp file2.tmp-f降价
%.tmp:%.md
pandoc-o$@$<--filter=。。。
现在,我只想在源文件
$(SRC)
更改时重建
out.docx
。但是,由于中间文件
$(TMP)
在每次生成结束时都会被删除,因此每次都需要重新生成
make
thinkout.docx。当然,在
out.docx
的先决条件中使用
$(SRC)
而不是
$(TMP)
将不起作用,因为根据:

<>代码>使不会考虑非终端匹配任何规则(即'%:') 搜索规则以生成隐式规则的先决条件时


那么,我如何优化此构建,而在不需要时不运行它?

请确保您提供的示例实际显示了问题。你的真实情况一定与你在这里展示的有所不同,因为你在这里展示的makefile会像你期望的那样工作。我没有安装
pandoc
,所以我用
touch
替换了它,它工作正常:

SRC = $(wildcard *.md)
TMP := $(patsubst %.md,%.tmp,$(SRC))

.INTERMEDIATE: $(TMP)

out.docx: $(TMP)
        touch $@

%.tmp: %.md
        touch $@
现在:


您可以运行
make-d
(将输出重定向以供以后研究)以查看make认为
out.docx
已过期的原因。

make中的
$(TMP)
中的文件不是中间文件,不会自动删除。您可以看到它们不是中间的,因为您明确地将它们列为
out.docx
目标的先决条件。这个明确的清单足以防止他们被认为是中间人。如果它们被删除了,那么您的实际生成文件与您在此处展示的文件有一些不同,这是导致您出现问题的原因。使用上面的makefile,
.tmp
文件不被视为中间文件或被删除。对不起,我忘了提到我明确声明了
.intermediate:$(tmp)
问题是,我不需要$(tmp)文件做任何其他事情,所以我宁愿将它们删除,但我只希望在$(SRC)时生成目标文件更改。谢谢。我在我使用的一个order-only先决条件中输入了一个错误,这导致
make
每次都认为一切都过时了。
$ 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