我有以下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))