我有一个makefile片段:
all: $(objects)
fresh: clean all
clean: ;rm $(objects)
在这里,我要确保在进行make fresh
-clean
时应在all
之前。
但是考虑到我make all
时不应该制作clean
,我该如何确定呢?
我可以想象一种方法可能是这样
fresh: clean
make all
是解决此问题的正确方法(或唯一方法)吗?
答案 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
取决于先决条件clean
,clean
的配方将在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:
行中的依存关系顺序将计数。