我刚开始真正了解make的内部运作方式。但我不明白为什么以下不起作用:
test%: test%.foo
@echo $@
@echo $<
all: test1 test2
.PHONY: all test1 test2
预期行为:
$ make
test1
test1.foo
test2
test2.foo
# 1,2 Order not important
但是,我得到了:
$ make
make: Nothing to be done for `all'.
(“make all”,“make test1”等没有区别。)
有人可以解释为什么没有执行PHONY测试规则吗?
答案 0 :(得分:7)
摘自GNU make手册。
因为它知道虚假目标没有命名可能的实际文件 从其他文件重新制作,跳过隐式规则搜索 虚假目标(请参阅使用隐式规则一节)。这就是为什么 即使你不是,宣布目标虚假也有利于表现 担心实际存在的文件。
这意味着,由于您的test1
和test2
目标是虚假的,因此make不会为它们搜索隐式规则。即使您使用的内容更准确地命名为模式规则,所有模式规则都是隐式规则。