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
如您所见,行为完全相同。
对于我的 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
如您所见,行为完全相同。