2016-09-19 56 views
0

因爲我使用一個名爲VERSION_NUMBER一個變量,它是從構建環境在下面的表格通過我的make文件:GNU下的特殊字符去除使

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」,不幸的是我不能讓它在任何其他西澳工作年。

+0

我不明白到底什麼是你的問題。看來你已經有了一個可行的解決方案。無論如何,如果你想'make'不要解釋一個'#'符號,用反斜槓轉義它是正確的解決方案,所以我不會搜索其他東西。 – Tim

+0

問題是構建系統提供了一個字符串並且未經轉義的'#'。但是,我提出的解決方案使用了一個轉義的'#'。因此,如果有可能,問題就變成在makefile中將未轉義的輸入字符串('#258'')修改爲轉義字符(''\#258'')? – scorpGoku

+0

現在你想添加反斜槓?爲什麼要添加它?看到我的答案,從外部輸入的行爲將與在Makefile中聲明的變量相同。 – Tim

回答

0

反斜線這裏逃出#符號,以便它不是由make解釋。我看不出你的問題在哪裏,因爲在你的情況下,它不會出現在你的字符串中。

反正你已經持有的解決方案,適用於在Makefile以及來自呼叫來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

如何看backsl灰消失了。

現在,如果你把它與make all VERSION_NUMBER='#286'你會有這樣的輸出:

版本號爲 '#286'

解析的版本號是286

正如你可以看到它的完全一樣的行爲。

+0

請原諒我的天真,但是如果我發送以下命令,它也可以工作:'make all VERSION_NUMBER ='#286'' – scorpGoku

+0

你說的是完全正確的。也許我沒有正確地構建我的問題 – scorpGoku

+0

對不起,我忘了''和'#'符號。我添加了它,所以是的,它的工作原理。 – Tim