我有以下项目架构
NPE
我的目标是为/
├── makefile
└── doc/
├── makefile
└── uml/
├── uml1/
│ ├── uml1.plantuml
| └── res/
| ├── ressource1
| └── ressource2
└── uml2/
├── uml2.plantuml
└── res/
├── ressource1
└── ressource2
到doc/uml
的每个目录生成png图像
父makefile是以下文件
build/doc/uml
submakefile是下面的
BUILD_PATH?=./build
doc:
${MAKE} -C $@ $@ ADOC_OUTPUT_DIR=$(abspath ${BUILD_PATH}/doc)
clean:
rm -rf build
.PHONY: doc clean
但是当我用ADOC_OUTPUT_DIR ?= build
UML_OUTPUT_DIR = ${ADOC_OUTPUT_DIR}/uml
UML = $(notdir $(wildcard uml/*))
UML_TARGETS = $(foreach uml, ${UML}, ${UML_OUTPUT_DIR}/${uml}.png)
doc: uml
uml: ${UML_OUTPUT_DIR} ${UML_TARGETS}
${UML_TARGETS}: ${UML_OUTPUT_DIR}/%.png : uml/%/%.plantuml
plantuml $< -o $(@D)
###################################
##### Directory creation part #####
###################################
${UML_OUTPUT_DIR}:
mkdir -p $@
.PHONY: doc uml ${UML_TARGETS} ${UML_OUTPUT_DIR}
启动它时失败了
make doc
问题似乎出在以下事实:依赖项不能两次替换'%'。
在不修改项目体系结构的情况下,我无法找到实现目标的方法(我希望保持现状不变)
是否可以将模式'%'替换两次?
是否有比尝试在目标的依赖项中两次替换uml名称更好的方法呢?
答案 0 :(得分:3)
您也可以使用secondary expansion:
.SECONDEXPANSION:
${UML_TARGETS}: ${UML_OUTPUT_DIR}/%.png : uml/$$*/$$*.plantuml
plantuml $< -o $(@D)
答案 1 :(得分:1)
实际上,您不能使用静态模式规则。但是您可以使用the eval
function:
define MY_rule
${UML_OUTPUT_DIR}/$(1).png : uml/$(1)/$(1).plantuml
plantuml $$< -o $$(@D)
endef
$(foreach u,$(UML),$(eval $(call MY_rule,$(u))))
答案 2 :(得分:0)
由于%
中的两个uml/%/%.plantuml
在文件系统中都必须是唯一的,因此额外的目录不会添加任何东西来保持结果路径的唯一性-uml/foo/foo.plantuml
不会比uml/foo.plantuml
更有用。我只是摆脱uml
下的目录。