Używanie Make $ (dir) lub $ (notdir) na ścieżce ze spacjami

Używam kodu podobnego do następującego w 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)

Jeśli użyję tego w katalogu bez spacji, powiedzmyspace-test, to działa dobrze:

$ make
TOP='/tmp/space-test'
TARGET='/tmp/space-test/foo'
touch 'foo'

Jeśli jednak użyję go w katalogu ze spacjami, powiedzmyspace test, następnie$(notdir) robi złą rzecz:

TOP='/tmp/space\ test'
TARGET='/tmp/space\ test/foo'
touch 'space foo'

Oto co się dzieje$(notdir) interpretuje/tmp/space test/foo tak jakdwa ścieżki i zwraca „część pliku”obie (to znaczy.,space ifoo). Dziwna część tego jest takaTARGET jest prawidłowo uciekł; jakoś, wewnątrz reguły lub wewnątrz$(notdir), ucieczki odwrotnego ukośnika są ignorowane.

Co ja tu robię źle?

questionAnswers(3)

yourAnswerToTheQuestion