Makefile GNU make相当于BSD make的美元(var:Q)?

Makefile GNU make相当于BSD make的美元(var:Q)?,makefile,gnu-make,bsdmake,Makefile,Gnu Make,Bsdmake,BSD make有一个:Q变量扩展修饰符,记录如下: :Q Quotes every shell meta-character in the variable, so that it can be passed safely through recursive invocations of make. 如果变量var的值为a b\cd'e$f,那么$var:Q将扩展为a\b\\c\d'e\$f或类似的值。这有助于将字符串传递给shell,而不用担心shell将解释任何特殊字符 G

BSD make有一个:Q变量扩展修饰符,记录如下:

:Q   Quotes every shell meta-character in the variable, so that it can be
     passed safely through recursive invocations of make.
如果变量var的值为a b\cd'e$f,那么$var:Q将扩展为a\b\\c\d'e\$f或类似的值。这有助于将字符串传递给shell,而不用担心shell将解释任何特殊字符


GNU make是否有一个等价物?或者我必须转义我自己的特殊字符吗?

GNU make提供了一些函数和patsubst,可以帮助解决这个问题。这些是更一般的,但是需要开发人员做更多的工作,因为它们不能解决特定的问题。此外,文档没有显示他们使用正则表达式,这增加了工作的难度

例如,原则上,您可以构建如下表达式:

$(subst \\,\\\\,$(subst ",\", $(subst ',\', var)))
更多讨论

对于sh变体,只需将表达式封装在单引号中,将任何嵌入的单引号更改为“”

用法:

$(error [$(call quote,ab'c\ d$$f)])

脚注:在单引号内无法引用任何内容。因此,第二个单引号将关闭引用的表达式。因此,要处理嵌入的单引号,请使用“添加单引号”关闭单引号,然后开始另一个单引号字符串。

我在gnu make手册中看不到任何此类功能,但考虑到make必须支持的平台和外壳的数量,这并不奇怪。因此我必须自己动手。真倒霉
$(error [$(call quote,ab'c\ d$$f)])