在makefile中为一组文件创建规则

在makefile中为一组文件创建规则,makefile,wildcard,rule,Makefile,Wildcard,Rule,我正在编写一个Makefile,我想使用通配符的通用规则,比如 %: bkp/% cp $< $@ %:bkp/% cp$

我正在编写一个Makefile,我想使用通配符的通用规则,比如

%: bkp/%
    cp $< $@
%:bkp/%
cp$<$@
但是我希望这个规则只对一些特定的文件有效。例如,我想用列表定义一个变量

file_list=foo.cbar.czzz.c

并配置规则,使其仅对该变量中列出的文件有效。我该怎么做?

你想要一个:

file_list=foo.c bar.c zzz.c
$(文件列表):%:bkp/%
cp$<$@

语法与您使用的非常相似。是的,它通常更安全(更可预测)。

当然,5分钟后我自己找到了答案……)

我们需要的是一个静态模式规则

所以这个例子可以用

$(file_list) : % : bkp/%
    cp $< $@
$(文件列表):%:bkp/%
cp$<$@

您只列出了“.c”文件;目录中是否还有其他“.c”文件?是否有其他需要备份的文件?如果添加另一个“.c”文件,是否也需要保存?你为什么不使用版本控制系统(VCS)来保护你的工作?@Jonathan:…你如何推断他没有使用VCS?@Jonathan如果你真的需要知道,这就是我正在做的,为什么我不能简单地使用通配符:我在VCS上的主目录中创建了一个“myconfig”目录。此目录保存我的主目录中的文件副本,如~/.bashrc、~/.emacs和其他文件。我希望规则将原始文件复制到此目录中,但我希望使其安全,并避免从我的主目录复制Makefile,而不是复制此目录中的Makefile。@j_random:这是从子目录bkp的名称推断出来的,该名称表示备份,进而表示没有VCS。显然,这是一个错误的推论——但问题掩盖了事实,因此给人错误的印象。我处理主目录中的“点文件”的方式——不一定是最好的,当然也不是唯一的方式——是将文件存储在我的$home/etc目录中的VCS下。就VCS而言,etc目录中的文件是主文件,etc目录中的makefile负责将文件复制到$HOME/etc(实际上,makefile也将旧版本保存为$HOME/.whatnot.old)。修改$HOME中的版本时,我将修改后的版本从$HOME复制到$HOME/etc中,并更新VCS。如果您想要更多信息,请呼喊(参见我的个人资料)。
文件列表
->
$(文件列表)
,我将+1。
$(file_list) : % : bkp/%
    cp $< $@