如何从 Makefile 中的目标列表创建规则?
How to create rules from list of targets in 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) : $@.tmpl
generate-from-tmpl $<
我怎样才能做到这一点?谢谢。
%: %.tmpl
将尝试将目标 %
与任何目标名称进行匹配,但如果不存在匹配的 %.tmpl
文件,则 make 将完全跳过该目标的该模式。
我相信这正是您想要的。你有什么理由不这么认为吗?
话虽这么说,如果您想更具体地说,您想要的是 Static Pattern Rule:
$(GENERATED_FILES) : % : %.tmpl
generate-from-tmpl $<
仅适用于 $(GENERATED_FILES)
中的文件。
此外,如果您的模板文件只有一个目录,您可以使用:
TEMPLATED_FILES=$(wildcard *.tmpl)
而不是 shell 和 find
(也有递归 make 通配符定义可用,但如果需要,find
是合理的)。
我的项目由一些配置文件组成,它们是从相应的模板生成的。例如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 $<
我怎样才能做到这一点?谢谢。
%: %.tmpl
将尝试将目标 %
与任何目标名称进行匹配,但如果不存在匹配的 %.tmpl
文件,则 make 将完全跳过该目标的该模式。
我相信这正是您想要的。你有什么理由不这么认为吗?
话虽这么说,如果您想更具体地说,您想要的是 Static Pattern Rule:
$(GENERATED_FILES) : % : %.tmpl
generate-from-tmpl $<
仅适用于 $(GENERATED_FILES)
中的文件。
此外,如果您的模板文件只有一个目录,您可以使用:
TEMPLATED_FILES=$(wildcard *.tmpl)
而不是 shell 和 find
(也有递归 make 通配符定义可用,但如果需要,find
是合理的)。