¿Eliminar elemento de una variable Makefile?

82

Tengo un archivo MAKE, que incluye varios otros archivos MAKE, que a su vez se agregan a una variable como esta:

VAR := Something SomethingElse
VAR += SomeOtherThing

(...)

Ahora deseo eliminar SomethingElsede la VARvariable. ¿Qué pongo en lugar de (...)hacer esto?

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

Bjarke Freund-Hansen
fuente

Respuestas:

109

Puede usar la filter-outfunción de texto si está usando GNU Make.

OTHERVAR := $(filter-out SomethingElse,$(VAR))
Estera
fuente
¿Y estás seguro que tengo que usar =y no :=?
Bjarke Freund-Hansen
1
¿Ambos son correctos en el ejemplo que di? Si lo uso =, obtengo un error de archivo MAKE que dice algo sobre VAR que eventualmente se refiere a sí mismo en una recursión infinita. ( VAR = $(filter-out SomethingElse,$(VAR)))
Bjarke Freund-Hansen
4
Solo para resumir, la causa depende del uso. Pero en mi ejemplo, la respuesta correcta sería: VAR := $(filter-out SomethingElse,$(VAR)) (Con :=y no =). Gracias. :)
Bjarke Freund-Hansen
12
Nota: También se puede utilizar en varios elementos. Por ejemplo: VAR := $(filter-out A B C,$(VAR)).
suma de comprobación
1
Nota para cualquier otra persona que venga. filter-outsolo funciona con palabras separadas por espacios. Si necesita eliminar algo de una cadena que no esté separada por palabras, puede usar en substlugar de filter-out. Es decir: $(subst -world,,hello-world)daría el resultado hello.
Jacob
6

Encima 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 toda la "recursividad" cuando se ejecuta el filtrado, pero es posible que eso no importe en su caso.

Andreas Mikael Bank
fuente
¿No es este el comportamiento esperado? Primero define VAR normalmente, luego establece inmediatamente TMPVAR expandiendo VAR en este punto. Luego, restablece VAR normalmente para referir a una versión filtrada de TMPVAR. Y en el objetivo todo su uso VAR y así expandirlo. ¿No veo cómo esto rompe la recursividad o es de alguna manera un comportamiento problemático?
Bjarke Freund-Hansen
1
Puede que no haya tenido claro lo que quería decir. Imagínese tener BLA1 = bla1, entonces, en VAR = $(BLA1) bla2 bla3 bla4 bla5lugar de la definición VAR anterior. La ejecución BLA1 += bla1111después del filtrado no tendrá ningún efecto sobre el valor de VAR, ya que habrá perdido su referencia al valor de $ (BLA1).
Andreas Mikael Bank
0

Como también tengo una situación similar, quiero agregar una nueva respuesta. En mi caso, también había comas en la cadena de variables y, además, quería eliminar la coma y la última palabra:

VAR = "bla1, bla2"

En este caso, el filtrado no funciona (ni siquiera en las respuestas anteriores, cuando no hay comillas)

Mi solución es usar 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)"
compensación
fuente