文件目标为重新制作(可能的错误?)

应该总是重制一个有先决条件的目标,但不指向一个文件并且没有配方? 还是应该只有在先决条件的一个或多个需要重拍重拍这样的目标?

例如,在下面所示的Makefile中,我添加了一个目标调用objects有先决条件,但没有指向一个文件。 主要目标被称为依赖于objects program (以及潜在的其他先决条件)。

file1 file2 file3: ;       touch $@

objects: file1 file2

program: objects  file3 ;  @echo 'Making $@'

我的期望是,当运行make program并且不需要重新创建文件先决条件(即file1,file2和file3都存在)时,该program不应该重新制作。

然而,实际的GNU Make行为是program的配方总是运行(无论先决条件文件如何)。 这是因为objects总是被认为是重新制作,这迫使任何依赖关系(即program )被重新制作。

你可以通过运行make --trace -d --no-builtin-rules program ,你会看到Make总是输出“Must remake target'对象。” 所以objects总是“重新制作”(即使它没有配方),并且它总是被认为是最新更新的。

这很可能是因为objects不指向真实文件。 但是我期待这一点,因为它没有配方,只要不需要重新制作其先决条件就不会重新制作。

这是预期的行为还是错误?

GNU Make手册指出:

如果规则没有先决条件或配方,并且规则的目标是不存在的文件,则设想该目标在其规则运行时被更新。 这意味着所有依赖这个目标的目标都会有他们的配方运行。

但是该描述不适用于上述情况,因为objects目标确实具有先决条件。 但也许行为是相同的, Make手册应该只是更新来澄清这一点。

一些附加说明:

  • 我使用了上述的分号后分号格式,以便读者更容易复制和粘贴代码。 否则,当从网页复制时,选项卡将以通常的制表符缩进配方格式转换为空格。

  • 当然,我知道我可以创建一个变量$(OBJECTS)来指向一个文件列表,并用它来代替上面的objects 。 这不是真正的重点。

  • 这个问题似乎也涉及相同的行为,但不论是否是预期的行为或错误都没有讨论。

  • 我正在使用GNU Make 4.2.1


  • 我相信你所引用的段落仅仅是重述一个已经在其他地方已经指定的特定行为案例,以便为FORCE工作方式设定场景。

    事实上,在上一节中做出了一个更简单但更一般的陈述:

    如果您编写的规则的配方不会创建目标文件,则每次目标出现重新制作时都会执行配方。

    并再次在这里:

    如果目标不存在或目标比任何先决条件早,目标就会过期。

    所以你所观察到的行为是完全可以预料的。

    链接地址: http://www.djcxy.com/p/64131.html

    上一篇: file target as being remade (possible bug?)

    下一篇: GNU Linux Makefile PHONY target dependencies not working correctly