Как создать правила из списка целей в Makefile?

Мой проект состоит из некоторых файлов конфигурации, и они генерируются из соответствующих шаблонов. например foo.tmpl => foo. Теперь я хочу написать Makefile, который может генерировать соответствующий файл из шаблона.

У меня не могло быть такого:

% : %.tmpl
    generate-from-tmpl $<

Однако, поскольку он применяет цель ко всем возможным файлам, я хочу ограничить ее цели только теми, у кого есть корреспондент .tmpl. Теперь я получил список всех шаблонных файлов:

 TEMPLATED_FILES=$(shell find -type f -name "*.tmpl")
 GENERATED_FILES=$(TEMPLATED_FILES:.tmpl=)

Я хочу иметь что-то похожее на:

 $(foreach GENERATED_FILES) : [email protected]
     generate-from-tmpl $<

Как я могу этого добиться? Спасибо.


person Shou Ya    schedule 17.03.2015    source источник


Ответы (1)


%: %.tmpl попытается сопоставить цель % с любым именем цели, но если соответствующий файл %.tmpl не существует, make полностью пропустит этот шаблон для этой цели.

Я считаю, что это именно то, что вы хотите. У вас есть причины так не думать?

При этом, если вы хотите быть более конкретным, что вы хотите, это Правило статического шаблона:

$(GENERATED_FILES) : % : %.tmpl
        generate-from-tmpl $<

который будет применяться только к файлам в $(GENERATED_FILES).

Кроме того, если ваши файлы шаблонов имеют глубину только в один каталог, вы можете использовать:

TEMPLATED_FILES=$(wildcard *.tmpl)

вместо оболочки и find (есть также рекурсивные определения подстановочных знаков, но find разумно, если вам это нужно).

person Etan Reisner    schedule 17.03.2015
comment
Я неправильно понял значение % : %.tmpl. Но благодаря вашему ответу мое замешательство разрешилось. Благодарю вас! - person Shou Ya; 17.03.2015