如何从Makefile中的目标列表创建规则?

时间:2015-03-17 19:54:36

标签: makefile templating

我的项目由一些配置文件组成,它们是从相应的模板生成的。例如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) : $@.tmpl
     generate-from-tmpl $<

我怎样才能实现这一目标?感谢。

1 个答案:

答案 0 :(得分:3)

%: %.tmpl会尝试将目标%与任何目标名称匹配,但如果不存在匹配的%.tmpl文件,那么make将完全跳过该目标的模式。

我相信这就是你想要的。你有什么理由不这么认为吗?

如果您希望更具体地说明您想要的是Static Pattern Rule

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

仅适用于$(GENERATED_FILES)

中的文件

此外,如果您的模板文件只有一个深度目录,则可以使用:

TEMPLATED_FILES=$(wildcard *.tmpl)

而不是shell和find(还有递归的make通配符定义可用,但如果你需要,find是合理的。)