我最近遇到过这个结构:
ifneq ("$(findstring needle, $(HAYSTACK))", "")
do_some_stuff
endif
引号是否真的有用,或者我可以安全地省略它们吗?
修改
刚发现:ifeq ("a b ", "a b ")
的行为与ifeq (a b , a b )
第一个匹配,而不是第二个匹配。所以报价确实很重要。现在问题是为什么。
答案 0 :(得分:3)
Humph,更糟糕的文档make及其简单的解析。这看起来类似于make parses变量赋值的方式。因此,使用␣
作为空格
VAR␣␣:=␣␣␣hello␣␣there␣
将hello␣␣there␣
分配给${VAR}
。 :=
周围的空格被剥离,但其他任何空格都没有。我们本来可以写的
VAR:=hello␣␣there␣#Pithy␣comment
并取得了同样的结果。
同样,在,
语句中的ifeq
周围删除了空格。
ifeq ("a b ", "a b ")
比较两个文字字符串"a␣b␣"
(是的,"
字符构成了比较文本的一部分)。知道了这一点,我们发现逗号两边的第一个非空格很重要。我们可以写
ifeq␣(!␣a␣b␣:␣␣␣,␣!␣a␣b␣:)
成功比较了两个!␣a␣b␣:
字符串。
P.S。这解释了ifeq (a b , a b )
失败的原因。它会尝试比较a␣b
和a␣b␣
。
答案 1 :(得分:0)
我会站出来说:
它们等同于什么,你可以安全地省略它们。
(现在看看GNUMake的创建者出现,并说如果你在HAYSTACK
包含双重转义的unicode Sanscrit三重引号时尝试,那么你的处理器会着火。)
修改:
该死,该死,该死!他们确实很重要。试着玩HAYSTACK := $(shell echo bang)
。你最好有一个方便的灭火器。