GNU make 下的特殊字符去除

Special character removal under 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' 不幸的是我无法让它以任何其他方式工作。

这里的反斜杠是为了转义 # 符号,因此它不会被 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 调用它,你将得到这个输出:

Version number is '#258'

Parsed version number is 258

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

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

Version number is '#286'

Parsed version number is 286

如您所见,行为完全相同。