我在 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
被正确地转义了。不知何故,在 rule 或 inside $(notdir)
,反斜杠转义被忽略了。
我在这里做错了什么?