var := 'C:/some/path here' labas
all:
@echo $(words $(var))
这将返回
3
。
如何让它返回2
?或者 make 并不像我想象的那样工作??
如果您认为 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 很可能不是您使用的正确工具。
您必须转义 Makefile 上的空格,引用不起作用。示例:
INVOICE_DATE = April\ 25,\ 2024
report.tex:
sed -e "s/@INVOICE_DATE@/$(INVOICE_DATE)/g" report.tex.in > report.tex