Pregunta

¿Hay una manera de conseguir GNU make para funcionar correctamente con los nombres de archivo que contienen dos puntos?

El problema específico que estoy corriendo en pasa a implicar una regla de patrón. Aquí hay una versión simplificada que no depende de los caracteres de tabulación cortar y pegar:

% 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 $< $@
x.bar: x.foo
%.foo: ; touch $@
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, se hace lo siguiente:

Makefile:6: *** target pattern contains no `%'.  Stop.
¿Fue útil?

Solución

El siguiente truco funcionó para mí, aunque lamentablemente se basa en $ (shell).

# modify file names immediately
PRE := $(shell rename : @COLON@ *)
# example variables that I need
XDLS = $(wildcard *.xdl)
YYYS = $(patsubst %.xdl,%.yyy,$(XDLS))
# restore file names later
POST = $(shell rename @COLON@ : *)

wrapper: $(YYYS)
    @# restore file names
    $(POST)

$(YYYS):
    @# show file names after $(PRE) renaming but before $(POST) renaming
    @ls

Debido PRE se asigna con: =, su comando shell asociado se ejecuta antes de que se evaluó la variable xDLS. La clave es luego poner los dos puntos en su lugar después de los hechos invocando explícitamente $ (POST).

Otros consejos

Dudo que sea posible: ver esta discusión acerca dos puntos en Makefile . En resumen, GNU make nunca ha funcionado bien con los nombres de archivo que contienen espacios en blanco o dos puntos. El mantenedor, Paul D. Smith, dice que la adición de soporte para escapar tendería a noreferrer romper archivos MAKE existentes . Además, la adición de dicho apoyo requeriría cambios significativos en el código.

Usted puede ser capaz de trabajar en torno a algún tipo de acuerdo de archivo temporal desagradable.

Buena suerte!

Hay otra manera que he encontrado hoy, cuando se trabaja con variables que definen los nombres de fichero Makefile (que contiene dos puntos).

# definition
SOME_FNAME = $(NAME)__colon__$(VERSION)

# usage in target
foo:
    $(do_something) $(subst __colon__,:,$(SOME_FNAME))

No estoy positivie esto debería funcionar, pero la razón por la que dice "falta archivo de destino" es simple:

%.bar: ; cp $< $@

Esa línea dice que copiar el objetivo de la primero dependencia. eres un: b.bar no tiene cualquier dependencia, por lo que el cp falla. ¿qué quieres que copiar? R: b.foo? en ese caso, sería necesario:

%.bar: %.foo ; cp $< $@
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top