我想使用make的eval函数在 a 中定义几个(动态命名的)变量foreach,但我无法eval完成这项工作。
我试过这样的事情:
$(eval \
var1 = val1 \
var2 = val2 \
)
Run Code Online (Sandbox Code Playgroud)
它不起作用:var1被定义为val1 var2 = val2和var2未定义。这是有道理的,因为我放在\第二行的末尾。但是如果我删除它,eval呼叫将永远不会终止。
我尝试了不同的方法来让这个\只被 看到eval,但没有任何效果。因此问题是:是否可以在同一个eval调用中定义多个变量?
我当然可以打eval两次电话……这是相当好奇。
分隔每个变量定义的是换行符,您用反斜杠将其转义。由于您不能将它直接放在eval函数中,因此您必须定义它并eval像这样使用它:
define newline
endef
Run Code Online (Sandbox Code Playgroud)
然后,如果您将以下几行放在 target 中:
$(eval FOO=abc$(newline)BAR=def)
@echo FOO : $(FOO) BAR : $(BAR)
Run Code Online (Sandbox Code Playgroud)
你会得到这样的结果:
FOO : abc 酒吧 : def
请注意,如果要在第二个变量的定义中使用变量,则必须像这样转义 $ 字符:
$(eval FOO=abc$(newline)BAR=def$$(FOO))
@echo FOO : $(FOO) BAR : $(BAR)
Run Code Online (Sandbox Code Playgroud)
结果最终将是:
FOO : abc BAR : defabc
这是因为在eval实际开始工作之前有第一级解释(这里添加了换行符)但我们希望变量的解释仅在实际eval工作期间发生,当变量被定义时,这就是为什么我们需要一个双 $ 符号。