makefile,为什么字符串中的空格被合并?

时间:2017-03-08 08:47:58

标签: android makefile build

当我读取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

如何制作处理这些空间?他们为什么要合并?

1 个答案:

答案 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}\"