Makefile değişkeninden öğe kaldırılsın mı?


84

Diğer birkaç makefile içeren bir makefile'ım var ve bunların tümü aşağıdaki gibi bir değişkene eklenir:

VAR := Something SomethingElse
VAR += SomeOtherThing

(...)

Şimdi kaldırmak istediğiniz SomethingElsegelen VARdeğişken. Bunu yapmak için ne koymalıyım (...)?

GNU Make kullanıyorum ve GNU Make'e özgü bir çözüm iyi olacak.

Yanıtlar:


114

GNU Make kullanıyorsanız filter-outmetin işlevini kullanabilirsiniz .

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

Ve kullanmam gerektiğine emin misin, =değil :=mi?
Bjarke Freund-Hansen

1
Verdiğim örnekte ikisi de doğru mu? Ben kullanırsanız =ben sonsuz özyinelemede kendisini yönlendiren sonunda VAR hakkında bir şeyler söyleyen bir makefile hatası alıyorum. ( VAR = $(filter-out SomethingElse,$(VAR)))
Bjarke Freund-Hansen

4
Sadece özetlemek gerekirse, kullanım amacına bağlıdır. Ama benim örneğimde doğru cevap şu olacaktır: VAR := $(filter-out SomethingElse,$(VAR)) (İle :=ve değil =). Teşekkürler. :)
Bjarke Freund-Hansen

13
Not: Birden fazla öğe üzerinde de kullanılabilir. Ör: VAR := $(filter-out A B C,$(VAR)).
sağlama toplamı

1
Gelen başkaları için not. filter-outyalnızca boşlukla ayrılmış sözcüklerde çalışır. Bir dizeden sözcükle ayrılmış olmayan bir şeyi kaldırmanız gerekirse, substbunun yerine kullanabilirsiniz filter-out. Yani: $(subst -world,,hello-world)sonucu verirdi hello.
Jacob

7

Yukarıdaki doğru cevaba ek olarak:

VAR = bla1 bla2 bla3 bla4 bla5

TMPVAR := $(VAR)
VAR = $(filter-out bla3, $(TMPVAR))

all:
    @echo "VAR is: $(VAR)"

Çıktı:
VAR: bla1 bla2 bla4 bla5

Bunun filtreleme yürütüldüğünde tüm "özyinelemeyi" bozduğunu unutmayın, ancak sizin durumunuzda bu önemli olmayabilir.


Bu beklenen bir davranış değil mi? İlk önce VAR'ı normal olarak tanımlarsınız, ardından hemen TMPVAR'ı ayarlarsınız ve bu noktada VAR'ı genişletirsiniz. Daha sonra, VAR'ı normal olarak TMPVAR'ın filtrelenmiş bir sürümüne yönlendirmek için sıfırlarsınız. Ve tüm hedeflerde VAR'ı kullanın ve böylece onu genişletin. Bunun özyinelemeyi nasıl bozduğunu veya herhangi bir şekilde sorunlu bir davranış olduğunu görmüyorum?
Bjarke Freund-Hansen

1
Ne demek istediğimi anlamamış olabilirim. Düşünün BLA1 = bla1, daha sonra VAR = $(BLA1) bla2 bla3 bla4 bla5yerine yukarıda VAR tanımı. Yürütülmesi BLA1 += bla1111o $ (BLA1) değerine onun referansını kaybetmiş olacağından filtre çıkıştan sonra, VAR değeri üzerinde hiçbir etkisi olmayacaktır.
Andreas Mikael Bank

0

Benim de benzer bir durumum olduğu için yeni bir cevap eklemek istiyorum. Benim durumumda, değişken dizesinde virgül de vardı ve dahası, virgül ve son kelimeyi kaldırmak istedim:

VAR = "bla1, bla2"

Bu durumda filtreleme çalışmıyor (önceki cevaplarda bile, alıntı yokken)

Benim çözümüm kullanmaktır 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)"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.