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'
ここで起こっていることは、が2 つのパスとして$(notdir)
解釈され、両方の「ファイル部分」を返すことです(つまり、と)。これの奇妙な部分は、適切にエスケープされていることです。どういうわけか、ルール内または内で、バックスラッシュのエスケープが無視されています。/tmp/space test/foo
space
foo
TARGET
$(notdir)
ここで何が間違っていますか?