Faire une erreur: séparateur manquant


Réponses:


364

Comme indiqué dans le manuel en ligne , la cause la plus courante de cette erreur est que les lignes sont mises en retrait avec des espaces lorsque des maketabulations sont attendues .

Correct

target: 
\tcmd

\test TAB (U + 0009)

Faux

target:
....cmd

où chacun .représente un ESPACE (U + 0020).


4
Vous pouvez utiliser .RECIPEPREFIX pour modifier l'utilisation des caractères. Voir: gnu.org/software/make/manual/html_node/…
aseq

16

Juste pour les sourires, et au cas où quelqu'un d'autre rencontrerait une erreur similaire:

J'ai eu la fameuse erreur "séparateur manquant" parce que j'avais invoqué une règle définissant une fonction comme

($eval $(call function,args))

plutôt que

$(eval $(call function,args))

c'est-à-dire ($plutôt que $(.


Quoi? :) Je suppose que vous n'aviez pas 0x20"d'espace", n'est-ce pas?
user35443

3
@ user35443 Le placement de$
smac89

8

Il s'agit d'une erreur de syntaxe dans votre Makefile. Il est assez difficile d'être plus précis que cela, sans voir le fichier lui-même, ou les parties pertinentes de celui-ci.


5

Pour moi, le problème était que j'avais des # ...commentaires de fin de ligne intégrés dans une define ... endefdéfinition de variable multiligne. La suppression des commentaires a fait disparaître le problème.


Je vous remercie. Je ne savais pas que les commentaires dans la definedirective étaient traités littéralement. En fait, le comportement n'est pas expliqué dans la documentation . (Pour plus de clarté: l'incorporation d'un signe numérique #dans la directive n'est pas en soi une erreur de syntaxe. Mais elle n'est tout simplement pas interprétée comme le début d'un commentaire, ce qui est certes sujet à erreur.)
ynn

3

Mon erreur était sur une ligne de déclaration de variable avec une extension multiligne. J'ai un espace de fin après le "\" qui en a fait une continuation de ligne invalide.

MY_VAR = \
   val1 \ <-- 0x20 there caused the error.
   val2

1

Dans mon cas, l'erreur suivante a été provoquée. J'ai essayé d'exécuter des commandes globalement, c'est-à-dire en dehors de toute cible.

UPD. Pour exécuter la commande globalement, il faut être correctement formé. Par exemple, commande

ln -sf ../../user/curl/$SRC_NAME ./$SRC_NAME

deviendrait:

$(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))

1

Dans mon cas, la même erreur a été causée car :il manquait deux points à la fin comme dans staging.deploy:. Notez donc que cela peut être une erreur de syntaxe facile.


1

Dans mon cas, il me manquait en fait un onglet entre ifeqet la commande sur la ligne suivante. Aucun espace n'était là pour commencer.

ifeq ($(wildcard $DIR_FILE), )
cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

Aurait du être:

ifeq ($(wildcard $DIR_FILE), )
<tab>cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

Notez que <tab>c'est un caractère de tabulation réel


0

Dans mon cas, cette erreur a été causée par le manque d'un simple espace. J'avais ce bloc if dans mon makefile:

if($(METHOD),opt)
CFLAGS=
endif

qui aurait dû être:

if ($(METHOD),opt)
CFLAGS=
endif

avec un espace après if.



-1

Donc apparemment, tout ce dont j'avais besoin était le paquet "build-essential", puis de lancer d' autoconfabord, ce qui faisait le Makefile.pre.in, puis le ./configurepuis le makequi fonctionnait parfaitement ...


-2

Le code Makefile suivant a fonctionné:

obj-m = hello.o

all:
    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean:
    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.