3

在下面的简单示例中,我想做 a make distand 让distclean目标在distdebug and 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多次?

4

2 回答 2

12

你不能使用正常的规则。Make 只会一次构建任何给定的目标。您可以使用递归 make 调用来做到这一点:

distdebug:
        $(MAKE) distclean
        @echo in distdebug
distrelease:
        $(MAKE) distclean
        @echo in distrelease

不过,通常最好以不同方式规划构建,并将不同类型构建的目标放在不同的子目录中。这样您就不必在两者之间进行清洁。

于 2013-07-18T18:11:40.223 回答
2

我一直在寻找类似的东西,即多次执行相同的模式 (%) 目标。而且我不喜欢递归调用。无论如何,我最终得到了这个解决方案:

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
于 2018-11-24T08:13:02.860 回答