Usar Make $ (dir) o $ (notdir) en una ruta con espacios
Estoy usando un código similar al siguiente en un 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)
Si uso esto en un directorio sin espacios, digaspace-test
, funciona bien:
$ make
TOP='/tmp/space-test'
TARGET='/tmp/space-test/foo'
touch 'foo'
Sin embargo, si lo uso en un directorio con espacios, digamosspace test
, entonces$(notdir)
hace lo incorrecto:
TOP='/tmp/space\ test'
TARGET='/tmp/space\ test/foo'
touch 'space foo'
Lo que pasa aquí es que$(notdir)
interpreta/tmp/space test/foo
comodos rutas y devuelve la "parte del archivo" deambos (es decir.,space
yfoo
). La parte rara de esto es queTARGET
se escapó adecuadamente; De alguna manera, dentro de la regla o dentro.$(notdir)
, los escapes de barra invertida están siendo ignorados.
¿Qué estoy haciendo mal aquí?