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

时间:2015-02-17 16:29:01

标签: macros makefile arguments quotes strip

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 Standard库来使这个make文件工作,$(call ne,...)。在此处找到它:http://gmsl.sourceforge.net/

1 个答案:

答案 0 :(得分:3)

你误会了。永远不要剥离报价。但是,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命令,你将得到相同的结果,表明这些都与make无关。