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})))
这是我正在尝试做的事情:
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})))