Linux makefile在其依赖项中替换目标模式两次
我有以下项目架构Linux makefile在其依赖项中替换目标模式两次,linux,makefile,gnu-make,Linux,Makefile,Gnu Make,我有以下项目架构 / ├── makefile └── doc/ ├── makefile └── uml/ ├── uml1/ │ ├── uml1.plantuml | └── res/ | ├── ressource1 | └── ressource2 └── uml2/ ├── uml2.plantuml
/
├── makefile
└── doc/
├── makefile
└── uml/
├── uml1/
│ ├── uml1.plantuml
| └── res/
| ├── ressource1
| └── ressource2
└── uml2/
├── uml2.plantuml
└── res/
├── ressource1
└── ressource2
我的目标是为存在于doc/uml和build/doc/uml中的每个目录生成一个png图像
父makefile如下所示
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}
子基文件如下所示
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}
问题似乎是因为依赖项上不能两次替换“%”
如果不修改项目架构,我无法找到实现目标的方法。我希望它保持现在的状态
是否有方法将模式“%”替换两次
有没有比尝试在目标的依赖项中两次替换uml名称更好的方法来实现我的目标?因为uml/%/%.plantuml中的两个%s在文件系统中都必须是唯一的,额外的目录在保持结果路径唯一性方面没有添加任何内容-uml/foo/foo.plantuml没有比uml/foo.plantuml更有用。我只想去掉uml下的目录。因为uml/%/%.plantuml中的两个%s在文件系统中都必须是唯一的,额外的目录在保持结果路径唯一性方面没有添加任何内容-uml/foo/foo.plantuml没有比uml/foo.plantuml更有用。我只想去掉uml下的目录。事实上,在您的情况下,您不能使用静态模式规则。但您可以使用:
实际上,在您的情况下,您不能使用静态模式规则。但您可以使用: 您还可以使用: 您还可以使用:
.SECONDEXPANSION:
${UML_TARGETS}: ${UML_OUTPUT_DIR}/%.png : uml/$$*/$$*.plantuml
plantuml $< -o $(@D)