0

在下面的 Makefile

f = echo $(1)

t:
    $(call f,"a \
        b"); \
    $(call f,"a \
        b")
  • 只有一个 TAB,在第 4 行的开头(第一次调用 f)
  • 行尾没有空格

输出是

a b
a  b

这两个调用是相同的(初始 TAB 除外)。为什么输出不同?

4

1 回答 1

0

我怀疑为什么输出不同的答案是这是 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;

我不知道这段代码,但是inandref指针是同步运行的,所以比较out起来ref似乎是错误的。替换out > refout > cmds->command_lines[i]可以纠正您的问题,并且对代码进行的更改可能不是完全错误的。

无论这是否是 GNU Make 错误,让您的 makefile 如此密切地依赖于变幻莫测的空白删除并不是一个好主意。如果空格在您的配方中确实很重要,则可以将其防御性地编码为

f = echo $(strip $(1))

并避免一下子出现任何问题。

于 2013-05-21T11:02:42.773 回答