2011-04-07 9 views
15

check aşağıdaki karmaşık durumunu kontrol etmek istiyorum: dokümantasyon böyle sözdizimi desteklenmiyor diyor ancakKarmaşık durumlar benim Makefile içinde Makefile'dan

ifdef VAR1 || VAR2 || VAR3 
action 
endif 

.

ifneq ($(VAR1)$(VAR2)$(VAR3),) 
action 
endif 

başka daha doğru çözümler var mıdır: Yani benim aklıma gelen tek basit bir çözüm birleştirme kullanmaktır? Aşağıdaki durum için

:

ifdef VAR1 && VAR2 && VAR3 
action 
endif 

bir ihtiyaç da çirkindir

ifdef VAR1 
ifdef VAR2 
ifdef VAR3 
action 
endif 
endif 
endif 

yazmak için. Daha şık alternatifler var mı?

+0

İlgili (çoğaltılmamış): * [Makefile'de dize karşılaştırmasından daha büyük] (http: // stackoverflow.com/questions/3437160)* –

cevap

18

Eğer senin make GNU-marka ve tüm tanımlı değişkenleri olmayan bir boşluğunu karakteri,

ifdef VAR1 && VAR2 && VAR3 

İlgili bir

ifneq ($(and $(VAR1),$(VAR2),$(VAR3)),) 

olarak yazılabilir, muhtemelen and işlevi bulunur 3.81 veya daha yeni bir sürüm gerektirir.

durumda bazı tanımlı değişkenler, boş dizeler olabilir aşağıdaki işlevleri hazırlamak eğer:

ifndef_any_of = $(filter undefined,$(foreach v,$(1),$(origin $(v)))) 
ifdef_any_of = $(filter-out undefined,$(foreach v,$(1),$(origin $(v)))) 

sonra aşağıdaki koşulları:

:

ifdef VAR1 || VAR2 
ifdef VAR1 && VAR2 

olarak sırasıyla yazılabilir

ifneq ($(call ifdef_any_of,VAR1 VAR2),) 
ifeq ($(call ifndef_any_of,VAR1 VAR2),) 
+2

Harika, teşekkürler! $ (Veya ...) 'artı' $ (ve ...) 'hakkında bilgi edinmek için yeni. –

+0

Yardım ettiğine sevindim :-) –

+0

@dma_k: Üzgünüz, muhtemelen önceki cevap biraz uzundu. Cevabı ben düzenledim. –