web-dev-qa-db-fra.com

Syntaxe conditionnelle "ifeq" dans le makefile

Comme la directive conditionnelle ifeq est fréquemment utilisée pour comparer les mots développés à partir de variables, qui contiennent souvent des espaces blancs, nous pouvons vouloir et, en fait , nous avons besoin , pour Make pour supprimer tout début ou fin espace blanc.

En fait, vous pouvez avoir un point de vue opposé, c'est-à-dire que Make devrait garder mot pour mot tous les arguments d'un ifeq conditionnel, car l'utilisateur peut avoir eu ces espaces dans le cadre du "test", avec l'intention que ces espaces jouent un rôle décisif facteur, lors de l'évaluation de cette directive ifeq, comme vrai ou faux .

Je ne peux pas décider lequel d'entre eux est plus correct.

En fait, je ne suis pas seul!

Se faire ( ne peut pas décider lequel est correct. Ainsi, il peut ou non supprimer les espaces de début ou de fin .

En fait, parfois, il supprime uniquement les espaces de tête .

Pas décevant, Make parfois ne supprime que les espaces de fin .

Bien sûr, il y a trop de cas à vérifier, donc je "n'en ferai" que quelques-uns.



Un makefile (VERSION 1), c'est:

ifeq ( a, a)
all::
    echo 'true'
else
all::
    echo 'false'
endif



Exécution, j'obtiens:

$ make -r
echo 'false'
false



Un makefile (VERSION 2), c'est:

ifeq (a ,a )
all::
    echo 'true'
else
all::
    echo 'false'
endif



Exécution, j'obtiens:

$ make -r
echo 'false'
false



Un makefile (VERSION 3), c'est:

ifeq ( a , a )
all::
    echo 'true'
else
all::
    echo 'false'
endif



Exécution, j'obtiens:

$ make -r
echo 'false'
false



Un makefile (VERSION 4), c'est:

ifeq (a , a)
all::
    echo 'true'
else
all::
    echo 'false'
endif



Exécution, j'obtiens:

$ make -r
echo 'true'
true



Un makefile (VERSION 5), c'est:

ifeq (a, a)
all::
    echo 'true'
else
all::
    echo 'false'
endif



Exécution, j'obtiens:

$ make -r
echo 'true'
true



Pour résumer, quelques-uns des 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.

Donc, cette méthodologie, que Make utilise pour évaluer la véracité d'une directive conditionnelle ifeq, la transforme définitivement en:

  • Moins cohérent.
  • Moins maintenable.
  • Plus difficile à déboguer.
  • Sujette à l'erreur.
  • Enfin, beaucoup de "fun"!

Sommes-nous d'accord?

11
Ji Cha

Vous devriez lire this :

Les virgules et les parenthèses ou accolades sans correspondance ne peuvent pas apparaître dans le texte d'un argument tel qu'il est écrit; les espaces de tête ne peuvent pas apparaître dans le texte du premier argument tel qu'il est écrit. Ces caractères peuvent être mis dans la valeur d'argument par substitution de variable. Définissez d'abord les variables comma et space dont les valeurs sont des virgules et des espaces séparés, puis remplacez ces variables là où de tels caractères sont souhaités, comme ceci:

comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
# bar is now ‘a,b,c’.

Vous devez également utiliser la fonction strip en cas de doute.


Voici un exemple Makefile:

empty:=
space:= $(empty) $(empty)

x := $(space)a$(space)
y := $(space)a$(space)

ifeq ($(x),$(y))
all::
        @echo 'regular: true'
else
all::
        @echo 'regular: false'
endif

ifeq ($(strip $(x)),$(strip $(y)))
all::
        @echo 'strip:   true'
else
all::
        @echo 'strip:   false'
endif

Et le résultat:

1:

x = $(space)a
y = $(space)a
regular: true
strip:   true

2:

x = a$(space)
y = a$(space)
regular: true
strip:   true

3:

x = $(space)a$(space)
y = $(space)a$(space)
regular: true
strip:   true

4:

x = a$(space)
y = $(space)a
regular: false
strip:   true

4:

x = a
y = $(space)a
regular: false
strip:   true
9
jml