makefile - GNU Make 的多通配符模式规则

标签 makefile design-patterns gnu-make

我想写一些像正则表达式的东西:

SRC:="a.dat.1 a.dat.2"    
$(SRC): %.dat.%: (\\1).rlt.(\\2)    
      dat2rlt $^ $@

以便 a.dat.1 a.dat.2 会给 a.rlt.1 a.rlt.2 .

在 GNU Make 信息页面中,它说“% 只能使用一次”。

在 GNU Make 中是否有一些技巧可以实现这一点?

最佳答案

恐怕您尝试做的事情不可能按照您建议的方式进行,因为 - 正如您已经提到的 - (GNU) make 只允许一个词干 '%',参见 http://www.gnu.org/software/make/manual/make.html#Pattern-Rules :

A pattern rule looks like an ordinary rule, except that its target contains the character ‘%’ (exactly one of them).



没有它,创建这样的“多维”目标是很麻烦的。

解决此问题的一种方法是在命令中(而不是在依赖项列表中)重建依赖项的名称:
SRC := a.dat.1 a.dat.2

all : $(SRC:%=%.dat2rlt)

%.dat2rlt :
    dat2rtl $(word 1,$(subst ., ,$*)).rlt.$(word 2,$(subst ., ,$*)) $*

当然,然而,这样你会失去依赖关系,一旦 rlt 更新,它就不会重建。

我可以看到解决这个问题的唯一方法是明确生成规则:
SRC := a.dat.1 a.dat.2

all : $(SRC)

define GEN_RULE
$1.dat.$2 : $1.rlt.$2
    dat2rtl $$< $$@
endef

$(foreach src,$(SRC),$(eval $(call GEN_RULE,$(word 1,$(subst ., ,$(src))),$(word 3,$(subst ., ,$(src))))))

关于makefile - GNU Make 的多通配符模式规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3745177/

相关文章:

c - 将 .so 文件链接成可执行文件

linux - 如何使用自动工具获得 pretty-print 件

design-patterns - 如何从策略模式的这种使用中移除循环依赖?

makefile - GNU 生成文件 : multiple outputs from single rule + preventing intermediate files from being deleted

linux - 如何在 Makefile 中找到基础架构?

eclipse - GNU Make 增量构建 : Force rebuild of specific file

android - android平台GMP库配置错误

sql - 这是教科书设计模式,还是我发明了一些新东西?

javascript - 将状态从控件发送到框​​架

c++ - Makefile 似乎以错误的顺序编译文件