2011-04-07 3 views
15

Dans mon Makefile je voudrais vérifier l'état complexe suivant:conditions complexes check-in Makefile

ifdef VAR1 || VAR2 || VAR3 
action 
endif 

mais la documentation indique la syntaxe comme non pris en charge. La seule solution de contournement simple qui est venu à mon esprit est d'utiliser la concaténation:

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

Existe-t-il d'autres solutions sont plus correctes?

Pour le cas suivant:

ifdef VAR1 && VAR2 && VAR3 
action 
endif 

un besoin d'écrire

ifdef VAR1 
ifdef VAR2 
ifdef VAR3 
action 
endif 
endif 
endif 

qui est aussi laid. Y a-t-il des alternatives plus élégantes?

+0

Relatif (pas de doublon): * [Comparaison supérieure à la chaîne dans un Makefile] (http: // stackoverflow.com/questions/3437160)* –

Répondre

18

Si votre make est GNU make et toutes les variables définies incluent un caractère non-espace,

ifdef VAR1 && VAR2 && VAR3 

peut être écrit comme

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

Sur une note liée, probablement and fonction nécessite la version 3.81 ou ultérieure.

Dans le cas où certaines variables définies peuvent être des chaînes vides, si nous préparons les fonctions suivantes:

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

puis les conditions suivantes:

ifdef VAR1 || VAR2 
ifdef VAR1 && VAR2 

peuvent être écrites respectivement:

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

Super, merci! Nouveau pour moi d'apprendre '$ (ou ...)' plus '$ (et ...)'. –

+0

Je suis content que cela ait aidé :-) –

+0

@dma_k: Désolé, la réponse précédente était probablement un peu longue. J'ai édité la réponse. –