У меня есть make-файл, который включает несколько других make-файлов, которые, в свою очередь, добавляют к такой переменной:
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
Теперь я хочу удалить SomethingElse
из VAR
переменной. Что я для этого положил (...)
?
Я использую GNU Make, и мне подойдет конкретное решение GNU Make.
=
а нет:=
?=
я получаю сообщение об ошибке makefile, в котором говорится, что VAR в конечном итоге ссылается на себя в бесконечной рекурсии. (VAR = $(filter-out SomethingElse,$(VAR))
)VAR := $(filter-out SomethingElse,$(VAR))
(С:=
и не=
). Благодарю. :)VAR := $(filter-out A B C,$(VAR))
.filter-out
работает только со словами, разделенными пробелами. Если вам нужно удалить что-то из строки, не разделенное словами, вы можете использоватьsubst
вместоfilter-out
. Т.е.:$(subst -world,,hello-world)
дала бы результатhello
.В дополнение к правильному ответу выше:
Выход:
VAR: bla1 bla2 bla4 bla5
Обратите внимание, что это нарушает всю «рекурсивность» при выполнении фильтрации, но в вашем случае это может не иметь значения.
источник
BLA1 = bla1
, тоVAR = $(BLA1) bla2 bla3 bla4 bla5
вместо определения VAR выше. ВыполнениеBLA1 += bla1111
после фильтрации не повлияет на значение VAR, так как оно потеряет ссылку на значение $ (BLA1).Так как у меня тоже похожая ситуация, хочу добавить новый ответ. В моем случае в строке переменных также были запятые, и, более того, я хотел удалить запятую и последнее слово:
В этом случае фильтрация не работает (даже в предыдущих ответах, когда нет кавычек)
Мое решение - использовать
subst
:источник