带有空格的Makefile字符串

问题描述 投票:0回答:2
var := 'C:/some/path here' labas
all:
    @echo $(words $(var))

这将返回

3
。 如何让它返回
2
?或者 make 并不像我想象的那样工作??

makefile gnu-make
2个回答
2
投票

如果您认为 make 对任何类型的引号有兴趣,那么 Make 绝对不会按照您的想法工作:)。 Make 在几乎所有情况下都会忽略(即像其他字符一样对待普通字符)单引号和双引号字符,并且所有 make 函数都可以在简单的空白分隔符中工作,而不考虑引号字符。

一般来说,在目标名称中需要空格的任何系统中使用 make 是不切实际的。它就是行不通:太多的 make 都是基于空格作为分隔符,并且没有通用的方法来转义到处都可以使用的空格。

在你的特殊情况下,你可以玩这样的把戏:

E :=
S := $E $E

path := C:/some/path here
xpath := $(subst $S,^,$(path))

var := $(xpath) labas
all:
        @echo $(words $(var))
        @echo $(subst ^,$S,$(var))

基本上,这会创建一个包含空格的变量

$S
,然后用其他非空格字符替换变量
path
中的所有空格(这里我选择了
^
,但你可以选择你喜欢的,只需请注意,它必须是保证不会出现在路径中的字符)。

现在该路径不包含空格,因此您可以将其与 make 函数一起使用。

这有一个主要缺点:不仅这里可见的复杂性,而且请注意这些路径不能在目标名称中使用,因为它们实际上并不存在于磁盘上。

一般来说,您不应该在 make 中使用包含空格的路径。如果您必须使用包含空格的路径,那么 make 很可能不是您使用的正确工具。


0
投票

您必须转义 Makefile 上的空格,引用不起作用。示例:

INVOICE_DATE = April\ 25,\ 2024

report.tex:
    sed -e "s/@INVOICE_DATE@/$(INVOICE_DATE)/g" report.tex.in > report.tex

© www.soinside.com 2019 - 2024. All rights reserved.