Если у вас есть исходные файлы: 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
является одновременно целью и зависимостью (т.е. круговой). Существует также множество других «мусоров», которые, я уверен, вы не собирались:)