Makefile нескольких источников в подкаталогах - PullRequest
1 голос
/ 11 апреля 2020

У меня есть несколько файлов .yml в каталоге, которые являются вводом сценария python для создания. json файлы, json находятся в подкаталогах с тем же именем, что и источник без расширения.

Makefile работает с одной целью, но не с несколькими, создает круговые зависимости

sources = DOC-A1 DOC-A2
pyscript=~/Documents/Programmation/myscript.py

all: $(sources)/$(sources)-ref.json $(sources)/$(sources)-enr.json

$(sources)/$(sources)-ref.json: $(sources).yml
    python3 $(pyscript) --ref --graph $<

$(sources)/$(sources)-enr.json: $(sources).yml
    python3 $(pyscript) --enr --graph $<



1 Ответ

0 голосов
/ 11 апреля 2020

Если у вас есть исходные файлы: DO C -A1.yml DO C -A2.yml, тогда вам нужно сделать что-то вроде:

# Source file base list (without yml extensions)
sources = DOC-A1 DOC-A2
# Create a list of ref output files from the base names
outputs_ref = $(addsuffix -ref.json,$(sources))
# Do the same with the enr files
outputs_enr = $(addsuffix -enr.json,$(sources))

# Print the list of output files you want (for ref)
$(info outputs_ref: $(outputs_ref))
$(info outputs_enr: $(outputs_enr))

pyscript=~/Documents/Programmation/myscript.py

# All now depends on the two lists of output files
all: $(outputs_ref) $(outputs_enr)

# Pattern-rule to generate -ref.json files, dependant on a .yml file with the same base-name
%-ref.json : %.yml
    @echo python3 $(pyscript) --ref --graph $<

# Pattern-rule to generate -enr.json files, dependant on a .yml file with the same base-name
%-enr.json: %.yml
    @echo python3 $(pyscript) --enr --graph $<

Примечание: Правила, которые я использовал, распечатывают только команды - для запуска удалите часть @echo из начала строк

Обновление Я забыл упомянуть о шаблонном правиле. Правило типа: %.a : %.b будет расширено для всех целей, которые соответствуют %.a, где % является подстановочным знаком. Должна быть соответствующая %.b зависимость, где опять же % является подстановочным знаком. Поэтому, если у вас есть исходные файлы 1.b, 2.b, 3.b и вы хотите скомпилировать их в 1.a, 2.a, 3.a, тогда правило шаблонов %.a : %.b сделает это за вас.

Чтобы ответить на ваш вопрос о круговой зависимости: Исходное правило:

$(sources)/$(sources)-ref.json: $(sources).yml
    python3 $(pyscript) --ref --graph $<

Это не шаблонное правило, поэтому оно расширяет переменные как есть, поэтому вы получите:

DOC-A1 DOC-A2/DOC-A1 DOC-A2-ref.json: DOC-A1 DOC-A2.yml
    python3 $(pyscript) --ref --graph $<

Здесь мы только что заменили $(sources) на DOC-A1 DOC-A2. Вы можете видеть, что DOC-A1 является одновременно целью и зависимостью (т.е. круговой). Существует также множество других «мусоров», которые, я уверен, вы не собирались:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...