用于渲染模板的简单 makefile

问题描述

我想要尽可能简单的 Makefile,因此使用 make(无参数)将呈现当前目录中的所有 *.erb 模板,并删除模板扩展名。这是我目前想到的:

INPUTS = $(wildcard *.erb)
all: $(INPUTS:.erb=)

%: %.erb
    cp  $@ $@.old 2>/dev/null || true
    erb  -T - $< > $@

为什么不只是目标符号独立工作或例如all: $($(wildcard *.erb):.erb=)?
有没有办法实现这个更短/更优雅?

解决方法

$($(wildcard *.erb):.erb=) 这样的东西不起作用,因为 $(...:...) 格式是 variable 替换,而不是 string 替换。换句话说,: 左侧的内容是要展开的变量的名称,而不是字符串。

因此 $($(wildcard *.erb):...) 将首先运行通配符并替换结果,然后将其视为要替换的变量的名称。显然没有具有该名称的变量,因此它扩展为空字符串。

如果您不想要 INPUTS 变量,您可以使用 basename 函数:

all: $(basename $(wildcard *.erb))

至于它是否“更优雅”,那是旁观者的眼睛,因此并不是SO可以提供帮助的真正原因。