當我讀機器人構建/核心/ 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
如何使流程這些空間?他們爲什麼合併?
由於幾乎似乎總是如此,再次有人從自己隱藏的關鍵信息。當你不明白配方如何工作時,你應該始終做的第一件事是從命令行刪除'@'。更好的辦法是先不要添加它們,至少在你的makefile工作正常之前。 Make會向你展示_exactly_它會調用什麼命令,如果你願意,並且檢查它會經常告訴你你的問題在哪裏。 – MadScientist
謝謝!刪除「@」可以使事情清楚。但爲了使腳本在上面,如何解釋subst行爲? – PhilipW
對不起,但我不明白「subst行爲」的問題。我會說,通常make空格_after_逗號被刪除,而參數之後和逗號之前的空格被保存在參數中。也許這會回答你的問題;如果不是,你必須重寫它以使其更清晰(對我來說,無論如何)。 – MadScientist