gnu make pattern rule匹配错误的规则

时间:2016-03-24 05:11:15

标签: makefile

在下面的示例中,当构建all时,目标main-gs-universalk9-m.o似乎与规则1而不是规则2匹配。在make version 3.81中,我认为顺序很重要。即使我在规则1之前移动了规则2,它仍然最终匹配规则1

对此进行编码并使其按预期工作的正确方法是什么?

$(info .FEATURES := $(.FEATURES))


%.o:
    @echo "Rule 1 $?"
    rm -f $@
    cp $*.c $@

main-gs-%-m.o: file1.o file2.o file3.o
    @echo "Rule 2"
    cat $? > $@

binos_%_version.o:
    @echo "Rule 3"
    echo "Hello World" > $@

x86-%-m: main-gs-%-m.o binos_%_version.o
    @echo "Rule 4"
    cat $? > $@

all: x86-universalk9-m

clean:
    @echo "Rule Cleaning"
    rm -f *.o
    rm -f x86-universalk9-m

1 个答案:

答案 0 :(得分:2)

如果你看看implicit rule search algorithm是如何工作的,你可以看到它分两个阶段进行。

在第一阶段,make将删除任何既没有实际存在也不应该存在的先决条件的规则"。如果文件在makefile中被明确提及为目标,或者作为非隐式规则的先决条件,则文件应该存在。

您的规则main-gs-%-m.o: file1.o file2.o file3.o有三个先决条件,但由于它们不存在,因此它们未被指定为显式目标,它们仅作为隐式规则的先决条件出现(即此规则和内置隐式规则),该规则被删除,有利于%.o:的{​​{1}}。

有很多种方法可以解决这个问题,但是如果不了解您需要使用所有这些模式规则的原因,很难给出确切的答案,将x86-universalk9-m更改为%.o:但是会工作。