Makefile规则中的不同输出

Makefile规则中的不同输出,makefile,newline,Makefile,Newline,在下面的Makefile中 f = echo $(1) t: $(call f,"a \ b"); \ $(call f,"a \ b") 第4行开头只有一个选项卡(第一次调用f) 在行尾没有空格 输出是 a b a b 这两个调用完全相同(除了初始选项卡)。为什么输出不同?我怀疑为什么输出不同的答案是,这是GNU Make的反斜杠换行空格崩溃中的一个小错误。相关代码位于: 我不知道这个代码,但是in和ref指针是以锁步方式运行的,因此

在下面的Makefile中

f = echo $(1)

t:
    $(call f,"a \
        b"); \
    $(call f,"a \
        b")
  • 第4行开头只有一个选项卡(第一次调用f)
  • 在行尾没有空格
输出是

a b
a  b

这两个调用完全相同(除了初始选项卡)。为什么输出不同?

我怀疑为什么输出不同的答案是,这是GNU Make的反斜杠换行空格崩溃中的一个小错误。相关代码位于:

我不知道这个代码,但是
in
ref
指针是以锁步方式运行的,因此将
out
ref
进行比较似乎是错误的。将
out>ref
替换为
out>cmds->command\u lines[i]
可以纠正您的问题,对代码所做的更改可能不是完全错误的

无论这是否是GNU Make bug,对于您的makefile来说,如此密切地依赖于变幻莫测的删除空白并不是一个好主意。如果空格在你的食谱中真的很重要,你可以将其防御性地编码为

f = echo $(strip $(1))

并避免一笔中出现任何问题。

我无法复制您的结果。GNU
make
3.81不复制您的结果(在Mac OS X 10.8.3上使用当前XCode进行测试)。使用GNU make 3.81(在OS X 10.7.5上)和vanilla 3.82复制,在
b之前有9个空格“
第5行;不显示8或更少的问题。我认为这是一个错误。我已经用Git的最新版本尝试过了,但它仍然会发生。。。John的评论很关键:行的开头必须有9个空格,而不是8个。请在Savannah上提交一个错误:是的:问题发生在第5行的n>8个空格处,如果n示例不是真实的,则可以,但只是为了突出我的问题。真正的代码用于mylog子例程,就像我使用传递字符串的
log=echo“`$(now)`[`basename$(MAKE)`($@)]”$(1)>$(logf)
。有时字符串参数很长,我用\@BraMo来打断它。Make文档没有详细描述空格的情况,尤其是在\-转义换行符附近,不同版本的Make可能会有不同的做法——如果您现在报告的这个bug得到修复,那么肯定会有不同的做法。因此,除非您希望日志输出取决于您正在使用的Make版本,否则最好避免使用\(尽管在源代码中这很难看)来平衡长字符串参数,或者将
$(strip$(1))
添加到
日志
子例程中,从而实际避免问题。
f = echo $(strip $(1))