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?