首页 文章

GNU make总是将非文件目标视为重制(可能的bug?)

提问于
浏览
2

Make 是否应该重新制作具有先决条件的目标,但不指向文件且没有配方?或者,如果需要重新制作一个或多个先决条件, Make 是否只会重新制作此类目标?

例如,在下面显示的Makefile中,我添加了一个名为 objects 的目标,该目标具有先决条件,但未指向文件 . 主要目标称为 program ,它取决于 objects (以及可能的其他先决条件) .

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 始终输出“必须重新制作目标'objects'” . 所以 objects 总是"remade"(即使它没有配方),它总是被认为是新更新的 .

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

Is this the expected behavior or is it a bug?

GNU Make manual说:

如果规则没有先决条件或配方,并且规则的目标是不存在的文件,则假设此目标在其规则运行时已更新 . 这意味着所有依赖于此目标的目标将始终运行其配方 .

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

一些额外的说明:

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

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

  • This question似乎也涉及相同的行为,但不讨论它是否是预期的行为或错误 .

  • 我正在使用GNU Make 4.2.1

1 回答

  • 4

    我相信你所引用的段落只是重新描述了已在其他地方指定的特定行为案例,以便为 FORCE 的工作方式设置场景 .

    确实在_1126936中做了一个更简单但更一般的陈述:

    如果您编写的配方不会创建目标文件的规则,则每次目标进行重建时都会执行配方 .

    再次here

    如果目标不存在或者它比任何先决条件更旧,则目标已过期 .

    所以你所观察到的行为是完全可以预期的 .

相关问题