Ich habe ein Makefile, das mehrere andere Makefiles enthält, die wiederum alle zu einer Variablen wie dieser hinzugefügt werden:
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
Jetzt möchte ich SomethingElse
aus der VAR
Variablen entfernen . Was setze (...)
ich dafür ein?
Ich verwende GNU Make und eine GNU Make-spezifische Lösung ist in Ordnung.
=
und nicht:=
?=
erhalte ich einen Makefile-Fehler, der etwas über VAR aussagt und sich schließlich in einer unendlichen Rekursion verweist. (VAR = $(filter-out SomethingElse,$(VAR))
)VAR := $(filter-out SomethingElse,$(VAR))
(Mit:=
und nicht=
). Vielen Dank. :)VAR := $(filter-out A B C,$(VAR))
.filter-out
funktioniert nur bei durch Leerzeichen getrennten Wörtern. Wenn Sie etwas aus einer Zeichenfolge entfernen müssen, die nicht durch Wörter getrennt ist, können Siesubst
stattdessen verwendenfilter-out
. Dh:$(subst -world,,hello-world)
würde das Ergebnis gebenhello
.Oben auf der richtigen Antwort oben:
Ausgabe:
VAR ist: bla1 bla2 bla4 bla5
Beachten Sie, dass dies die gesamte "Rekursivität" unterbricht, wenn das Herausfiltern ausgeführt wird. In Ihrem Fall spielt dies jedoch möglicherweise keine Rolle.
quelle
BLA1 = bla1
, Sie hätten dannVAR = $(BLA1) bla2 bla3 bla4 bla5
anstelle der obigen VAR-Definition. Die AusführungBLA1 += bla1111
nach dem Herausfiltern hat keine Auswirkung auf den Wert von VAR, da die Referenz auf den Wert von $ (BLA1) verloren gegangen ist.Da ich auch eine ähnliche Situation habe, möchte ich eine neue Antwort hinzufügen. In meinem Fall gab es auch Kommas in der variablen Zeichenfolge, und außerdem wollte ich das Komma und das letzte Wort entfernen:
In diesem Fall funktioniert das Herausfiltern nicht (auch nicht in den vorherigen Antworten, wenn keine Anführungszeichen vorhanden sind).
Meine Lösung ist zu verwenden
subst
:quelle