我有一个Makefile,其中包含几个其他Makefile,这些Makefile又都向一个变量添加,如下所示:
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
现在我希望从变量VAR
中删除SomethingElse
。我应该用什么替换(...)
来实现这个目标?我正在使用GNU Make,GNU Make特定的解决方案也可以。
除了上面的正确答案:
VAR = bla1 bla2 bla3 bla4 bla5
TMPVAR := $(VAR)
VAR = $(filter-out bla3, $(TMPVAR))
all:
@echo "VAR is: $(VAR)"
输出:
VAR 为:bla1 bla2 bla4 bla5
请注意,当执行 filter-out 命令时,这将打破所有“递归”,但在您的情况下可能并不重要。
BLA1 = bla1
,然后是 VAR = $(BLA1) bla2 bla3 bla4 bla5
而不是上面的 VAR 定义。在 filter-out 之后执行 BLA1 += bla1111
将不会对 VAR 的值产生影响,因为它已经失去了对 $(BLA1) 值的引用。 - Andreas Mikael Bank由于我也遇到了类似的情况,我想要添加一个新的答案。在我的情况下,变量字符串中也有逗号,并且我想要删除逗号和最后一个单词:
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)"
=
而不是:=
吗? - Bjarke Freund-Hansen=
,我会收到一个 makefile 错误,指出 VAR 最终引用自身而导致无限递归。(VAR = $(filter-out SomethingElse,$(VAR))) - Bjarke Freund-HansenVAR =
。如果您需要重置VAR
,您可能需要简单扩展。 - MatVAR := $(filter-out SomethingElse,$(VAR))
(使用:=
而不是=
)。谢谢。 :) - Bjarke Freund-HansenVAR := $(filter-out A B C,$(VAR))
。 - checksumfilter-out
仅适用于以空格分隔的单词。如果您需要从未分隔的字符串中删除某些内容,则可以使用subst
代替filter-out
。例如:$(subst -world,,hello-world)
将给出结果hello
。 - Jacob