“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