que 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 [email protected])'
.PHONY: $(TARGET)
Si utilizo esto en un directorio sin espacios, space-test
decir, que funciona bien:
$ make
TOP='/tmp/space-test'
TARGET='/tmp/space-test/foo'
touch 'foo'
Sin embargo, si lo uso en un directorio con espacios, digo space test
, entonces $(notdir)
hace las cosas mal:
TOP='/tmp/space\ test'
TARGET='/tmp/space\ test/foo'
touch 'space foo'
Lo que sucede aquí es que $(notdir)
interpreta como /tmp/space test/foo
dos caminos y devuelve la "parte de archivos" de tanto (es decir, space
y foo
). La parte extraña de esto es que TARGET
está escapado correctamente; de alguna manera, dentro de la regla o dentro de $(notdir)
, los escapes de la barra invertida se están ignorando.
¿Qué estoy haciendo mal aquí?
Gracias, Ville. Es bastante ridículo que no haya forma de evitar entradas a $ (notdir) excepto a través de este truco (o al menos eso parece). –
Sí. GNU Make realmente podría usar una versión 2 del lenguaje y funciones estándar opcionalmente habilitada (retrocompatible). O tal vez es mejor usar, por ejemplo, SCons o algo con un lenguaje de programación real. –