我的项目由一些配置文件组成,它们是从相应的模板生成的。例如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 $<
我怎样才能实现这一目标?感谢。
答案 0 :(得分:3)
%: %.tmpl
会尝试将目标%
与任何目标名称匹配,但如果不存在匹配的%.tmpl
文件,那么make将完全跳过该目标的模式。
我相信这就是你想要的。你有什么理由不这么认为吗?
如果您希望更具体地说明您想要的是Static Pattern Rule:
$(GENERATED_FILES) : % : %.tmpl
generate-from-tmpl $<
仅适用于$(GENERATED_FILES)
。
此外,如果您的模板文件只有一个深度目录,则可以使用:
TEMPLATED_FILES=$(wildcard *.tmpl)
而不是shell和find
(还有递归的make通配符定义可用,但如果你需要,find
是合理的。)