【问题标题】:Makefile wildcard (static rule?) with phonyMakefile通配符(静态规则?)与假
【发布时间】:2011-10-25 09:38:58
【问题描述】:

我才刚刚开始真正了解 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 测试规则吗?

【问题讨论】:

    标签: makefile target


    【解决方案1】:

    摘自 GNU make 手册。

    因为它知道虚假目标不会命名可能的实际文件 从其他文件重新制作,make跳过隐式规则搜索 虚假目标(请参阅使用隐式规则部分)。这就是为什么 声明目标虚假对性能有好处,即使您不是 担心实际存在的文件。

    这意味着由于您的 test1 和 test2 目标是虚假的,因此 make 不会为它们搜索隐式规则。即使您使用的更准确地命名为模式规则,所有模式规则都是隐式规则。

    【讨论】:

    • 啊,最后一点“所有模式规则都是隐式规则”对我来说是新的。在这种情况下,强制 make 做我想做的事情是规范的方式吗?
    • 将test1 和test2 设为非假冒,例如通过添加@touch $@。
    • @reinierpost:拥有实际的test1 和test2 文件不会改变任何东西。它们在 Makefile 中被定义为假的,因此无论现有文件如何,它们都是假的。要使它们不假冒,唯一的方法是将它们从.PHONY 规则中删除。
    • @Didier Trosset:感谢您的更正。我的意思是说,一旦它们不是假的,那么实际创建它们是一个好主意。
    • @reinierpost:不!恰恰相反:文件永远不应该存在。 - 一旦目标不是假的,如果它们存在,它们的时间戳将与依赖时间戳进行比较。如果目标是较新的,则不会进行构建。这不是虚假(但未声明为)目标所期望的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    相关资源
    最近更新 更多