如何在Makefile的shell函数中转义#符号以兼容新旧版本make?
解决Makefile中$(shell)函数跨版本获取#符号的兼容性问题
方法1:用Make内置函数构造(推荐,无需调用shell)
直接借助Make的subst内置函数生成#符号,完全避开shell调用和Make版本带来的兼容性问题:
FOO2 := $(subst x,,x#) $(info FOO2: $(FOO2))
逻辑很简单:把字符串x#中的x替换为空,最终得到#。由于是Make原生的字符串处理逻辑,无论新旧版本,输出结果都是:
FOO2: #
方法2:用printf替代echo(稳定的shell调用方式)
如果必须通过shell获取#,别用echo,换成printf——它的转义行为更统一,不会被Make版本规则干扰:
FOO2 := $(shell printf '#') $(info FOO2: $(FOO2))
追求极致兼容性的话,还可以用#的八进制转义码:
FOO2 := $(shell printf '\043') $(info FOO2: $(FOO2))
这两种写法在新旧Make版本中都会输出FOO2: #,因为printf直接输出目标字符,不会被Make或shell的转义规则打乱。
原写法出现差异的原因
旧版本Make会先解析$(shell)内部的\#,将其转换为#后再传递给shell执行,所以echo '\#'实际等价于echo '#',输出#;而新版本Make会把\#原封不动传给shell,echo '\#'就会直接输出\#,最终导致结果不一致。
内容的提问来源于stack exchange,提问作者Spongman
相关产品推荐
相关产品推荐

