“ifeq” conditionnel de syntaxe dans le makefile
Que la condition de la directive- ifeq
est souvent utilisé pour comparer les mot(s) élargi à partir de variables, qui contient souvent des blancs de l'espace, on peut en vouloir et, en fait besoin, pour Faire retirer des leader ou de fuite espace blanc.
En fait, vous pouvez avoir un point de vue opposé, c'est à dire Faire doit de procès-verbaux de tous les arguments pour une ifeq conditionnelle, parce que l'utilisateur peut avoir eu ces espaces dans le cadre du "test", avec l'intention de ces espaces jouent un rôle déterminant, lors de l'évaluation de cette ifeq
directive, comme vrai ou faux.
Je ne peux pas décider lequel d'entre eux est plus correcte.
En fait, je ne suis pas la seule!
Faire ne peut pas décider lequel d'entre eux est correct. Donc, il peut ou peut ne pas bande leader ou de fuite espaces.
En fait, parfois il va bande que les grands espaces.
Pas décevant, Faire parfois bande de fuite espaces.
Bien sûr, il y a de trop nombreux cas à vérifier, donc je vais "faire" seulement quelques-uns d'entre eux.
Un makefile (VERSION 1), est:
ifeq ( a, a)
all::
echo 'true'
else
all::
echo 'false'
endif
De l'exécution, j'obtiens:
$ make -r
echo 'false'
false
Un makefile (VERSION 2), est:
ifeq (a ,a )
all::
echo 'true'
else
all::
echo 'false'
endif
De l'exécution, j'obtiens:
$ make -r
echo 'false'
false
Un makefile (VERSION 3), est:
ifeq ( a , a )
all::
echo 'true'
else
all::
echo 'false'
endif
De l'exécution, j'obtiens:
$ make -r
echo 'false'
false
Un makefile (VERSION 4), est:
ifeq (a , a)
all::
echo 'true'
else
all::
echo 'false'
endif
De l'exécution, j'obtiens:
$ make -r
echo 'true'
true
Un makefile (VERSION 5), est:
ifeq (a, a)
all::
echo 'true'
else
all::
echo 'false'
endif
De l'exécution, j'obtiens:
$ make -r
echo 'true'
true
Pour résumer, juste un peu de cas, nous avons:
# Both, have only leading whitespace.
ifeq( a, a) as: false.
# Both, have only trailing whitespace.
ifeq(a ,a ) as: false.
# Both, have trailing AND trailing whitespace.
ifeq( a , a ) as: false.
# Left-hand-size has only trailing, and right-hand-size has only leading whitepsace.
ifeq(a , a) as: true.
# Left-hand-size has NO whitespace at-all, and right-hand-size has only leading whitepsace.
ifeq(a, a) as: true.
Ainsi, cette méthodologie, qui Rendent les utilise pour évaluer l' véracité d'un ifeq
conditionnelle de la directive, est certainement le tournant dans:
- Moins cohérente.
- Moins maintenable.
- Plus difficile à déboguer.
- Sujettes à l'erreur.
- Enfin, beaucoup de "fun"!
Sommes-nous d'accord?
OriginalL'auteur Ji Cha | 2015-08-24
Vous devez vous connecter pour publier un commentaire.
Vous devriez lire cette:
Vous devez également utiliser le bande fonction en cas de doute.
Ici un exemple
Makefile
:Et le résultat:
1:
2:
3:
4:
4:
arg
d'une fonction$(func arg)
, mais rien ne dit à propos deifeq (arg arg)
, quearg
ne peut pas contenir de WS. En fait, les exemples montrent que nous pouvons. Mais, vous avez raison sur ce point, WS résultant de l'expansion des variables, (pas entré littéralement) toujours! MerciVous êtes de droite. La doc ne dit rien sur les espaces conditionnelle directive arguments. Nous avons à considérer qu'ils se comportent comme des fonctions.
OriginalL'auteur jml