web-dev-qa-db-fra.com

Pouvez-vous créer des Makefiles valides sans tabulations?

target: dependencies
    command1
    command2

Sur mon système (Mac OS X), make semble exiger que les Makefiles aient un caractère de tabulation précédant le contenu de chaque ligne command, ou cela génère une erreur de syntaxe.

C'est une gêne lors de la création ou de l'édition de Makefiles car mon éditeur est configuré pour être tout-espace-tout-le-temps.

Pouvez-vous créer des Makefiles valides sans tabulations?

105
xyz

Il s'agit d'une syntaxe bizarrerie/exigence de make, cela n'a rien à voir avec Mac OS X. Malheureusement, vous ne pouvez rien y faire si vous allez utiliser make.

Modifier : GNU Make prend désormais en charge un préfixe de recette personnalisé. Voir cette réponse .

Vous n'êtes pas le premier à ne pas aimer cet aspect de make. Pour citer nix Haters 'Handbook :

Le problème avec le Makefile de Dennis est que lorsqu'il a ajouté la ligne de commentaire, il a inséré par inadvertance un espace avant le caractère de tabulation au début de la ligne 2. Le caractère de tabulation est une partie très importante de la syntaxe des Makefiles. Toutes les lignes de commande (les lignes commençant par cc dans notre exemple) doivent commencer par des tabulations. Après avoir fait son changement, la ligne 2 ne l'a pas fait, d'où l'erreur.

"Alors quoi?" Vous demandez, "Qu'est-ce qui ne va pas avec ça?"

Il n'y a rien de mal en soi. C'est juste que lorsque vous considérez comment les autres outils de programmation fonctionnent sous Unix, l'utilisation des onglets dans le cadre de la syntaxe est comme l'un de ces pièges à pungee dans The Green Berets: le pauvre gamin du Kansas marche devant John Wayne et ne fait pas '' t voir le fil de déclenchement. Après tout, il n'y a pas de fils de déclenchement à surveiller dans les champs de maïs du Kansas. PAN!

109
Alok Singhal

Depuis que cette question a été posée à l'origine, une version de GNU Make a été publiée qui vous permet d'utiliser autre chose que Tab comme caractère de préfixe. De l'annonce de la liste de diffusion :

Nouvelle variable spéciale: .RECIPEPREFIX vous permet de réinitialiser le caractère d'introduction de recette par défaut (TAB) à autre chose. Le premier caractère de cette valeur de variable est le nouveau caractère d'introduction de recette. Si la variable est définie sur la chaîne vide, TAB est à nouveau utilisé. Il peut être réglé et réinitialisé à volonté; les recettes utiliseront la valeur active lors de leur première analyse. Pour détecter cette fonctionnalité, vérifiez la valeur de $ (. RECIPEPREFIX).

Cette fonctionnalité a été ajoutée dans GNU Make 3.82, publiée en juillet 2010 (six mois après la date de demande initiale de cette question). Comme cela a à son tour duré trois ans et changé depuis, il est probable que d'autres Les saveurs de Make ont suivi GNU Make.

53
Brighid McDonnell

Il existe un moyen compliqué d'avoir un makefile valide sans onglets.

Si vous changez votre makefile pour lire:

target: dependencies; command1; command2

Si cela fonctionnera. Si vous le souhaitez sur plusieurs lignes, vous pouvez:

target: dependencies; \
command1; \
command2

Désordonné, mais cela fonctionne.

50
George

Si vous avez un vimrc dans votre profil, vous pouvez ajouter cette ligne pour empêcher vim de se transformer en espaces:

autocmd FileType make setlocal noexpandtab

Moi aussi, je me débattais avec ça, et ça m'a arrangé. Passez la bonne parole!

30
Pericolo

Cela me convient si vous souhaitez utiliser des espaces

.RECIPEPREFIX +=

Exemple

17
Steven Penny

En mode d'insertion de vim, on peut utiliser Ctrl-v <TAB> pour insérer un onglet littéral, même si vous avez défini la touche de tabulation pour insérer des espaces. Cela ne répond pas à votre question, bien sûr, mais pourrait être une alternative aux méthodes disponibles pour éviter d'avoir besoin d'onglets littéraux.

11
Patrick Sanan

Si vous utilisez EditorConfig , vous pouvez ajouter les lignes suivantes à votre .editorconfig fichier pour forcer votre IDE à utiliser l'onglet pour l'indentation au lieu des espaces dans Makefile:

[Makefile]
indent_style = tab
5
iver56