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

时间:2015-04-01 19:54:11

标签: makefile gnu-make

这就是我要做的事情:

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)

3 个答案:

答案 0 :(得分:2)

不要这样做!正如@MadScientist指出的那样,你需要在makefile中避开所有包含空格的文件名,除非你想要非常伤心。空格是一个列表分隔符(包括在目标列表中),并且没有办法解决这个问题。在文件系统中使用符号链接来避免它们! (在窗口上 mklink ,或使用了解cygwin符号链接的cygwin make )。

也就是说,在当前的情况下(你没有定义目标列表,只是列出包括dirs的列表),你可以使用一个字符来表示一个空格,只在结尾处进行翻译。 / p>

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 格式 - 空格引用',以便编译器将每个-I视为单个参数。 make 根本就没有这种级别的引用。

答案 1 :(得分:1)

(这与@bobbogo的答案稍有不同(也许更优雅))

如果您使用反斜杠(\ )来转义空格,则可以用管道符号(|)来替换转义的空格,添加前缀,然后撤消替换操作:

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

答案 2 :(得分:0)

如果所有包含目录都以相同的字符序列开头,则可以将其用于替代命令:

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

使用以下方法检查结果:

$(info  ${CPPFLAGS})