在下面的示例中,当构建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
答案 0 :(得分:2)
如果你看看implicit rule search algorithm是如何工作的,你可以看到它分两个阶段进行。
在第一阶段,make将删除任何既没有实际存在也不应该存在的先决条件的规则"。如果文件在makefile中被明确提及为目标,或者作为非隐式规则的先决条件,则文件应该存在。
您的规则main-gs-%-m.o: file1.o file2.o file3.o
有三个先决条件,但由于它们不存在,因此它们未被指定为显式目标,它们仅作为隐式规则的先决条件出现(即此规则和内置隐式规则),该规则被删除,有利于%.o:
的{{1}}。
有很多种方法可以解决这个问题,但是如果不了解您需要使用所有这些模式规则的原因,很难给出确切的答案,将x86-universalk9-m
更改为%.o:
但是会工作。