makefile match-anything作为先决条件

时间:2013-08-08 23:15:57

标签: makefile gnu-make

我有一个包含四个目标的makefile。可以复制其中两个目标,以便可能有许多目标作为先决条件运行(它们是double-colon targets)。其中两个目标是match-anything rules。不幸的是,它根本不像我期望的那样工作。我从这开始:

.PHONY:
build_%: pre_build post_build _internal_%
        @echo "4. $@: $^"

.PHONY: pre_build
pre_build::
        @echo "1. $@: $^"

.PHONY: _internal_%
_internal_%:
        @echo "2. $@: $^"

.PHONY: post_build
post_build::
        @echo "3. $@: $^"

这给了我这个输出:

make build_foo
1. pre_build: 
3. post_build: 
2. _internal_foo: 
4. build_foo: pre_build _internal_foo post_build

如果我明确提到先决条件,请像这样:

.PHONY:
build_%: pre_build post_build _internal_%
        @echo "4. $@: $^"

.PHONY: pre_build
pre_build::
        @echo "1. $@: $^"

.PHONY: _internal_%
_internal_%: pre_build
        @echo "2. $@: $^"

.PHONY: post_build
post_build:: _internal_%
        @echo "3. $@: $^"

相反,我得到了这个:

make build_foo
1. pre_build: 
make: *** No rule to make target `pre_build'.  Stop.

我需要做些什么来使依赖项像这样工作?我正在使用GNU Make 3.81。

1 个答案:

答案 0 :(得分:0)

这似乎是GNU Make 3.81中的一个真正的错误。

我建议这个解决方法:

define prebuild
@echo "1. pre_build: $^"
endef

define postbuild
@echo "3. post_build: $^"
endef

.PHONY:
build_%: _internal_%
        @echo "4. $@: $^"

.PHONY: _internal_%
_internal_%:
        $(prebuild)
        @echo "2. $@: $^"
        $(postbuild)

# pre_build and post_build are not used here, but may still be used elsewhere

.PHONY: pre_build
pre_build::
    $(prebuild)

.PHONY: post_build
post_build::
        $(postbuild)