¿Hay alguna manera de hacer que GNU funcione correctamente con nombres de archivo que contienen dos puntos?Escapar dos puntos en nombres de archivo en un Makefile
El problema específico que me encuentro pasa a involucrar una regla de patrón. Aquí hay una versión simplificada que no depende de cortar y pegar caracteres de tabulación:
% make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-redhat-linux-gnu
% cat Makefile
COLON := \:
all: ; true
%.bar: ; cp $< [email protected]
x.bar: x.foo
%.foo: ; touch [email protected]
a$(COLON)b.bar: a$(COLON)b.foo
all: x.bar a$(COLON)b.bar
clean: ; rm -f *.foo *.bar
% make clean
rm -f *.foo *.bar
% make
touch x.foo
cp x.foo x.bar
cp a\:b.bar
cp: missing destination file operand after `a:b.bar'
Try `cp --help' for more information.
make: *** [a\:b.bar] Error 1
Sustitución $ (colon) con un literal: produce exactamente el mismo resultado. Sin la barra invertida, lo hace:
Makefile:6: *** target pattern contains no `%'. Stop.
¡Bastante bien hack! Estoy bien con $ (shell), mi pregunta fue específica para GNU make de todos modos. Supongo que este sería un ejemplo de un "desagradable arreglo temporal de archivos" del que la otra respuesta estaba hablando. Me preocupa un poco lo que sucede en el caso en que lo que "ls" es un marcador de posición para fail y $ (POST) no se ejecuta. Quiero decir, creo que probablemente sea más que correcto porque $ (PRE) es idempotente, ¿no? Y si puede tener @ COLON @ s reales en los nombres de sus archivos, simplemente use un marcador de posición aún más largo y más ridículo, tal vez con una larga secuencia aleatoria incrustada en él .... – zaphod