在 Make 中优先考虑模式规则

Cal*_*vin 5 sorting makefile

我有(大致)这个 Makefile:

.PHONY: all
.SUFFIXES:

OUT = /www/web

all: $(OUT)/index.html

# rule 1
%.html: %.in
    build_html $< $@

# rule 2
$(OUT)/%: %
    cp $< $@
Run Code Online (Sandbox Code Playgroud)

这个 Makefile 有问题,因为有两种不同的构建方式$(OUT)/index.html

  1. 构建./index.html(规则 1),然后将其复制到$(OUT)(规则 2)。
  2. 复制./index.in$(OUT)(规则 2),然后构建$(OUT)/index.html(规则 1)。

我想make,以喜欢的选项1.如何表明,在这两个模式规则之间的首选顺序?

(对于这种特殊情况,我可以想出一些技巧来完成它,但我想要一个尽可能通用的解决方案——例如,将规则 2 的模式更改为$(OUT)/%.html: %.html将解决问题,但由于如果我以后想以同样的方式处理其他类型的文件,我需要重复一遍。)

bla*_*ost 2

引用GNU Makefile 手册

可能有多个模式规则满足这些标准。在这种情况下,make 将选择词干最短的规则(即最具体匹配的模式)。如果多个模式规则具有最短的主干,make 将选择在 makefile 中找到的第一个。

因此,您可以尝试创建规则来确保较短的词干优先。或者,您可以使用静态模式规则来限制复制内容的范围,如下所示:

%.html: %.in
      build_html $@ $<

$(expected_out) : (OBJS)/% : %
      cp $@ $<
Run Code Online (Sandbox Code Playgroud)

然后$(expected_out)在其中预先填充您想要的内容。最后,您可以添加:

$(OUT)/index.html : index.html
Run Code Online (Sandbox Code Playgroud)

在 makefile 中的某个位置,因为 make 更喜欢使用“最短路径”来构建对象,在这种情况下这只是一种模式规则。