makefile: 4: *** séparateur manquant. Arrêtez

477

Voici mon makefile:

all:ll

ll:ll.c   
  gcc  -c  -Wall -Werror -02 c.c ll.c  -o  ll  $@  $<

clean :
  \rm -fr ll

Lorsque j'essaie de make cleanou make make, j'obtiens cette erreur:

:makefile:4: *** missing separator.  Stop.

Comment puis-je le réparer?

Rahul Reddy
la source
6
Vous pouvez utiliser .RECIPEPREFIX pour modifier l'utilisation des caractères. Voir: gnu.org/software/make/manual/html_node/…
aseq
2
Comment cela n'a-t-il pas été fermé en double ??? Duplication possible de Faire une erreur: séparateur manquant
jww
Dans le menu "Options -> Général" de mcedit, assurez-vous que les "Faux demi-onglets" n'ont pas de "X" entre crochets avant cette option.
Jovan Ružić

Réponses:

995

makefile a une relation très stupide avec les onglets, toutes les actions de chaque règle sont identifiées par des onglets. Et non, 4 espaces ne font pas un onglet, seul un onglet fait un onglet.

pour vérifier j'utilise la commande cat -e -t -v makefile_name

Il montre que la présence d'onglets avec ^Iet de fins de ligne avec les $deux est essentielle pour garantir que les dépendances se terminent correctement et que les onglets marquent l'action pour les règles afin qu'elles soient facilement identifiables à l'utilitaire make.

Exemple:

Kaizen ~/so_test $ cat -e -t -v  mk.t
all:ll$      ## here the $ is end of line ...                   
$
ll:ll.c   $
^Igcc  -c  -Wall -Werror -02 c.c ll.c  -o  ll  $@  $<$ 
## the ^I above means a tab was there before the action part, so this line is ok .
 $
clean :$
   \rm -fr ll$
## see here there is no ^I which means , tab is not present .... 
## in this case you need to open the file again and edit/ensure a tab 
## starts the action part
nitine
la source
8
"cat -e -t -v makefile_name" est la meilleure chose. Déjà. J'ai continué à regarder l'écran, voyant ce qui ressemblait à un onglet, manquant totalement que ce soit la LIGNE UNIQUE dans le fichier entier qui utilise des espaces au lieu d'un onglet dur.
arinmorf
Merci beaucoup! J'ai compilé le code source d'un gros projet. Collé quelques lignes dans le makefiledidacticiel, et cela n'a pas fonctionné. Seulement après avoir supprimé des espaces et mis à la Tabplace a fonctionné!
rzaaeeff
Lorsque vous copiez / collez d'un makefile à un autre à l'aide de l'éditeur vi (ou vim), assurez-vous de ne pas saisir accidentellement la ligne ~ (tilde) indiquant la fin du fichier. Un vrai ~ ressemble à un marqueur vi et provoquera le "*** séparateur manquant. Arrêtez." Erreur. Cela peut sembler évident, mais quand cela arrive accidentellement, c'est loin d'être évident. Voir les commentaires de mon blog pour plus d'informations.
Scott
3
-vL'option de catcommande est redondante ici parce que -emoyens -vEet -tmoyens -vT.
xxks-kkk
2
Voici le caractère de tabulation si quelqu'un utilise un éditeur qui remplace les tabulations, copiez-collez-le à partir d'ici:.
Ivan Borshchov
32

Sur VS Code, cliquez simplement sur "Espace: 4" dans le coin droit et changez-le en onglet lors de la modification de votre Makefile.

alanwsx
la source
1
Je n'ai même pas remarqué cela là-bas - merci pour cette info. J'utilisais auparavant un regex find-replace mais c'est tellement plus agréable.
Peanut
VS Code a reconnu que mon fichier 'common.mk', extrait d'un 'Makefile' sans suffixe était un fichier make, et l'a mis en surbrillance correctement - mais a doucement commencé à indenter avec des espaces au lieu d'onglets.
Francis Norton
Merci pour l'aide! Je n'ai certainement pas remarqué qu'il y avait un onglet dans ce coin inférieur.
se_brandon
28

Vous devez toujours écrire une commande après un Tabespace et non un espace blanc.

Cela s'applique à la gccligne (ligne # 4) dans votre cas. Vous devez insérer un onglet avant gcc.

Remplacez également \rm -fr llpar rm -fr ll. Insérez également des onglets avant cette commande.

Denny Mathew
la source
3
Pour être très clair, il doit y avoir un caractère TAB dur comme premier caractère dans chaque ligne de recette logique. Après le TAB, vous pouvez ajouter tout type d'espace blanc que vous souhaitez.
MadScientist
l'espace de tabulation doit-il être égal à 2 ou 4? dans /.vimrc set tabstop = 2 or 4?
Rahul Reddy
@RahulReddy comment un éditeur affiche un onglet n'a rien à voir avec la présence ou non d'un caractère d'onglet dans la configuration.
xaxxon
Très bon conseil, car j'avais des espaces à l'avant. Quand j'ai vérifié, cela a fonctionné. Superbe :)
indianwebdevil
9

La solution PyCharmserait d'installer un Makefile supportplugin:

  1. Ouvert Preferences( cmd + ,)
  2. Allez à Plugins->Marketplace
  3. Recherchez Makefile support, installez et redémarrez l'IDE.

Cela devrait résoudre le problème et fournir une syntaxe pour un makefile.

Tomasz Bartkowiak
la source
Cela aide également dans GoLand
Vizjerei
Je trouve les problèmes réels de l'IDE. L'édition des onglets n'est pas prise en charge dans pycharm. Lorsque je passe à ATOM, l'entrée TAB fonctionne.
Moonlight Knight
6

C'est une assez vieille question mais je voudrais quand même dire une option de plus en utilisant l' vi/viméditeur pour visualiser les onglets. Si vous avez vi/viminstallé, ouvrez un Makefile(par exemple vim Makefile) et entrez :set list. Cela montrera le nombre d'onglets insérés comme ci-dessous,

 %-linux: force$
^I@if [ "$(GCC_VERSION)" = "2.96" ] ; then \$
^I^Iecho ===== Generating build tree for legacy $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@ legacy; \$
^Ielse \$
^I^Iecho ===== Generating build tree for $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@; \$
^Ifi$
^Icd build-$@;make$
Panch
la source
6

Utilisation .editorconfigde la correction automatique des onglets:

root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4

[Makefile]
indent_style = tab
Daniel W.
la source
4

Le point clé était "HARD TAB" 1. Vérifiez si vous avez utilisé TAB au lieu d'espaces 2. Vérifiez votre .vimrc pour "set tabstop = X"

wlsherica
la source
2

Si l'un d'entre vous utilise un produit Intellij, la solution est la suivante:

  1. Allez dans Préférences> Éditeur> Style de code
  2. ici, vous devez sélectionner le type de fichier lié à votre problème. Mais très probablement, vous devez sélectionner Other File Types.
  3. Dans l'onglet ouvert, cochez la case Use tab characteret faites attention, Tab sizeet les Indentvaleurs doivent être 4.
Bogdan Alexandru Militaru
la source
2

Si vous utilisez mcedit pour modifier le makefile. vous devez voir la marque suivante. entrez la description de l'image ici

riguang zheng
la source
0

En effet, tab est remplacé par des espaces. Pour désactiver cette fonction, accédez à

gedit-> modifier-> préférences-> éditeur

et retirer le chèque

" remplacer l'onglet par un espace "

Shrinivas Patgar
la source