【发布时间】:2017-05-09 09:10:42
【问题描述】:
考虑以下生成文件:
.SECONDEXPANSION:
%.result: jobs/% $$(call get-job,$$<)
echo $^
define get-job
$(shell head -n 1 $(1))
$(shell tail -n +2 $(1))
endef
这个想法是jobs/下的每个文件都包含一个文件名列表,应该附加到先决条件列表中。
但是,如果我想从现有文件 jobs/xyz 创建 xyz.result,我会收到以下错误消息:
$ make -n xyz.result
head: cannot open 'xyz.result' for reading: No such file or directory
tail: cannot open 'xyz.result' for reading: No such file or directory
head: cannot open 'xyz.result' for reading: No such file or directory
tail: cannot open 'xyz.result' for reading: No such file or directory
make: *** No rule to make target 'xyz.result'. Stop.
我知道 $$< 没有设置为我想要的,因为它反映了任何先前规则的先决条件列表。
我不明白的是:
- 在我的理解中,
$$<应该评估为空字符串(如第二个子标题下的official doc 中的示例所示)。但是,这里似乎扩展为目标的值(xyz.result)。这是为什么呢? - 似乎
get-job函数被调用了两次(head和tail都叫了两次)。我了解先决条件列表已扩展两次。但在第一次运行中,call仍然被转义,所以这不是我所期望的。
(也许整个方法有缺陷,我不应该(ab)首先使用 Makefile 来完成这类任务。)
【问题讨论】:
标签: makefile gnu-make variable-expansion