2011-09-13 15 views
59

que tienen un makefile, que incluye varios otros archivos make, que a su vez se suman a una variable de la siguiente manera:¿Eliminar el elemento de una variable Makefile?

VAR := Something SomethingElse 
VAR += SomeOtherThing 

(...) 

Ahora desea eliminar SomethingElse de la variable VAR. ¿Qué debo poner en lugar de (...) para hacer esto?

Estoy usando GNU Make, y una solución específica de GNU Make estará bien.

Respuesta

83

Puede usar el filter-out text function si está utilizando GNU Make.

OTHERVAR := $(filter-out SomethingElse,$(VAR)) 
+0

y está seguro de que tengo que usar '=' 'no: ='? –

+0

Depende de lo que quieras. Ambos son potencialmente correctos. – Mat

+1

¿Ambos son correctos en el ejemplo que di? Si uso '=' obtengo un error en el archivo MAKE diciendo algo sobre VAR que finalmente se refiere a sí mismo en una recursión infinita. ('VAR = $ (filter-out SomethingElse, $ (VAR))') –

4

En la parte superior de la respuesta correcta arriba:

VAR = bla1 bla2 bla3 bla4 bla5 

TMPVAR := $(VAR) 
VAR = $(filter-out bla3, $(TMPVAR)) 

all: 
    @echo "VAR is: $(VAR)" 

Salida:
VAR es: BLA1 bla2 bla4 bla5

Tenga en cuenta que esto rompe todos "recursividad" cuando el filtro de salida es ejecutado, pero eso podría no importar en su caso.

+0

¿No se espera este comportamiento? Primero, define VAR normalmente, luego establece inmediatamente TMPVAR expandiendo VAR en este punto. Luego restablece VAR normalmente a referrer a una versión filtrada de TMPVAR. Y en todos los objetivos, use VAR y, por lo tanto, amplíelo. No veo cómo esto rompe la recursividad o es de alguna manera un comportamiento problemático? –

+0

Pude haber estado claro con lo que quise decir. Imagine tener 'BLA1 = bla1', luego' VAR = $ (BLA1) bla2 bla3 bla4 bla5' en lugar de la definición de VAR anterior. Ejecutar 'BLA1 + = bla1111' después del filtrado no tendrá efecto sobre el valor de VAR, ya que habrá perdido su referencia al valor de $ (BLA1). –

0

Como también tengo una situación similar, quiero agregar una nueva respuesta. En mi caso también hubo comas en la cadena variable y, más, quería sacar la coma y la última palabra:

VAR = "bla1, bla2" 

En este caso filtrar los que no funciona (ni siquiera en las respuestas anteriores, cuando no hay comillas)

Mi solución es utilizar subst:

VAR = "bla1, bla2" 

TTT = , bla2 
TMPVAR := $(VAR) 
SUBST = $(subst $(TTT),, $(TMPVAR)) 
FILT = $(filter-out $(TTT), $(TMPVAR)) 

subst: 
    @echo "subst : $(SUBST)" 

filter: 
    @echo "filter-out : $(FILT)" 
Cuestiones relacionadas