如何解决用于Latex的Makefile:仅生成已更改的文件
我具有以下Makefile以便将一些单独的TeX文件构建为PDF:
# Makefile:
TEXS = $(wildcard *.tex)
PDFS = $(patsubst %.tex,%.pdf,$(TEXS))
all: $(PDFS)
%.pdf: %.tex
TEXINPUTS=.:../common//: pdflatex -output-directory=../build $< > /dev/null
rm ../build/*.aux ../build/*.log
clean:
rm ../build/*.pdf
但是,makefile始终构建所有内容。我应该如何编写它,使其仅构建已更改的TeX文件?
解决方法
GNU make将目标的修改时间与先决条件的修改时间进行比较。
这要求知道目标文件的路径是什么。有了这个,您可以找到所有的.tex文件:
TEXS = $(wildcard *.tex)
假设只有一个foo.tex
。然后将其转换为PDF:
PDFS = $(patsubst %.tex,%.pdf,$(TEXS))
现在PDFS
包含foo.pdf
。现在,您定义了一个隐式规则,该规则说:“如果您想构建%.pdf
并且拥有%.tex
,这是一种实现方法”:
%.pdf: %.tex
TEXINPUTS=.:../common//: pdflatex -output-directory=../build $< > /dev/null
rm ../build/*.aux ../build/*.log
太好了。
有一个主要问题:该食谱不会 构建foo.pdf
,而是构建../build/foo.pdf
。因此,下次make运行时,将文件foo.pdf
与文件foo.tex
进行比较,发现foo.pdf
不存在,因此需要构建它并运行您的配方。生成../build/foo.pdf
的。所以下一次make运行,...等等。
如果您的规则要求设置为“我将更新文件X”,则最好更新该文件,而不要更新一些完全不同的文件。您想要这样写规则:
../build/%.pdf: %.tex
TEXINPUTS=.:../common//: pdflatex -output-directory=$(@D) $< > /dev/null
rm ../build/*.aux ../build/*.log
但是,由于以下规则,您会收到一条错误消息:
all: $(PDFS)
要求构建foo.pdf
,但是您没有构建foo.pdf
的规则,您有构建../build/foo.pdf
的规则,这不是一回事。因此,您必须更改PDFS
的分配以包含目录:
PDFS = $(patsubst %.tex,../build/%.pdf,$(TEXS))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。