我正在尝试编写一个Makefile,它自动在与特定通配符匹配的文件上调用BibTeX,但在我第一次运行Make时不存在。具体来说,我有以下内容:
.FORCE:
all: pdf
foo=something
lat: *.tex
pdflatex $(foo).tex
pdf: lat
open $(foo).pdf &
%.aux: .FORCE
bibtex $@
bib: lat $(foo)?.aux
pdflatex $(foo).tex
pdflatex $(foo).tex
open $(foo).pdf &
我想要发生的是,当我运行make bib
时会发生以下情况:
然而,这不会发生:特别是,看起来好像Make评估先决条件$(foo)?. aux up-front,在文件$(foo)1.aux,$(foo)的位置)2.aux等不存在。结果,BibTeX永远不会被它们调用。但是,如果我重新运行make bib
,事情就会起作用,因为文件在上一次运行中创建后现在存在。
问题:是否强制Make重新评估目标的先决条件正确的解决方法?如果是这样,在运行pdflatex作为lat的一部分后,如何让它重新评估bib的先决条件?如果没有,我怎么能实现我想要的呢?
答案 0 :(得分:0)
我只想分享另一种解决方案:使用子制作流程:
如果是这样,在运行pdflatex作为lat的一部分后,如何让它重新评估bib的先决条件?
通过将make lat
添加到bib
的配方,您可以在某种程度上实现这一目标。这将启动一个新的制作流程,目标是bib
。 sub-make对父母目标/先决条件一无所知。 (当一些大型项目是由不同的较小项目构建时,通常会使用这样的概念,每个项目都有不同的makefile。)
这可以在多个层次中完成(虽然会令人困惑):
bib: $(foo)?.aux lat check_for_bib
check_for_bib:
if grep -q Rerun $(@:.bbl=.log) >/dev/null; then make bib; fi
pdf: lat check_for_bib
open $(foo).pdf &
请注意,我必须更改一些先决条件的订单。伪代码类似于:
latex compilation
while log suggests update:
update aux
latex compilation
while循环的每次迭代都将在一个单独的make过程中进行。