makefile подставляет целевой шаблон дважды в зависимости - PullRequest
0 голосов
/ 24 октября 2018

У меня есть следующая архитектура проекта

/
├── makefile
└── doc/
    ├── makefile
    └── uml/
        ├── uml1/
        │   ├── uml1.plantuml
        |   └── res/
        |       ├── ressource1
        |       └── ressource2
        └── uml2/
            ├── uml2.plantuml
            └── res/
                ├── ressource1
                └── ressource2

Моя цель - сгенерировать изображение png для каждого каталога, представленного в doc/uml в build/doc/uml

Родительский make-файл следующийone

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

$ make doc
make -C doc doc ADOC_OUTPUT_DIR=/home/julien/test_uml/build/doc
make[1] : Entering directory « /home/julien/test_uml/doc »
make[1]: ***  No rule to make target « uml/gui_state_diagram/%.plantuml », needed by « /home/julien/test_uml/build/doc/uml/gui_state_diagram.png ». Stop.
make[1] : Exiting directory « /home/julien/test_uml/doc »
makefile:12 : the recipe for target « doc » failed
make: *** [doc] Erreur 2

Кажетсяпроблема заключается в том, что «%» нельзя заменить дважды на зависимости.

Я не могу найти способ достичь своей цели без изменения архитектуры проекта (я хотел бы оставить еетак близко, как сейчас)

Есть ли способ заменить шаблон '%' дважды?

Есть ли лучший способ достичь моей целичем пытаться заменить имя uml дважды в зависимости цели?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Действительно, в вашем случае вы не можете использовать правило статического шаблона.Но вы можете использовать eval функцию :

define MY_rule
${UML_OUTPUT_DIR}/$(1).png : uml/$(1)/$(1).plantuml
    plantuml $$< -o $$(@D)
endef
$(foreach u,$(UML),$(eval $(call MY_rule,$(u))))
0 голосов
/ 24 октября 2018

Вы также можете использовать вторичное расширение :

.SECONDEXPANSION:
${UML_TARGETS}: ${UML_OUTPUT_DIR}/%.png : uml/$$*/$$*.plantuml
        plantuml $< -o $(@D)
0 голосов
/ 24 октября 2018

Поскольку оба % s в uml/%/%.plantuml должны быть уникальными в файловой системе, дополнительный каталог не добавляет ничего с точки зрения сохранения уникального результирующего пути - uml/foo/foo.plantuml не более полезен, чем uml/foo.plantuml,Я бы просто избавился от каталогов под uml.

...