如何多次调用Makefile目标?

时间:2013-07-18 18:06:56

标签: makefile

在下面的简单示例中,我想做一个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

2 个答案:

答案 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