强制使用更具体的规则

时间:2015-03-03 22:05:06

标签: makefile

我无法强迫make使用更具体的规则。我使用的是版本3.81,即supposed to use the first rule it comes to,但是当更具体的规则具有必须使用其他规则构建的依赖项时,这似乎不起作用 。这是基本图片:

#rule for the dependency of the more specific rule
%.bbl: %.tex *.bib
    <build the .bbl file>

#more specific rule
some_prefix%.pdf: some_prefix%.tex some_prefix%.bbl
    <build the .pdf>

#general rule
%.pdf: %.tex
    <build the .pdf>

所以基本上我希望make使用.bbl文件构建pdf(如果它与some_prefix匹配,否则使用更一般的规则。不幸的是,除非我删除对.bbl文件的依赖,否则永远不会调用第二条规则。

我似乎能够通过在一般规则中添加黑客来实现它:

%.pdf: %.tex %.hack
    <make the pdf with a more general rule>

%.hack: %.tex
    touch $@

这似乎有效,.hack文件会自动删除,但顾名思义,这是一个可怕的黑客攻击。似乎必须有一些更好的方法来强制使用特定的规则。

如何强制make使用更具体的规则?把它放在第一位似乎没什么帮助。

1 个答案:

答案 0 :(得分:4)

您忘记了implicit rule search algorithm的一个非常重要的方面:make 总是更喜欢具有先决条件的隐式规则,这些规则是明确的目标,而不是隐含的规则,其中一个先决条件模式与已知目标不匹配,必须通过规则链构建。请参阅算法中的步骤#5,与步骤#6相比。这与模式规则的正常“makefile中的第一个”顺序不同。

如果要执行此操作,则必须将bbl规则编写为静态模式规则,而不是实际模式规则,以便bbl文件是显式目标而非隐式目标。