我有(大致)这个 Makefile:
.PHONY: all
.SUFFIXES:
OUT = /www/web
all: $(OUT)/index.html
# rule 1
%.html: %.in
    build_html $< $@
# rule 2
$(OUT)/%: %
    cp $< $@
这个 Makefile 有问题,因为有两种不同的构建方式$(OUT)/index.html:
./index.html(规则 1),然后将其复制到$(OUT)(规则 2)。./index.in到$(OUT)(规则 2),然后构建$(OUT)/index.html(规则 1)。我想make,以总喜欢的选项1.如何表明,在这两个模式规则之间的首选顺序?
(对于这种特殊情况,我可以想出一些技巧来完成它,但我想要一个尽可能通用的解决方案——例如,将规则 2 的模式更改为$(OUT)/%.html: %.html将解决问题,但由于如果我以后想以同样的方式处理其他类型的文件,我需要重复一遍。)
引用GNU Makefile 手册:
可能有多个模式规则满足这些标准。在这种情况下,make 将选择词干最短的规则(即最具体匹配的模式)。如果多个模式规则具有最短的主干,make 将选择在 makefile 中找到的第一个。
因此,您可以尝试创建规则来确保较短的词干优先。或者,您可以使用静态模式规则来限制复制内容的范围,如下所示:
%.html: %.in
      build_html $@ $<
$(expected_out) : (OBJS)/% : %
      cp $@ $<
然后$(expected_out)在其中预先填充您想要的内容。最后,您可以添加:
$(OUT)/index.html : index.html
在 makefile 中的某个位置,因为 make 更喜欢使用“最短路径”来构建对象,在这种情况下这只是一种模式规则。