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/
答案 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无关。