makefile – gnu make pattern rule匹配错误的规则

在下面的示例中,当构建all时,目标main-gs-universalk9-m.o似乎与规则1而不是规则2匹配.在make 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

最佳答案 如果您了解
implicit rule search algorithm的工作原理,您可以看到它分两个阶段执行.

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

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

有许多方法可以解决这个问题,虽然不知道为什么你需要使用所有这些模式规则,但很难给出一个确切的答案,将%.o:更改为file1.o file2.o file3.o:但是会有效.

点赞