2011-09-13 57 views
59

我有一個makefile,其中包括幾個其他的makefile,這反過來又都加一個變量是這樣的:從Makefile變量中刪除項目?

VAR := Something SomethingElse 
VAR += SomeOtherThing 

(...) 

現在我想從VAR變量刪除SomethingElse。我要用什麼來代替(...)來做到這一點?

我正在使用GNU Make,而GNU Make特定的解決方案將會很好。

回答

83

如果您使用GNU Make,則可以使用filter-out text function

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

,你肯定我必須使用'='而不是':='? –

+0

取決於你想要什麼。兩者都可能是正確的。 – Mat

+1

在我給出的例子中,兩者都是正確的嗎?如果我使用'=',那麼我會收到一個makefile錯誤,提示有關VAR最終會引用無限遞歸。 ('VAR = $(filter-out SomethingElse,$(VAR))') –

4

在以上正確答案的頂部:

VAR = bla1 bla2 bla3 bla4 bla5 

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

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

輸出:
VAR是:BLA1 bla2 bla4 bla5

注意,這打破了所有 「遞歸性」 時,過濾出的是執行,但在你的情況下可能無關緊要。

+0

這是不是預期的行爲?首先你正確定義VAR,然後立即設置TMPVAR,從而擴展VAR。然後,您通常會將VAR重置爲引用者到TMPVAR的過濾版本。並在所有目標您使用VAR,從而擴大它。我不明白這是如何打破遞歸或以任何方式存在問題的行爲? –

+0

我可能不清楚我的意思。假設有'BLA1 = bla1',那麼'VAR = $(BLA1)bla2 bla3 bla4 bla5'而不是上面的VAR定義。在過濾後執行'BLA1 + = bla1111'將不會影響VAR的值,因爲它將失去對$(BLA1)值的引用。 –

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)"