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?
如果规则没有先决条件或配方,并且规则的目标是不存在的文件,则假设此目标在其规则运行时已更新 . 这意味着所有依赖于此目标的目标将始终运行其配方 .
但该描述不适用于上述情况,因为 objects
target does 具有先决条件 . 但也许行为是相同的,只应更新 Make 手册以澄清这一点 .
一些额外的说明:
-
我使用上面的分页后分页格式,使读者更容易复制和粘贴代码 . 否则,从网页复制时,选项卡将以通常的制表符缩进配方格式转换为空格 .
-
当然我知道我可以创建一个变量
$(OBJECTS)
,它将指向一个文件列表并使用它来代替上面的objects
目标 . 这不是重点 . -
This question似乎也涉及相同的行为,但不讨论它是否是预期的行为或错误 .
-
我正在使用GNU Make 4.2.1
1 回答
我相信你所引用的段落只是重新描述了已在其他地方指定的特定行为案例,以便为
FORCE
的工作方式设置场景 .确实在_1126936中做了一个更简单但更一般的陈述:
再次here:
所以你所观察到的行为是完全可以预期的 .