GNU make等价于BSD make的$(var:Q)?

时间:2015-06-03 04:59:04

标签: makefile gnu-make bsdmake

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




 :Q引用变量中的每个shell元字符,所以它可以是
通过递归调用make安全传递。
  




如果变量 var 的值为 ab \ c“ d'e $ f ,然后 $(var:Q)扩展为 a \ b \\ c \“d \'e \ $ f (或等价的东西)。这对于将字符串传递给shell非常有用,而不必担心shell会解释任何特殊字符。





GNU make是否具有等效字符?或者我是否必须逃避我自己的特殊角色?




2 个答案:

答案 0 :(得分:1)

GNU make提供了可以帮助解决问题的函数substpatsubst。这些是通用,但开发人员需要更多工作,因为他们无法解决特定的问题。此外,文档没有显示他们使用正则表达式,添加到工作中。

例如,您原则上可以构建一个这样的表达式:

$(subst \\,\\\\,$(subst ",\", $(subst ',\', var)))

有关更多讨论,

答案 1 :(得分:1)

对于 sh 变体,只需将表达式用单引号括起来,将任何嵌入的单引号更改为'"'"'

quote = '$(subst ','"'"',$1)'

用法:

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

脚注:没有办法在单引号内引用任何内容。因此,第二个单引号将关闭引用的表达式。因此,要处理嵌入式单引号,请使用'关闭单引号,添加带引号的单引号"'",启动另一个单引号字符串'