【发布时间】:2022-10-23 16:16:44
【问题描述】:
我有一个 Makefile:
.PHONY: target0 target1
target0:
<command>
target1: target0
<command>
如何运行make target1 并强制它跳过target0?
【问题讨论】:
我有一个 Makefile:
.PHONY: target0 target1
target0:
<command>
target1: target0
<command>
如何运行make target1 并强制它跳过target0?
【问题讨论】:
我所知道的 GNU make 和任何其他 make 都没有提供忽略过时先决条件的方法。这与make 的设计和目标背道而驰。不存在的目标或(使用 GNU make)为 .PHONY 的目标在运行开始时始终被视为已过期。因此,使用该 makefile,make target1 也将始终构建 target0。
您提出这个问题表明您已经将某些东西建模为先决条件,而这并不是真正的先决条件。例如,也许您这样做是为了汇总目标。在这种情况下,您可以考虑重写您的 makefile,可能是这样的:
.PHONY: all target0 target1
target0:
<command>
target1:
<command>
all: target0 target1
有了它,您可以选择只构建target0 或只构建target1 或两者(all),但您确实需要同时请求这两者,而这实际上是您想要的。当您同时请求两者时,您将大概除非您使用-j 选项,否则在target1 之前构建target0。但是,如果您需要确保在构建两者时首先构建 target0,那么您可以这样做:
.PHONY: all target0 target1
target0:
<command>
target1:
<command>
all:
make target0
make target1
【讨论】:
使用 GNU make:make -W target0 target1,参见GNU make 手册中关于“如何运行 make:避免重新编译某些文件”的 --what-if 选项。
【讨论】: