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)