Makefile ifeq logique ou

Comment effectuez-vous un OU logique en utilisant l’opérateur ifeq de ifeq ?

par exemple, j’ai (simplifié):

 ifeq ($(GCC_MINOR), 4) CFLAGS += -fno-ssortingct-overflow endif ifeq ($(GCC_MINOR), 5) CFLAGS += -fno-ssortingct-overflow endif 

mais souhaite consolider ces lignes.

(oui, oui, autotools, configure, etc etc; trop lourd pour la situation actuelle, voudrait tout garder dans le Makefile ici)

[l’opposé logique de cette question: Comment utiliser la condition multiple dans la déclaration ‘ifeq’ ]

Comme trouvé sur les archives de la liste de diffusion,

on peut utiliser la fonction de filtrage .

Par exemple

  ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5)) 

le filtre X, AB renverra ceux de A, B égaux à X.

Une variation de ceci est

  ifneq (,$(filter $(GCC_MINOR),4 5)) 

où une comparaison négative avec une chaîne vide est utilisée à la place (le filtre retournera une chaîne vide si GCC_MINOR ne correspond pas aux arguments)

L’inconvénient de ces méthodes est que les arguments doivent être des mots uniques.

Vous pouvez introduire une autre variable. Il ne consolide pas les deux contrôles, mais évite au moins d’avoir à mettre le corps deux fois:

 do_it = ifeq ($(GCC_MINOR), 4) do_it = yes endif ifeq ($(GCC_MINOR), 5) do_it = yes endif ifdef do_it CFLAGS += -fno-ssortingct-overflow endif 

Je ne pense pas qu’il y ait une manière concise et sensée de le faire, mais il y a des manières verbeuses, sensibles (telles que celles de Foo Bah) et des manières concises et pathologiques, telles que

 ifneq (,$(findssortingng $(GCC_MINOR),4-5)) CFLAGS += -fno-ssortingct-overflow endif 

(qui exécutera la commande à condition que la chaîne $ (GCC_MINOR) apparaisse dans la chaîne 4-5).

Voici une variante plus flexible: il utilise un shell externe, mais permet de vérifier les conditions arbitraires:

 ifeq ($(shell test ".$(GCC_MINOR)" = .4 -o \ ".$(GCC_MINOR)" = .5 -o \ ".$(TODAY)" = .Friday && printf "true"), true) CFLAGS += -fno-ssortingct-overflow endif 
 ifeq ($(GCC_MINOR), 4) CFLAGS += -fno-ssortingct-overflow endif ifeq ($(GCC_MINOR), 5) CFLAGS += -fno-ssortingct-overflow endif 

Vous pouvez également envisager d’utiliser dans ce cas:

 GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])") # -Wssortingct-overflow: http://www.airs.com/blog/archives/120 ifeq ($(GCC42_OR_LATER),1) CFLAGS += -Wssortingct-overflow endif 

J’utilise effectivement la même chose dans mon code car je ne souhaite pas conserver une config ou une config séparée.

Mais vous devez utiliser une make portable, non anémique, comme GNU make ( gmake ), et non la make de Posix.

Et cela n’aborde pas la question de logique AND et OR .