如何强制make重新评估先决条件?

时间:2015-09-20 15:36:49

标签: makefile

我正在尝试编写一个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时会发生以下情况:

  • pdflatex将在$(foo).tex上调用,生成文件$(foo)1.aux,$(foo)2.aux等。
  • bibtex将在$(foo)1.aux,然后$(foo)2.aux等上调用
  • pdflatex将在$(foo).tex
  • 上调用两次
  • open将在$(foo).pdf
  • 上调用

然而,这不会发生:特别是,看起来好像Make评估先决条件$(foo)?. aux up-front,在文件$(foo)1.aux,$(foo)的位置)2.aux等不存在。结果,BibTeX永远不会被它们调用。但是,如果我重新运行make bib,事情就会起作用,因为文件在上一次运行中创建后现在存在。

问题:是否强制Make重新评估目标的先决条件正确的解决方法?如果是这样,在运行pdflatex作为lat的一部分后,如何让它重新评估bib的先决条件?如果没有,我怎么能实现我想要的呢?

1 个答案:

答案 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过程中进行。