当我读取android build / core / 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 space> 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
如何制作处理这些空间?他们为什么要合并?
答案 0 :(得分:0)
首先,修复:
something:="a =b c= d e = f"
$(info $(something))
all:
@echo something:${something}
没有 make 合并空格,而是shell。命令行
echo "something:"a =b c= d e = f""
被解释为something:a
=b
c=
d
e
=
f
的列表。当您删除something:${something}
周围的引号时, echo 会收到一个包含嵌入空格的参数。
如果您希望 echo 输出引号,则必须将它们转义:
echo \"something:${something}\"