Make: 如何转义 $(addprefix) 中的空格?

Make: How to escape spaces in $(addprefix)?

这是我正在尝试做的事情:

EXTRA_INCLUDE_PATHS = ../dir1/path with spaces/ \
                      ../dir2/other path with spaces/
CPPFLAGS += $(addprefix -I,$(EXTRA_INCLUDE_PATHS))

我想得到“-I../dir1/path with spaces/ […]”,但我得到的是:“-I../dir/path -Iwith -Ispaces/ […]”。

如何在 addprefix 中分配空格?我试过这个技巧,但它产生了相同的结果:

space  =
space +=
#produces “-Isome -Ipath”
CPPFLAGS += $(addprefix -I,some$(space)path)

别这样!正如@MadScientist 指出的那样,除非您想非常难过,否则您需要避开 makefile 中所有包含 space 的文件名。 space 是一个列表分隔符(包括在目标列表中),而且没有办法解决这个问题。在你的文件系统中使用符号链接来避免它们! (mklink on windows,或使用 cygwin make 来理解 cygwin 符号链接)。

也就是说,在当前情况下(您没有定义目标列表,而只是包含目录的列表),您可以使用单个字符来表示 space,只翻译它就在最后。

EXTRA_INCLUDE_PATHS = ../dir1/path|with|spaces/ ../dir2/other|path|with|spaces/
CPPFLAGS += $(subst |, ,$(patsubst %,-I'%',${EXTRA_INCLUDE_PATHS}))

查看结果:

$(error [${CPPFLAGS}])

给出Makefile:3: *** [-I'../dir1/path with spaces/' -I'../dir2/other path with spaces/']. Stop.。此处,$CPPFLAGS 采用 sh 格式——space 被 ' 引用,以便编译器将每个 -I 视为单个参数。 make根本就没有这个级别的引用

如果您所有的包含目录都以相同的字符序列开头,您可以利用此与替换命令一起使用:

CPPFLAGS += $(subst  ..,-I ..,$(EXTRA_INCLUDE_PATHS))

检查结果:

$(info  ${CPPFLAGS})

(这是@bobbogo 回答的一个略有不同(可能更优雅)的版本)

如果用反斜杠转义spaces(\ ),可以用管道符号(|)代替转义的space,加上前缀然后撤消替换操作:

EXTRA_INCLUDE_PATHS = ../dir1/path\ with\ spaces/ ../dir2/other\ path\ with spaces/
CPPFLAGS += $(subst |,\ ,$(addprefix -I,$(subst \ ,|,${EXTRA_INCLUDE_PATHS})))