如何从 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 是合理的)。