我使用的是类似于一个Makefile下面的代码:
empty:=
space:= $(empty) $(empty)
path_escape = $(subst $(space),\$(space),$(1))
TOP=$(call path_escape,$(abspath .))
TARGET=$(TOP)/foo
$(info TOP='$(TOP)')
$(info TARGET='$(TARGET)')
all: $(TARGET)
$(TARGET):
touch '$(notdir $@)'
.PHONY: $(TARGET)
如果我用这个在没有空格的目录,说space-test
,它工作正常:
$ make
TOP='/tmp/space-test'
TARGET='/tmp/space-test/foo'
touch 'foo'
但是,如果我在空格的目录使用它,说space test
,然后$(notdir)
做错误的事情:
TOP='/tmp/space\ test'
TARGET='/tmp/space\ test/foo'
touch 'space foo'
这里发生的事情是, $(notdir)
解释/tmp/space test/foo
两个路径,并返回两者 (即的“文件部分” space
和foo
)。 这个怪异的一部分是TARGET
是正确转义; 不知何故,规则或内内$(notdir)
反斜杠逃逸被忽略。
我在做什么错在这里?