Динамические правила Makefile для Gnu с использованием define, foreach и call - PullRequest
0 голосов
/ 24 июня 2019

Я хочу определить множество правил следующим образом:

x-9: y-9 z-9 x-8
    python gen-files.py --out-x=x-9 --out-y=y-9 --in-x=x-8
x-8: y-8 z-8 x-7
    python gen-files.py --out-x=x-8 --out-y=y-8 --in-x=x-7
x-7: y-7 z-7 x-6
    python gen-files.py --out-x=x-7 --out-y=y-7 --in-x=x-6
x-6: y-6 z-6 x-5
    python gen-files.py --out-x=x-6 --out-y=y-6 --in-x=x-5
x-5: y-5 z-5 x-4
    python gen-files.py --out-x=x-5 --out-y=y-5 --in-x=x-4

x-4:
    touch x-4

Как видите, основная идея в том, что у меня есть цель

выходной_файл-НОМЕР:

, который имеет пару зависимостей, либо содержащих NUMBER в своем имени, либо содержащих NUMBER-MINUS-ONE в своем имени.

Моя цель заключается в том, чтобы при попытке построить конечную цель x-9 она автоматически x-8, x-7 ... снижалась до x-4.

Я пробовал что-то вроде

define oprule
x-$(1): x-$(1) y-$(1) z-$(1) x-$(2)
    python gen-files.py --out-x=x-$(1) --out-y=y-$(1) --in-x=x-$(2)
endef

ttt = 9 8 7 6 5
$(foreach now, $(ttt), \
    $(call oprule, $(now), $(shell $$(( $(now)-1 )) ) ) )

Я думал, что это сгенерирует 5 правил, но когда я попробую

make x-9

Я получаю сообщение

Makefile:93: *** multiple target patterns.  Stop.

и я не знаю, что происходит.

1 Ответ

0 голосов
/ 24 июня 2019

должно быть

define oprule
x-$(1): y-$(1) z-$(1) x-$(2)
    python gen-files.py --out-x=x-$(1) --out-y=y-$(1) --in-x=x-$(2)

endef

Последняя новая строка, предшествующая endef, всегда съедается (как и первая новая строка, следующая за define). Таким образом, вы должны иметь еще один параметр для foreach, чтобы сгенерировать правильное разбиение строки (или добавить какой-то макрос $(nl) после вызова oprule).

P.S. А также не ставьте пробел после запятой. Хотя в данном конкретном случае это не повредит, но в целом места имеют большое значение.

...