从Makefile变量中删除项目?


82

我有一个makefile,其中包括其他几个makefile,它们又都添加到这样的变量中:

VAR := Something SomethingElse
VAR += SomeOtherThing

(...)

现在,我希望SomethingElseVAR变量中删除。我(...)该怎么做呢?

我正在使用GNU Make,并且可以使用GNU Make特定的解决方案。

Answers:


109

如果您使用的是GNU Make,则可以使用filter-outtext函数

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

而且您确定我必须使用=而不是:=
Bjarke Freund-Hansen

1
在我给的例子中,两者都是正确的吗?如果我使用的话,=我会得到一个makefile错误,该错误说明了有关VAR的最终最终以无限递归引用了它。(VAR = $(filter-out SomethingElse,$(VAR))
Bjarke Freund-Hansen

4
总结一下,其原因取决于用法。但是在我的示例中,正确答案将是:(VAR := $(filter-out SomethingElse,$(VAR)) 使用:=和不是=)。谢谢。:)
Bjarke Freund-Hansen

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

1
我可能不清楚我的意思。假设有BLA1 = bla1VAR = $(BLA1) bla2 bla3 bla4 bla5而不是上面的VAR定义。BLA1 += bla1111滤除后执行对VAR的值没有影响,因为它将丢失对$(BLA1)值的引用。
安德烈亚斯·米凯尔银行

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)"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.