GNU make模式规则匹配错误的规则

4
在下面的示例中,当构建所有内容时,目标main-gs-universalk9-m.o似乎匹配规则1而不是规则2。在make版本3.81中,我认为顺序很重要。即使我将规则2移动到规则1之前定义,它仍然会匹配规则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

可能是因为规则2的RHS没有任何“%”(它是唯一一个这样的规则)。 - o11c
如果规则是 %.o: %c,这似乎按预期工作。 - Sarvi Shanmugham
1个回答

2
如果您查看隐式规则搜索算法的工作方式,您会发现它分为两个阶段。
在第一阶段中,make将放弃具有既不存在物理上,也不应该存在的先决条件的规则。如果文件在makefile中明确提到作为目标或非隐式规则的先决条件,则应该存在文件。
您的规则main-gs-%-m.o: file1.o file2.o file3.o有三个先决条件,但由于它们不存在,它们没有被指定为显式目标,并且它们只出现在隐式规则(即此规则和内置的隐式规则)的先决条件中,因此该规则被放弃,而选择x86-universalk9-m%.o:
有很多方法可以解决这个问题,但是如果不知道为什么需要使用所有这些模式规则,很难给出确切的答案,但将%.o:更改为file1.o file2.o file3.o:将起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接