我有一个包含四个目标的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。
答案 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)