Makefile二次扩展:执行转义函数?

时间:2017-05-09 09:10:43

标签: makefile gnu-make variable-expansion

考虑以下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函数被调用两次(headtail两次都叫两次)。据我所知,先决条件列表扩展了两次。但是在第一次运行中,call仍然被转义,所以这不是我所期望的。

(也许整个方法都存在缺陷,我不应该(ab)首先使用Makefile来完成这类任务。)

1 个答案:

答案 0 :(得分:1)

我不知道为什么$$<会这样扩展。

您可以使用$$*代替您的配置:

%.result: jobs/% $$(strip $$(call get-job,jobs/$$*))
        echo $^

您需要添加strip来电,以便将call结果中嵌入的换行符转换为空格。