引号剥离 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 有关。
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 有关。