GNU下的特殊字符删除

时间:2016-09-19 09:47:54

标签: makefile gnu-make

对于我的make文件,我使用名为VERSION_NUMBER的变量,该变量以下列形式从构建环境传递:

VERSION_NUMBER = '#258'

现在,我希望从make下的字符串中提取数字258,但由于特殊字符“#”,我无法这样做。

我尝试了以下内容并且它有效(现在假设该变量在makefile中本地定义,而不是从构建环境传递):

VERSION_NUMBER:='\#258'

empty:=
quote:='
space:= $(empty) $(empty)
pound:=\#

extract:= $(subst $(quote),$(empty),$(VERSION_NUMBER))
$(info $$extract is [${extract}]) # Debug print

extract:= $(subst $(pound),$(empty),$(extract))
$(info $$extract is [${extract}]) # Debug print

这打印出以下内容:

$extract is [#258]
$extract is [258]

然而问题是,我在这里使用VERSION_NUMBER作为'\#258'而不是'#258',不幸的是我无法得到它以任何其他方式工作。

1 个答案:

答案 0 :(得分:0)

反斜杠用于转义#符号,因为make不解释它。我不知道你的问题在哪里,因为在你的情况下它不会出现在你的字符串中。

无论如何,你已经拥有了解决方案,该解决方案适用于Makefile中声明的var以及来自make调用的var。唯一的区别是,在Makefile中你必须转义#字符。

采用这个简单的Makefile:

VERSION_NUMBER:='\#258'
pattern:=\#

# Remove the quotes and the hash symbol
PARSED_VERSION_NUMBER = $(subst ',,$(subst $(pattern),,$(VERSION_NUMBER)))

all: 
    @echo Version number is $(VERSION_NUMBER)
    @echo Parsed version number is $(PARSED_VERSION_NUMBER)

如果您使用make all调用它,您将获得此输出:

  

版本号是'#258'

     

解析版本号为258

看看反斜杠是如何消失的。

现在,如果您使用make all VERSION_NUMBER='#286'调用它,您将获得此输出:

  

版本号是'#286'

     

解析版本号为286

正如您所看到的那样,行为完全相同。