文件目标是PHONY目标的先决条件吗?

时间:2019-05-20 10:17:35

标签: makefile gnu-make

Makefile style guide提到“任何文件目标都不应该是.PHONY的先决条件。”

我认为您可以改写为“不要声明文件目标为PHONY”吗?

为了表达依赖性,对于人类读者和Make来说,我想您有时需要文件目标是PHONY目标的先决条件。 那么,这些应该是仅订购的目标吗? 据我了解,在这种情况下,仅订购和非订购之间的唯一区别是它们是否出现在$ ^或$ |中,因此它可能取决于您在该问题上想要的行为以及想要的依赖类型表达。

我在这里纠正吗? (如果其中一个没有明确的理由,)是否有任何理由选择一个(而不是仅订购)呢?

1 个答案:

答案 0 :(得分:2)

  

我想您有时需要文件目标是PHONY目标的先决条件

实际上,大多数时候。考虑一下“标准”的东西:

.PHONY: all
all: myprog other_stuff
myprog: $(OBJECTS)
    ...

但是“不要声明文件目标为PHONY /文件目标应该不是.PHONY的先决条件”是完全不同的事情。这意味着.PHONY: myprog不好,应该避免。原因是:(1)它无条件地触发了myprog的异常重建; (2)这可能使人们误以为myprog不是“文件”。

如果您执行myprog后需要强制重建make -B myprog。如果确实需要在每次make运行时对其进行重建,则可以执行以下操作:

myprog: $(OBJECTS) FORCE
    ...
FORCE:;

或者类似的东西。

  

据我了解,在这种情况下,仅订购商品和非仅订购商品之间的唯一区别是它们是否出现在$ ^或$ |

仅订购的先决条件很少使用GNU扩展。不必为了说明左侧的“语音内容”将被重建而放进去。因此,没有人会写all: | myprog,尽管它的工作效果与all: myprog一样好。