我有一个makefile,其中包括其他几个makefile,它们又都添加到这样的变量中:
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
现在,我希望SomethingElse
从VAR
变量中删除。我(...)
该怎么做呢?
我正在使用GNU Make,并且可以使用GNU Make特定的解决方案。
我有一个makefile,其中包括其他几个makefile,它们又都添加到这样的变量中:
VAR := Something SomethingElse
VAR += SomeOtherThing
(...)
现在,我希望SomethingElse
从VAR
变量中删除。我(...)
该怎么做呢?
我正在使用GNU Make,并且可以使用GNU Make特定的解决方案。
Answers:
如果您使用的是GNU Make,则可以使用filter-out
text函数。
OTHERVAR := $(filter-out SomethingElse,$(VAR))
=
我会得到一个makefile错误,该错误说明了有关VAR的最终最终以无限递归引用了它。(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
而不是上面的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)"
=
而不是:=
?