Makefile変数からアイテムを削除しますか?


82

私はmakefileを持っていますが、これには他のいくつかのmakefileが含まれており、これらはすべて次のような変数に追加されます。

VAR := Something SomethingElse
VAR += SomeOtherThing

(...)

ここでSomethingElseVAR変数から削除したいと思います。これを行う代わりに何を置き(...)ますか?

私はGNUMakeを使用していますが、GNUMake固有のソリューションで問題ありません。

回答:


109

GNU Makeを使用している場合は、filter-outテキスト関数を使用できます。

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

そして、あなたは私が使用=しなければならないと確信してい:=ますか?
Bjarke Freund-Hansen 2011

1
私が与えた例では両方とも正しいですか?使用する=と、VARについて何かが最終的に無限再帰で自分自身を参照しているというmakefileエラーが発生します。(VAR = $(filter-out SomethingElse,$(VAR))
Bjarke Freund-Hansen 2011

4
要約すると、原因は使用法によって異なります。しかし、私の例では、正しい答えは次のようになります。VAR := $(filter-out SomethingElse,$(VAR)) (で:=はありません=)。ありがとう。:)
Bjarke Freund-Hansen 2011

12
注:複数のアイテムにも使用できます。例:VAR := $(filter-out A B C,$(VAR))
チェックサム

1
他の人が一緒に来ることに注意してください。filter-outスペースで区切られた単語でのみ機能します。単語で区切られていない文字列から何かを削除する必要がある場合は、のsubst代わりに使用できますfilter-out。すなわち:$(subst -world,,hello-world)結果を与えるだろうhello
ジェイコブ

6

上記の正解に加えて:

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 2016

1
何を言っているのかわからなかったかもしれません。上記のVAR定義の代わりに、を持っているBLA1 = bla1と想像してくださいVAR = $(BLA1) bla2 bla3 bla4 bla5BLA1 += bla1111フィルタアウト後に実行しても、$(BLA1)の値への参照が失われるため、VARの値には影響しません。
アンドレアスミカエル銀行

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)"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.