我有这个makefile:
.PHONY: all
all: foo.o
makefile: ;
%.inc:
echo INC
touch $@
%.o: bar.inc
echo O
touch $@
%.o:
FAIL
我希望它使用第一个%.o
规则,创建bar.inc作为先决条件,然后创建foo.o.相反,它使用最后一条规则,我得到了这个:
FAIL
make: FAIL: Command not found
make: *** [foo.o] Error 127
如果我将%.inc
更改为bar.inc
或将%.o
更改为foo.o
,则可以正常工作。
documentation说
为了应用模式规则,其目标模式必须与所考虑的文件名匹配,并且其所有先决条件(在模式替换之后)必须命名存在或可以的文件。< / p>
模式规则%.inc
是否不算“可以制作”?我正在使用GNU Make 3.81。
答案 0 :(得分:1)
您缺少的相关详细信息位于10.5.4 How Patterns Match部分。
具体(强调我的):
仅当存在与文件名匹配的目标模式并且该规则中的所有先决条件都存在或可以构建时,模式规则才可用于构建给定文件。您编写的规则优先于内置的规则。但请注意,实际存在或提及其先决条件的规则始终优先于具有必须通过链接其他隐式规则的先决条件的规则。
所以问题不在于你的先决条件是不可能的,而是因为你的另一条规则“赢了”所以make甚至没有尝试。
MadScientist在他的回答here中提供了一些额外的信息和细节。