私はmakefileを持っていますが、これには他のいくつかのmakefileが含まれており、これらはすべて次のような変数に追加されます。
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
ここでSomethingElse
、VAR
変数から削除したいと思います。これを行う代わりに何を置き(...)
ますか?
私はGNUMakeを使用していますが、GNUMake固有のソリューションで問題ありません。
私はmakefileを持っていますが、これには他のいくつかのmakefileが含まれており、これらはすべて次のような変数に追加されます。
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
ここでSomethingElse
、VAR
変数から削除したいと思います。これを行う代わりに何を置き(...)
ますか?
私はGNUMakeを使用していますが、GNUMake固有のソリューションで問題ありません。
回答:
GNU Makeを使用している場合は、filter-out
テキスト関数を使用できます。
OTHERVAR := $(filter-out SomethingElse,$(VAR))
=
と、VARについて何かが最終的に無限再帰で自分自身を参照しているというmakefileエラーが発生します。(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 bla3 bla4 bla5
TMPVAR := $(VAR)
VAR = $(filter-out bla3, $(TMPVAR))
all:
@echo "VAR is: $(VAR)"
出力:
VARは次のとおりです:bla1 bla2 bla4 bla5
これにより、フィルターアウトの実行時にすべての「再帰性」が失われることに注意してください。ただし、この場合は問題にならない可能性があります。
BLA1 = bla1
と想像してくださいVAR = $(BLA1) bla2 bla3 bla4 bla5
。BLA1 += bla1111
フィルタアウト後に実行しても、$(BLA1)の値への参照が失われるため、VARの値には影響しません。
私も同じような状況なので、新しい答えを追加したいと思います。私の場合、変数文字列にもコンマがあり、さらに、コンマと最後の単語を削除したかったのです。
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)"
=
しなければならないと確信してい:=
ますか?