makefile依赖关系两次替换目标模式

时间:2018-10-23 21:53:25

标签: linux makefile gnu-make

我有以下项目架构

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名称更好的方法呢?

3 个答案:

答案 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下的目录。