【问题标题】:How should you use .PHONY in included Makefiles?您应该如何在包含的 Makefile 中使用 .PHONY?
【发布时间】:2020-04-05 06:40:57
【问题描述】:

假设我有一组 Makefile 模块:

# foo.mk

rule1: prereq1
    recipe1

# bar.mk

rule2: prereq2
    recipe2

和一个主 Makefile:

# Makefile

include foo.mk
include bar.mk

是否应该将.PHONY: 包含在每个单独的 .mk 文件中,以仅包含在该文件中的虚假目标,还是应该有一些仅包含在主 Makefile 中的累积列表?

# foo.mk
TARGETS += rule1
...
# bar.mk
TARGETS += rule2
...
# Makefile
.PHONY: $(TARGETS)

我没有在GNU Make docs 或类似问题中找到任何相关内容。

【问题讨论】:

  • 我不知道你所说的“应该”是什么意思。无论哪种方式都可以正常工作,因此请选择您喜欢的方式。
  • “应该” ... 如,是否有最佳实践或记录和定义的方法来做某事。如果下次遇到时被覆盖,我不想将 .PHONY 放入每个声明相关目标的文件中。
  • .PHONY 永远不会被覆盖。与任何其他目标一样,每个新的.PHONY 定义添加 到现有列表的更多先决条件。不,我知道没有最佳实践。两者的工作方式相同(除了一个定义了一个变量,这可能对.PHONY 之外的其他东西有用,而一个没有)。出于同样的原因,不需要“记录和定义”的方法。无论您更喜欢哪个,都应该使用。
  • 这就是我想要的。谢谢!

标签: makefile gnu-make


【解决方案1】:

声明

.PHONY: rule1

告诉 Make 它不应该将“rule1”视为要构建的文件的名称。假设你把它放在Makefile。当您运行另一个 makefile(foo.mk 或包含它的 makefile)时会发生什么?

当您运行 rule1 规则时,您是否希望 Make 将其视为 PHONY 目标?如果您的答案不是“这取决于我使用的是哪个makefile”,那么您应该在makefile 中有定义规则的语句。

【讨论】:

  • 好的,谢谢。基本上。 .mk 模块永远不会被直接调用,但它们将(可能)包含在将被调用的不同“主”Makefile 中。我不知道 .PHONY 是否是该文件的本地文件,或者每次在新包含的模块中遇到它时,最新的语句都会覆盖前一个语句。