Видалити елемент із змінної Makefile?


84

У мене є make-файл, який включає кілька інших make-файлів, які, в свою чергу, додаються до змінної, як це:

VAR := Something SomethingElse
VAR += SomeOtherThing

(...)

Тепер я хочу видалити SomethingElseзі VARзмінної. Що я ставлю замість (...)цього?

Я використовую GNU Make, і конкретне рішення GNU Make буде чудовим.

Відповіді:


114

Ви можете використовувати функцію filter-outтексту, якщо ви використовуєте GNU Make.

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

І ви впевнені, що я повинен використовувати, =а ні :=?
Bjarke Freund-Hansen

1
Чи правильні обидва варіанти у наведеному мною прикладі? Якщо я використовую, =я отримую помилку make-файлу, кажучи щось про VAR, зрештою, посилаючись на себе в нескінченній рекурсії. ( VAR = $(filter-out SomethingElse,$(VAR)))
Bjarke Freund-Hansen

4
Підсумовуючи лише, причина цього залежить від використання. Але в моєму прикладі правильною відповіддю буде: VAR := $(filter-out SomethingElse,$(VAR)):=і ні =). Дякую. :)
Bjarke Freund-Hansen

13
Примітка: Також може використовуватися на декількох предметах. Наприклад: VAR := $(filter-out A B C,$(VAR)).
контрольна сума

1
Примітка для всіх, хто приходить. filter-outпрацює лише над розділеними космосом словами. Якщо вам потрібно видалити щось із рядка, який не розділений словом, ви можете використовувати substзамість filter-out. Тобто: $(subst -world,,hello-world)дав би результат hello.
Яків

7

Зверху правильної відповіді вище:

VAR = bla1 bla2 bla3 bla4 bla5

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

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

Вихід:
VAR: bla1 bla2 bla4 bla5

Зверніть увагу, що це порушує всю "рекурсивність", коли виконується фільтрація, але це може не мати значення у вашому випадку.


Це не очікувана поведінка? Для початку ви визначаєте VAR нормально, тоді ви відразу встановлюєте TMPVAR, таким чином розширюючи VAR на цьому етапі. Потім ви скидаєте VAR, як правило, для переходу до відфільтрованої версії TMPVAR. І в цільовій цілі ви використовуєте VAR і, таким чином, розширюєте його. Я не бачу, як це порушує рекурсивність чи є якоюсь проблемою поведінки?
Bjarke Freund-Hansen

1
Можливо, мені було незрозуміло, що я мав на увазі. Уявіть собі BLA1 = bla1, то VAR = $(BLA1) bla2 bla3 bla4 bla5замість визначення VAR вище. Виконання BLA1 += bla1111після фільтрації не вплине на значення VAR, оскільки воно втратить посилання на значення $ (BLA1).
Andreas Mikael Bank,

0

Оскільки у мене також подібна ситуація, я хочу додати нову відповідь. У моєму випадку в змінну рядок були також коми, і, більше того, я хотів видалити кому і останнє слово:

VAR = "bla1, bla2"

У цьому випадку фільтрування не працює (навіть у попередніх відповідях, коли немає лапок)

Моє рішення полягає у використанні 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)"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.