按文件中的顺序覆盖Makefile中的目标是否合法?

按文件中的顺序覆盖Makefile中的目标是否合法?,makefile,overriding,warnings,Makefile,Overriding,Warnings,我有一个生成文件: .PHONY: all all: target1 target1: $(info "target1") target1: $(info "target1 override") 如果要从bash执行“make”,它将响应: $ make Makefile:8: warning: overriding recipe for target 'target1' Makefile:5: warning: ignoring old recipe for target

我有一个生成文件:

.PHONY: all
all: target1

target1:
    $(info "target1")

target1:
    $(info "target1 override")
如果要从bash执行“make”,它将响应:

$ make
Makefile:8: warning: overriding recipe for target 'target1'
Makefile:5: warning: ignoring old recipe for target 'target1'
"target1 override"
make: Nothing to be done for 'all'.
这种行为是我所期望的,因为我期望Makefile的解析器获取目标的最新定义

如果规则被覆盖,那么期望从Makefile获取最新规则是否合法

有可能去掉警告吗

另外,我也试过回答另一个StackOverflow的问题,比如使用“override”关键字和“:”符号。这没有帮助(Makefile中出现错误和相同的警告)

期望来自Makefile的最新规则将被删除是否合法 如果规则被覆盖,则采取何种措施

包含为同一目标提供配方的多个目标规则的生成文件违反:

任何给定目标只有一个目标规则可以包含命令

违反这一点不会让警察对你下手,但它可能会理所当然地让其他开发人员和管理人员对你的代码感到愤怒,不管是现在还是将来。当呈现包含多个配方的makefile时,
make
的实现不受规范的约束,不受任何特定行为的约束

您显示的诊断消息和描述的行为显示为GNU
make
的特征。如果您愿意依赖于特定的
实现,则可以合理地依赖,即:

一个文件只能执行一个配方。如果超过 一条规则给出了同一文件的配方,make使用最后一条 给出并打印一条错误消息*

(我的脚注。)但依赖于此,您的makefile将无法移植。其他
make
实现可能会拒绝makefile,选择第一个配方,选择随机配方,以某种顺序选择所有匹配的配方,或者表现出任何明显或不明显的破坏。提醒您这是该消息的目的

有可能去掉警告吗

继续假设GNU
make
,手册明确表示将发出诊断,并且没有描述我希望在不抑制实际构建的情况下抑制相关输出的任何内容

底线

这个问题给人的印象是,您认为所描述的用法应该是可以接受的,因此诊断只是一个麻烦。事实并非如此。这种用法至少是拙劣的,它会给自己和他人带来真正的问题。无论你想通过这种方式实现什么,都有更好的选择



*这是指目标规则。匹配目标的后缀和模式规则是另一回事。

我不确定所建议的实现是否正确。因此,我决定在这里问一个问题。非常感谢这完美的证明,建议的解决方案必须被拒绝。