Comment vérifier si une variable est égale à l'une des deux valeurs à l'aide de la si/ou/et les fonctions
Dans un GNU makefile, je voudrais définir une variable de sortie à une valeur (disons-le, "true") si une variable d'entrée est égale à l'une des deux valeurs et à une autre valeur ("false") quand il ne l'est pas.
Grâce à cette SORTE de réponse que j'ai appris sur le and
et la or
fonctions et peu de temps après que j'ai trouvé le if
fonction. Ces fonctions semblent être disponibles dans ma version de la faire, donc je tiens à les utiliser. Je voudrais écrire quelque chose comme ça:
TEST_INPUT = `hostname`
TEST_OUTPUT = $(if $(or $(eq $(TEST_INPUT),hal9000),
$(eq $(TEST_INPUT),pipboy)),true,false)
Malheureusement je ne peux pas, parce que je ne pouvais pas trouver tout évident que la forme de la eq
fonction. Je suis en mesure de réaliser ce que je veux à l'aide de la filter
fonction:
TRUE_HOSTS = hal9000 pipboy
TEST_OUTPUT = $(if $(filter $(TEST_INPUT),$(TRUE_HOSTS)),true,false)
ou la subst
fonction:
TEST_OUTPUT = $(if $(and $(subst hal9000,,$(TEST_INPUT)),
$(subst pipboy,,$(TEST_INPUT))),
false,true)
mais pour moi, il n'est pas agréable à regarder, ni un code lisible. Est-il plus proche du premier exemple (l'un à l'aide de n'existant pas eq
fonction)? Peut-être que je n'attrape pas le but de la if
, and
et or
fonctions à tous?
Vous devez vous connecter pour publier un commentaire.
La chose qui est étrange à propos de GNUmake des conditions est qu'il n'y a pas de type booléen en faire -- tout est une chaîne de caractères. Si les conditions de tous les travaux avec la chaîne vide pour "faux" et tous les non-chaîne vide comme étant "vrai".
Cela étant dit, le fait que
eq
manque, c'est un annoyonace quoique un mineur. Généralement, vous pouvez obtenir ce que vous voulez defilter
oufindstring
, etfilter
souvent vous permet de rechercher une liste de chaînes en fonction de votre deuxième exemple.Si vous en avez vraiment besoin, vous pouvez définir votre propre eq fonction:
Qui vous n'avez malheureusement pour l'utiliser comme
$(call eq,
...,
...)
eq
fonction est également assez intelligent et plus lisible que mes solutions (je vais sans vergogne l'utiliser). Merci 🙂Chris Dodd la réponse est bonne, mais il est un coin de cas pour lesquels il fournit un résultat incorrect. Si les deux variables comparées sont vides (c'est à dire faux), alors il retournera false. Une version améliorée serait:
Ce vérifie d'abord soit des arguments sont non-vide, et si oui, utilise la technique précédente pour les comparer. Sinon, elle retourne 1, pour indiquer que les valeurs sont égales, car ils sont tous les deux vides.
eq = $(and $(findstring x$(1),x$(2)), $(findstring x$(2),x$(1)))
.En fonction de votre contexte, l'utilisation de la GMSL (GNU Make Standard Library), qui est une collection de fonctions dans un fichier include "...que de fournir une liste et de manipulation de chaîne, l'arithmétique des nombres entiers, les tableaux associatifs, les piles et les fonctions de débogage." Voir http://gmsl.sourceforge.net/
Il a une "chaîne de l'égalité", une fonction seq, ainsi qu'un certain nombre d'autres manipulateurs:
Aussi, utiliser le $(shell ...) de la syntaxe au lieu de backticks pour mieux gérer les retours à la ligne.