Mam plik makefile, który zawiera kilka innych plików makefile, które z kolei dodają do zmiennej takiej jak ta:
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
Teraz chcę usunąć SomethingElse
ze VAR
zmiennej. Co mam zamiast tego (...)
zrobić?
Używam GNU Make i rozwiązanie specyficzne dla GNU Make będzie w porządku.
=
a nie:=
?=
, otrzymuję błąd makefile, który mówi coś o VAR ostatecznie odnosząc się do nieskończonej rekurencji. (VAR = $(filter-out SomethingElse,$(VAR))
)VAR := $(filter-out SomethingElse,$(VAR))
(Z:=
i nie=
). Dzięki. :)VAR := $(filter-out A B C,$(VAR))
. : .filter-out
działa tylko ze słowami oddzielonymi spacjami. Jeśli chcesz usunąć coś z łańcucha, który nie jest oddzielony słowami, możesz użyćsubst
zamiastfilter-out
. To znaczy:$(subst -world,,hello-world)
dałoby wynikhello
.Oprócz poprawnej odpowiedzi powyżej:
Wyjście:
VAR to: bla1 bla2 bla4 bla5
Zwróć uwagę, że powoduje to przerwanie całej „rekurencyjności” podczas wykonywania filtrowania, ale w twoim przypadku może to nie mieć znaczenia.
źródło
BLA1 = bla1
, wtedyVAR = $(BLA1) bla2 bla3 bla4 bla5
zamiast definicja VAR powyżej. WykonywanieBLA1 += bla1111
po odfiltrowaniu nie będzie miało wpływu na wartość VAR, ponieważ utraci odniesienie do wartości $ (BLA1).Ponieważ ja też mam podobną sytuację, chcę dodać nową odpowiedź. W moim przypadku do zmiennej string były też przecinki, a ponadto chciałem usunąć przecinek i ostatnie słowo:
W tym przypadku filtrowanie nie działa (nawet w poprzednich odpowiedziach, gdy nie ma cudzysłowów)
Moje rozwiązanie to użycie
subst
:źródło