考虑以下makefile:
.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来完成这类任务。)
答案 0 :(得分:1)
我不知道为什么$$<
会这样扩展。
您可以使用$$*
代替您的配置:
%.result: jobs/% $$(strip $$(call get-job,jobs/$$*))
echo $^
您需要添加strip
来电,以便将call
结果中嵌入的换行符转换为空格。