2017-03-08 28 views
1

當我讀機器人構建/核心/ definitions.mk功能崩解對生成文件中,我發現我無法理解下面空間進程的邏輯:makefile,爲什麼字符串中的空格被合併?

define collapse-pairs 
$(eval _cpSEP := $(strip $(if $(2),$(2),=)))\ 
$(subst $(space)$(_cpSEP)$(space),$(_cpSEP),$(strip \ 
    $(subst $(_cpSEP), $(_cpSEP) ,$(1)))) 
endef 

$(subst $(_cpSEP), $(_cpSEP) ,$(1)),「A = B 「應改爲 」a = < 2 spaces> b「,然後在$(subst $(space)$(_cpSEP)$(space),$(_cpSEP),...)處,應該將其替換回來。但實際上,它變成了「a = b」,在字符串中看起來兩個空格被自動併入了 。

調查過程中,我發現以下奇怪的事情:

$ cat test-1.mk 
something:="a =b c=  d e = f" 
$(info $(something)) 
all: 
     @echo "something:${something}" 

$ make -f test-1.mk 
"a =b c=  d e = f" 
something:a =b c= d e = f 

如何使流程這些空間?他們爲什麼合併?

+1

由於幾乎似乎總是如此,再次有人從自己隱藏的關鍵信息。當你不明白配方如何工作時,你應該始終做的第一件事是從命令行刪除'@'。更好的辦法是先不要添加它們,至少在你的makefile工作正常之前。 Make會向你展示_exactly_它會調用什麼命令,如果你願意,並且檢查它會經常告訴你你的問題在哪裏。 – MadScientist

+0

謝謝!刪除「@」可以使事情清楚。但爲了使腳本在上面,如何解釋subst行爲? – PhilipW

+0

對不起,但我不明白「subst行爲」的問題。我會說,通常make空格_after_逗號被刪除,而參數之後和逗號之前的空格被保存在參數中。也許這會回答你的問題;如果不是,你必須重寫它以使其更清晰(對我來說,無論如何)。 – MadScientist

回答

0

第一,修復:

something:="a =b c=  d e = f" 
$(info $(something)) 
all: 
    @echo something:${something} 

這不是使該合併的空間,而是外殼。命令行

echo "something:"a =b c=  d e = f"" 

被解釋爲的something:a=bc=de=f列表。當您刪除引號something:${something}時,echo收到一個帶有嵌入空格的參數。

如果你想呼應輸出引號,則必須對其進行轉義:

echo \"something:${something}\" 
+0

謝謝,這確實解釋了腳本的行爲,對於這個問題呢?我如何驗證它? – PhilipW

+0

我不明白你想用'$(subst)'達到什麼目的。可能你選擇了錯誤的錘子。 –

相關問題