我有一個makefile,其中包括幾個其他的makefile,這反過來又都加一個變量是這樣的:從Makefile變量中刪除項目?
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
現在我想從VAR
變量刪除SomethingElse
。我要用什麼來代替(...)
來做到這一點?
我正在使用GNU Make,而GNU Make特定的解決方案將會很好。
我有一個makefile,其中包括幾個其他的makefile,這反過來又都加一個變量是這樣的:從Makefile變量中刪除項目?
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
現在我想從VAR
變量刪除SomethingElse
。我要用什麼來代替(...)
來做到這一點?
我正在使用GNU Make,而GNU Make特定的解決方案將會很好。
如果您使用GNU Make,則可以使用filter-out
text function。
OTHERVAR := $(filter-out SomethingElse,$(VAR))
在以上正確答案的頂部:
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,從而擴大它。我不明白這是如何打破遞歸或以任何方式存在問題的行爲? –
我可能不清楚我的意思。假設有'BLA1 = bla1',那麼'VAR = $(BLA1)bla2 bla3 bla4 bla5'而不是上面的VAR定義。在過濾後執行'BLA1 + = bla1111'將不會影響VAR的值,因爲它將失去對$(BLA1)值的引用。 –
由於我也有類似的情況,我想添加一個新的答案。在我的情況也有逗號爲變量字符串,並且多了,我想刪除逗號和最後一個字:
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)"
,你肯定我必須使用'='而不是':='? –
取決於你想要什麼。兩者都可能是正確的。 – Mat
在我給出的例子中,兩者都是正確的嗎?如果我使用'=',那麼我會收到一個makefile錯誤,提示有關VAR最終會引用無限遞歸。 ('VAR = $(filter-out SomethingElse,$(VAR))') –