Faire une erreur: séparateur manquant

234

J'obtiens l'erreur suivante en cours d'exécution make:

Makefile:168: *** missing separator.  Stop.

Quelle est la cause de cela?

Renjith G
la source
Est-ce que cela répond à votre question? makefile: 4: *** séparateur manquant. Arrêt
SS Anne

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).

dfa
la source
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 $(.

Krazy Glew
la source
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.

se détendre
la source
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.

Hugues
la source
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
JHarveyJr
la source
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))
yuliskov
la source
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.

Pratik
la source
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

Nena
la source
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.

Hashimoto
la source
-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 ...

Kl3m Michard
la source
-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
Jaishree Alavandar
la source