2011-09-13 9 views
59

Ho un makefile, che include diverse altre makefile, che a sua volta tutti a creare una variabile in questo modo:Rimuovi elemento da una variabile Makefile?

VAR := Something SomethingElse 
VAR += SomeOtherThing 

(...) 

Ora desidero rimuovere SomethingElse dalla variabile VAR. Cosa devo inserire al posto di (...) per fare questo?

Sto usando GNU Make e GNU Make soluzione specifica andrà bene.

risposta

83

Se si utilizza GNU Make, è possibile utilizzare filter-out text function.

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

e si è sicuri che devo usare '=' e non ':' =? –

+0

Dipende da ciò che vuoi. Entrambi sono potenzialmente corretti. – Mat

+1

Sono entrambi corretti nell'esempio che ho dato? Se uso '=' Ricevo un errore makefile che dice qualcosa su VAR che alla fine si riferisce a se stesso in una ricorsione infinita. ('VAR = $ (filter-out SomethingElse, $ (VAR))') –

4

In cima alla risposta corretta sopra:

VAR = bla1 bla2 bla3 bla4 bla5 

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

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

uscita:
VAR è: BLA1 bla2 bla4 bla5

Si noti che questa si rompe tutto "ricorsività" quando il filtro-out eseguito, ma ciò potrebbe non avere importanza nel tuo caso.

+0

Questo comportamento non è previsto? Firs definisce VAR normalmente, quindi imposta immediatamente TMPVAR espandendo così VAR a questo punto. Quindi resettate VAR normalmente al referrer su una versione filtrata di TMPVAR. E in tutto il tuo target, usa VAR e quindi espanderlo. Non vedo come questo rompa la ricorsività o sia in qualche modo un comportamento problematico? –

+0

Potrei non essere chiaro con quello che intendevo. Immagina di avere 'BLA1 = bla1', quindi' VAR = $ (BLA1) bla2 bla3 bla4 bla5' al posto della definizione VAR sopra. L'esecuzione di 'BLA1 + = bla1111' dopo il filtro non avrà alcun effetto sul valore di VAR, poiché avrà perso il suo riferimento al valore di $ (BLA1). –

0

Come anche io ho una situazione simile, voglio aggiungere una nuova risposta. Nel mio caso c'erano anche le virgole nella stringa variabile e, di più, ho voluto togliere la virgola e l'ultima parola:

VAR = "bla1, bla2" 

In questo caso filtrare non funziona (neanche nelle risposte precedenti, quando non ci sono citazioni)

La mia soluzione è quella di utilizzare 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)" 
Problemi correlati