问题描述
我想要尽可能简单的 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可以提供帮助的真正原因。