Создать правило в makefile только для набора файлов

Я пишу Makefile, и я хочу использовать общее правило с подстановочными знаками, как

%: bkp/%
    cp 
%: bkp/%
    cp $< [email protected]
lt; [email protected]

Но я хотел, чтобы это правило действовало только для нескольких конкретных файлов. Я хотел определить переменную со списком, например

file_list = foo.c bar.c zzz.c

и настройте правило так, чтобы оно действовало только для файлов, перечисленных в этой переменной. Как я могу это сделать?

 dividebyzero07 окт. 2010 г., 16:38
Извините за запутанный вопрос, Джонатан. На самом деле бессмысленно управлять таким каталогом резервных копий, я понял это позже. :) Я просто пытался сделать вопрос более общим и менее зависимым от моих конкретных целей ... Я думаю, кому-то может понравиться, например, иметь набор файлов .c, скомпилированных с определенными флагами, если не конкретным компилятором, но эти файлы находятся в одном каталоге. Это было бы другое приложение. Мне определенно интересно посмотреть на ваш Makefile!
 Jonathan Leffler07 окт. 2010 г., 05:10
Вы перечисляете только файлы .c; есть ли в каталоге другие файлы .c? Существуют ли другие файлы, для которых требуется создать резервную копию? Если вы добавите другой файл .c, его тоже нужно будет сохранить? И почему вы не используете систему контроля версий (VCS) для защиты своей работы?
 j_random_hacker07 окт. 2010 г., 05:26
@Jonathan: ... как вы можете сделать вывод, что он не использует VCS?
 Jonathan Leffler07 окт. 2010 г., 06:31
@j_random: это был вывод из названия подкаталога bkp, который предлагает резервное копирование, что, в свою очередь, предполагает отсутствие VCS. По-видимому, это был неправильный вывод - но вопрос маскировал реальность и поэтому дал ложные впечатления.
 Jonathan Leffler07 окт. 2010 г., 06:35
То, как я работаю с «точечными файлами» в моем домашнем каталоге - не обязательно лучший и, конечно, не единственный способ сделать это, - это хранить файлы в VCS в моем каталоге $ HOME / etc. Что касается VCS, файлы в каталоге etc являются главными, а make-файл в каталоге etc отвечает за копирование файлов до $ HOME / etc (фактически, make-файл сохраняет старую версию как $ HOME / . whatnot.old тоже). Когда версия в $ HOME изменена, я копирую измененную версию из $ HOME в $ HOME / etc и обновляю VCS. Кричите, если вы хотите больше информации (см. Мой профиль).
 dividebyzero07 окт. 2010 г., 05:28
@Jonathan Если вам действительно нужно знать, это то, что я делаю, и почему я не мог просто использовать подстановочный знак: я создал каталог «myconfig» в моем домашнем каталоге, который находится в VCS. Этот каталог содержит копии файлов в моем домашнем каталоге, такие как ~ / .bashrc, ~ / .emacs и другие. Я хочу, чтобы правило копировало исходный файл в этот каталог, но я хочу сделать его безопасным и избежать, например, скопировать Makefile из моего домашнего каталога поверх Makefile в этом каталоге.

Ответы на вопрос(2)

Конечно, через 5 минут я сам нашел ответ ... :)

Нам нужно статическое шаблонное правило.

http://www.gnu.org/software/make/manual/make.html#Static-Pattern

Таким образом, пример будет решен с

$(file_list) : % : bkp/%
    cp 
$(file_list) : % : bkp/%
    cp $< [email protected]
lt; [email protected]
 dividebyzero07 окт. 2010 г., 16:46
К сожалению! Спасибо! :)
 j_random_hacker07 окт. 2010 г., 05:27
file_list ->$(file_list) и я +1.
Решение Вопроса

Вы хотитеправило статического шаблона:

file_list = foo.c bar.c zzz.c

$(file_list): %: bkp/%
        cp 
file_list = foo.c bar.c zzz.c

$(file_list): %: bkp/%
        cp $< [email protected]
lt; [email protected]

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

Ваш ответ на вопрос