这就是我要做的事情:
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)
答案 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})