106 votes

Faire une erreur pour ifeq : erreur de syntaxe près du jeton inattendu

Je suis en train d'écrire un Makefile qui fait de la correspondance de chaînes à un endroit, le code est comme suit:

if test ...; \
    then \
    scripts shell... \
fi

ifeq ($(DIST_TYPE),nightly)
    scripts shell ...
endif

Ici, le premier if est un script shell, le deuxième ifeq est une condition GNU Make. Cependant, l'erreur suivante est générée:

ifeq (nuit,nightly)

/bin/sh: -c: ligne 0: erreur de syntaxe près du jeton inattendu `nuit,nightly'

/bin/sh: -c: ligne 0: `ifeq (nuit,nightly)'

Que se passe-t-il ici? Il semble que Make essaie d'appeler le shell.

343voto

Ryan Li Points 2287

J'ai joué avec le code et j'ai découvert que les instructions conditionnelles doivent être écrites sans indentation, et cela a résolu mon problème.

S'il n'y a aucune indentation, Make le prendra comme une directive pour lui-même ; sinon, cela sera considéré comme un script shell.

Code exemple

Faux :

target:
    ifeq (foo, bar)
        ...
    endif

Correct :

target:
ifeq (foo, bar)
    ...
endif

14voto

SenZhang Points 111

De plus, si les déclarations conditionnelles sont utilisées dans les fonctions définies, comme:

define myFunc
ifeq (foo, bar)
    ...
endif
endef

Dans ce cas, Make le traitera également comme un script shell.

Ce problème peut être résolu en utilisant la fonction if à la place:

define myFunc
    $(if condition,then-part[,else-part])
endef

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X