gnu-make:我应该引用ifeq语句的内容吗?

时间:2012-07-03 12:03:58

标签: makefile gnu-make

我最近遇到过这个结构:

ifneq ("$(findstring needle, $(HAYSTACK))", "")
  do_some_stuff
endif

引号是否真的有用,或者我可以安全地省略它们吗?

修改

刚发现:ifeq ("a b ", "a b ")的行为与ifeq (a b , a b )

不同

第一个匹配,而不是第二个匹配。所以报价确实很重要。现在问题是为什么。

2 个答案:

答案 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␣ba␣b␣

答案 1 :(得分:0)

我会站出来说:

它们等同于什么,你可以安全地省略它们。

(现在看看GNUMake的创建者出现,并说如果你在HAYSTACK包含双重转义的unicode Sanscrit三重引号时尝试,那么你的处理器会着火。)

修改:
该死,该死,该死!
他们确实很重要。试着玩HAYSTACK := $(shell echo bang)。你最好有一个方便的灭火器。