我无法强迫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使用更具体的规则?把它放在第一位似乎没什么帮助。
答案 0 :(得分:4)
您忘记了implicit rule search algorithm的一个非常重要的方面:make
总是更喜欢具有先决条件的隐式规则,这些规则是明确的目标,而不是隐含的规则,其中一个先决条件模式与已知目标不匹配,必须通过规则链构建。请参阅算法中的步骤#5,与步骤#6相比。这与模式规则的正常“makefile中的第一个”顺序不同。
如果要执行此操作,则必须将bbl
规则编写为静态模式规则,而不是实际模式规则,以便bbl
文件是显式目标而非隐式目标。