在下面的 Makefile
f = echo $(1)
t:
$(call f,"a \
b"); \
$(call f,"a \
b")
- 只有一个 TAB,在第 4 行的开头(第一次调用 f)
- 行尾没有空格
输出是
a b
a b
这两个调用是相同的(初始 TAB 除外)。为什么输出不同?
我怀疑为什么输出不同的答案是这是 GNU Make 的反斜杠换行空格折叠中的一个小错误。相关代码在new_job()
:
/* Discard any preceding whitespace that has
already been written to the output. */
while (out > ref
&& isblank ((unsigned char)out[-1]))
--out;
我不知道这段代码,但是in
andref
指针是同步运行的,所以比较out
起来ref
似乎是错误的。替换out > ref
为out > cmds->command_lines[i]
可以纠正您的问题,并且对代码进行的更改可能不是完全错误的。
无论这是否是 GNU Make 错误,让您的 makefile 如此密切地依赖于变幻莫测的空白删除并不是一个好主意。如果空格在您的配方中确实很重要,则可以将其防御性地编码为
f = echo $(strip $(1))
并避免一下子出现任何问题。