【问题标题】:Force make to use a more specific rule强制 make 使用更具体的规则
【发布时间】:2015-03-03 22:05:05
【问题描述】:

我似乎无法强制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 文件的依赖,否则永远不会调用第二条规则。

我似乎可以通过在一般规则中添加一个 hack 来使其工作:

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

%.hack: %.tex
    touch $@

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

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

【问题讨论】:

  • %.bbl 规则本身是否正常工作?也就是说,当some_prefix_something.tex 和随机*.bib 文件存在时,您可以运行make some_prefix_something.bbl 并使其正常工作? make -d 对 make 没有按照您期望的方式使用您的规则时的行为有何看法?
  • @EtanReisner,这很有趣:如果我先制作 .bbl 文件,然后再制作 .pdf 它就可以了。 .bbl 文件通常会在 make 运行后被删除(这是我想要的),所以如果不先明确地创建 .bbl,它就无法工作。
  • 这正是我对下面答案的期望:当bbl 文件存在时,算法的第 5 步适用,因为先决条件文件已经存在。只有当文件还不存在时,make 才需要尝试使用规则链来创建它们。

标签: makefile


【解决方案1】:

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

如果您想这样做,您必须将 bbl 规则编写为静态模式规则,而不是真正的模式规则,以便 bbl 文件是显式目标而不是隐式目标。

【讨论】:

  • 如何将bbl 规则编写为静态模式规则?
  • 您需要bbl 文件的列表:BBL_FILES = foo.bbl bar.bbl biz.bbl 然后将模式规则介绍更改为$(BBL_FILES) : %.bbl : %.tex *.bib(以及规则的其余部分)。现在它是一个静态模式规则。
  • 我应该指出静态模式规则并不是解决这个问题的唯一方法。您只需要以某种方式使这些bbl 文件“已知”即可制作。将它们(明确地)列为目标或先决条件 anywhere 在 makefile 中就足够了。例如,给定上述变量分配,您只需编写一个新规则 make_bbls : $(BBL_FILES) 就足够了。你不需要任何依赖make_bbls;只要有这个规则就足够了。
  • 不过,这些解决方案似乎确实阻止了 make 删除 .bbl 文件。我可以忍受,但这不是最佳选择。
  • 正确。您不能同时拥有这两者:目标是中间文件并被删除,但它们只能通过链接规则创建,因此依赖于它们的模式规则将始终是最后考虑的,OR ELSE 它们被明确提及并且不是中间文件并且没有被删除,并且您的规则排序有效。实际上,您可以尝试保留make_bbls 或静态模式规则,AND 明确声明它们与.INTERMEDIATE: $(BBL_FILES) 处于中间状态。我不确定这是否会让您回到起点,或解决您的问题。
猜你喜欢
  • 2021-08-31
  • 2012-01-28
  • 2019-04-11
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 2022-06-12
  • 2017-10-13
相关资源
最近更新 更多