在下面的示例中,当构建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:但是会有效.