如何在没有空格的makefile中跨行分隔字符串?

时间:2014-01-20 23:21:49

标签: makefile gnu-make

在makefile中,使用\转义换行允许在多个源行中拆分单行长字符串内容。但是,新线被替换为空格。源中是否存在透明换行符,不会影响字符串内容?

VAR=w\
o\
r\
d

all:
    echo $(VAR)

所需的输出为'word',但实际输出为'w o r d'。

2 个答案:

答案 0 :(得分:9)

昨天刚刚问到这个问题:How can I break a variable definition across multiple lines in a Makefile without spaces?

简短的回答是否定的,没有办法做到这一点。这个行为是make的POSIX标准所必需的。

您所能做的就是尝试对字符串进行后处理以使用$(subst ...)或类似内容删除空格。

答案 1 :(得分:4)

最简单的解决方案是使用$\<newline>拆分 line(至少如果你使用的是GNU Make):

VAR = w$\
      o$\
      r$\
      d

all:
    echo $(VAR)

输出为“word”,没有空格。这是因为GNU Make将用单个替换反斜杠 - 换行符 - 空格 空格,使VAR的作业相当于:

VAR = w$ o$ r$ d

https://www.gnu.org/software/make/manual/html_node/Reference.html#Reference: “一个美元符号后跟一个美元符号以外的字符, 开括号或开括号将单个字符视为 变量名。“所以$<space>对是扩展的 名称为单个空格字符的变量。从此 默认情况下未定义变量,它将扩展为空 字符串。

请注意,变量VAR仍将包含 $<space>对,直到它被扩展。大多数时候,这个 没关系,但如果你的makefile依赖于使用 $(value VAR)处理基础(未扩展)值, 上述技术可能会提供令人惊讶的结果。

对于其他想法,请在此处查看我对类似问题的回答: How can I break a variable definition across multiple lines in a Makefile without spaces?

可以在中找到对延续线选项的更长时间处理 我的文章“GNU Make line continuations”: http://drmikehenry.com/gnu-make-line-continuations/