Macros gnu make$(if…)参数

Macros gnu make$(if…)参数,macros,makefile,arguments,quotes,strip,Macros,Makefile,Arguments,Quotes,Strip,GNU中关于引号字符的规则是什么?我曾认为,在大多数情况下,它们只是make文件中文本的一部分,通常没有特殊意义。下面的简单make文件演示了$(if…)的参数周围出现的双引号字符将被剥离,而不是从$(if)调用中传递出去。这似乎是错误的,奇怪的是,在我一直使用的一个更复杂的make文件中,未替换的引号确实传递了过来 include gmsl VAR1 ?= var1_value VAR2 ?= var2_value1 var2_value2 failquote = $(if $(cal

GNU中关于引号字符的规则是什么?我曾认为,在大多数情况下,它们只是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"

注意:对于$(call ne,…),您需要Gnu Make标准库才能使这个Make文件工作。在这里找到:

你误解了。永远不要引用。但是,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无关。

您误解了。永远不要引用。但是,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无关。

您误解了。永远不要引用。但是,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无关。

您误解了。永远不要引用。但是,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无关。

这里的实际问题是什么?不知为什么,输出是不正确的吗?MadScientist是对的,这里的问题只是输出缺少引号,因为shell正在剥离它们?问题是我需要输出中的文字引号字符。MadScientist在他/她的帮助下既敏锐又优雅,而且正确-如果引用需要进入“echo”命令,则需要在make变量值中转义。不,在变量值中转义不是答案。答案是引用shell行上的变量展开式,这样shell就不会将它们剥离。为了记录在案,gmsl等的包含在这里对我来说是非常混乱的问题,应该完全忽略。@EtanReisner:事实上这是答案,因为所讨论的shell实际上是$(shell…),所以我没有机会逃到那里。我遗漏了这一部分来解决这个问题,正如你所指出的,出于同样的原因,我应该遗漏gmsl的使用。这里的实际问题是什么?不知为什么,输出是不正确的吗?MadScientist是对的,这里的问题只是输出缺少引号,因为shell正在剥离它们?问题是我需要输出中的文字引号字符。MadScientist在他/她的帮助下既敏锐又优雅,而且正确-如果引用需要进入“echo”命令,则需要在make变量值中转义。不,在变量值中转义不是答案。答案是引用shell行上的变量展开式,这样shell就不会将它们剥离。为了记录在案,gmsl等的包含在这里对我来说是非常混乱的问题,应该完全忽略。@EtanReisner:事实上这是答案,因为所讨论的shell实际上是$(shell…),所以我没有机会逃到那里。我遗漏了这一部分来解决这个问题,正如你所指出的,出于同样的原因,我应该遗漏gmsl的使用。这里的实际问题是什么?不知为什么,输出是不正确的吗?MadScientist是对的,这里的问题只是输出缺少引号,因为shell正在剥离它们?问题是我需要输出中的文字引号字符。MadScientist在他/她的帮助下既敏锐又优雅,而且正确-如果引用需要进入“echo”命令,则需要在make变量值中转义。不,在变量值中转义不是答案。答案是引用shell行上的变量展开式,这样shell就不会将它们剥离。为了记录在案,gmsl等的包含在这里对我来说是非常混乱的问题,应该完全忽略。@EtanReisner:事实上这是答案,因为所讨论的shell实际上是$(shell…),所以我没有机会逃到那里。我遗漏了这一部分来解决这个问题,正如你所指出的,出于同样的原因,我应该遗漏gmsl的使用。这里的实际问题是什么?不知为什么,输出是不正确的吗?MadScientist是对的,这里的问题只是输出缺少引号,因为shell正在剥离它们?问题是我需要输出中的文字引号字符。MadScientist在他/她的帮助下既敏锐又优雅,而且正确-如果引用需要进入“echo”命令,则需要在make变量值中转义。不,在变量值中转义不是答案。答案是在shell行中引用变量展开式,这样shell就不会将它们剥离。为了记录在案,这里包含了gmsl等内容,这就大大混淆了fa的问题