忽略prereq Makefile目标



我有一个Makefile:

.PHONY: target0 target1
target0:
<command>
target1: target0
<command>

如何运行make target1并强制其跳过target0

我所知道的GNUmake和任何其他make都没有提供忽略过时先决条件的方法。这与make的设计和目标背道而驰。不存在的目标或(使用GNUmake(.PHONY的目标在运行开始时总是被认为是过时的。因此,使用该makefile,make target1也将始终构建target0

你提出这个问题表明你已经将某个东西建模为一个先决条件,而不是真正的先决条件。例如,也许你这样做是为了聚合目标。在这种情况下,您可以考虑重写您的makefile,也许是这样的:

.PHONY: all target0 target1
target0:
<command>
target1:
<command>
all: target0 target1

有了它,您可以根据自己的选择只构建target0target1,或者同时构建两者(all(,但当这实际上是您想要的时,您确实需要请求两者。当您同时请求这两个选项时,除非使用-j选项,否则很可能会在target1之前生成target0。但是,如果您需要确保target0在两者都要构建时首先构建,那么您可以这样做:

.PHONY: all target0 target1
target0:
<command>
target1:
<command>
all:
make target0
make target1

使用GNU make:

make -W target0 target1

来自手册关于";代替执行配方":

每个"-W"标志后面都跟有一个文件名。给定文件的修改时间通过make记录为当前时间,尽管实际时间修改时间保持不变
如果没有'-n'或'-q'标志,当make实际执行配方时,"-W"标志可以指示make像某些文件已被修改一样操作,而无需实际运行这些文件的配方

最新更新