为Latex创建文件:只生成已更改的文件



我有以下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将目标的修改时间与先决条件的修改时间进行比较。

这需要知道目标文件的路径是什么

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不存在,因此需要构建它,并运行您的配方。。。构建CCD_ 11。所以下次跑步时。。。等

如果你的规则是";我将更新文件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))

最新更新