对目标的先决条件下达命令

时间:2018-08-27 09:40:58

标签: makefile dependencies gnu-make target prerequisites

我有一个makefile片段:

all: $(objects)
fresh: clean all
clean: ;rm $(objects)

在这里,我要确保在进行make fresh-clean时应在all之前。

但是考虑到我make all时不应该制作clean,我该如何确定呢?


我可以想象一种方法可能是这样

fresh: clean
    make all

是解决此问题的正确方法(或唯一方法)吗?

2 个答案:

答案 0 :(得分:1)

正如您在问题中已经建议的那样,在先决条件为make的配方中,针对目标all的同一个makefile递归调用clean :< / p>

# At the very beginning of the makefile
CURRENT_MAKEFILE :=  $(lastword $(MAKEFILE_LIST))
# ...

.PHONY: fresh
fresh: clean
    $(MAKE) -f $(CURRENT_MAKEFILE) all

这会强加一个命令,因为目标fresh取决于先决条件cleanclean的配方将在fresh的配方之前执行将执行all的配方。

请注意,我在这里使用$(MAKE) instead of make进行递归。

答案 1 :(得分:1)

如果使用GNU make:

all:
    @echo $@
    @sleep 1
    @echo end $@

clean:
    @echo $@
    @sleep 1
    @echo end $@

fresh:: clean
fresh:: all

.PHONY: clean fresh all

请注意目标 s fresh之后的双冒号!参见documentation

  

目标的双冒号规则按其顺序执行   出现在makefile中。

如果运行make -j2 fresh,则表明它可以正常工作:

clean
end clean
all
end all

但是使用fresh:: clean all不能并行工作(可能是意外的)。

使用BSD制作:

 all:
    @echo $@
    @sleep 1
    @echo end $@

clean:
    @echo $@
    @sleep 1
    @echo end $@

fresh:  clean all
    @echo $@

.ORDER: clean all
.PHONY: clean all fresh

请注意,该行以.ORDER开头。它也可以在并行化中很好地工作(请参见man make)。如果没有并行化,则fresh:行中的依存关系顺序将计数。