在下面的简单示例中,我想做一个make dist
并在distclean
和 distdebug
之前执行distrelease
目标。
.PHONY: distclean
dist: distdebug distrelease
@echo in dist
distdebug: distclean
@echo in distdebug
distrelease:
@echo in distrelease
distclean:
@echo in distclean
不幸的是,尽管使用.PHONY
,但只有一次调用distclean:
vagrant@precise32:/tmp$ make dist
in distclean
in distdebug
in distrelease
in dist
我猜Make知道它已经运行了distclean
一次,所以它没有再次运行它。如何让它多次运行distclean
?
答案 0 :(得分:8)
您无法使用常规规则。 Make只会一次构建任何给定的目标。您可以使用递归make调用来执行此操作:
distdebug:
$(MAKE) distclean
@echo in distdebug
distrelease:
$(MAKE) distclean
@echo in distrelease
通常,以不同方式规划构建是一个好主意,并且将不同类型的构建的目标放入不同的子目录中。这样你就不必在两者之间进行清理。
答案 1 :(得分:0)
我一直在寻找类似的东西,即多次执行相同的模式(%)目标。而且我不喜欢递归的make调用。无论如何,我最终得到了以下解决方案:
run-%: build-%
@echo "run-$(basename $*)"
build-%:
@echo "build-$*"
build-%.2: build-%; @true
build-%.3: build-%; @true
run: run-foo run-foo.2 run-foo.3 run-bar
@true
或者:
run: run-foo run-foo.2 run-bar run-foo.3
@true
build-%:
@echo "build-$*"
.SECONDEXPANSION:
run-%: build-$$(basename $$*)
@echo "run-$(basename $*)"
通过将扩展名.2和.3添加到任何内容,此makefile最多可以运行3次,但仅生成一次。我希望你能明白。
> make run
build-foo
run-foo
run-foo
run-foo
build-bar
run-bar