引号剥离 gnu make $(if ...) 参数

Quotes stripped gnu make $(if ...) argument

GNU make 中关于引号字符的规则是什么?我原以为在大多数情况下,它们只是 make 文件中文本的一部分,通常没有特殊意义。以下简单的 make 文件演示了出现在 $(if ...) 的参数周围的双引号字符被剥离而不是从 $(if) 调用中传递出去。这似乎是错误的,奇怪的是,未转义的引号确实在我一直使用的更复杂的 make 文件中通过。

include gmsl

VAR1  ?= var1_value
VAR2  ?= var2_value1 var2_value2

failquote = $(if $(call ne,$(words $(1)),1),"$(1)",$(1))
passquote = $(if $(call ne,$(words $(1)),1),\"$(1)\",$(1))

TESTFAILQUOTE = $(call failquote,$(VAR2))
TESTPASSQUOTE = $(call passquote,$(VAR2))

quotetest :
    @echo "--->Executing recipe for quotetest"
    @echo VAR2 is $(VAR2)
    @echo TESTFAILQUOTE = $(TESTFAILQUOTE)
    @echo TESTPASSQUOTE = $(TESTPASSQUOTE)

因此输出是:

bash-4.1$ make -f test_quote.mk quotetest
--->Executing recipe for quotetest
TESTFAILQUOTE = var2_value1 var2_value2
TESTPASSQUOTE = "var2_value1 var2_value2"

注意:您需要 Gnu Make 标准库才能使此 make 文件正常工作,$(call ne,...)。在这里找到它:http://gmsl.sourceforge.net/

你误会了。 Make never strips 引号。但是,make 调用 shell 并且 shell 将去除引号。

如果删除 echo 行开头的 @ 标记,您将看到 make 如何调用 shell;你会看到:

echo TESTFAILQUOTE = "var2_value1 var2_value2"
var2_value1 var2_value2
echo TESTPASSQUOTE = \"var2_value1 var2_value2\"
"var2_value1 var2_value2"

如果您 运行 在 shell 提示符下执行相同的 echo 命令,您将得到相同的结果,表明 none 这与 make 有关。