2010-01-25 11 views
82
target: dependencies 
    command1 
    command2 

Sur mon système (Mac OS X), make semble exiger que que Makefiles ont un caractère de tabulation qui précède le contenu de chaque ligne command, ou génère une erreur de syntaxe.Pouvez-vous créer des Makefiles valides sans caractères de tabulation?

Ceci est un problème lors de la création ou de la modification de Makefiles car mon éditeur est configuré pour être all-spaces-all-the-time.

Pouvez-vous créer des Makefiles valides sans caractères de tabulation?

+2

J'ai également configuré mon éditeur pour émuler des onglets avec spa ces. Mais, mon éditeur me permet également de taper Ctrl-Tab dans les rares occasions où je dois absolument, positivement avoir un onglet, comme dans Makefiles. Peut-être que votre éditeur le fait aussi. – toolic

Répondre

86

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

Édition: GNU Make prend désormais en charge un préfixe de recette personnalisé. Voir this answer.

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

Le problème avec le Makefile Dennis est que, quand il a ajouté la ligne de commentaire, il a inséré par mégarde 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 de 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 n'a pas, d'où l'erreur.

« Alors quoi? » Vous demandez: « Quel est le problème avec ça? »

Il n'y a rien de mal avec elle, par elle-même. C'est juste que lorsque vous considérez comment d'autres outils de programmation fonctionnent sous Unix, l'utilisation d'onglets dans la syntaxe est comme un de ces pièges de pungee dans The Green Berets: le pauvre enfant du Kansas se dirige devant John Wayne et doesn ' t voir le fil de déclenchement. Après tout, il n'y a pas de fils à surveiller dans les champs de maïs du Kansas. PAN!

+3

Le problème avec les onglets est l'une des premières choses que tous ceux qui utilisent apprennent - je n'ai jamais trouvé que c'était un vrai problème. –

+2

@Neil, Moi non plus: Je n'ai jamais dit que j'étais d'accord avec l'UHH, je disais juste que certaines personnes ne l'aimaient pas. :-) –

+1

On dirait une bonne prise pour utiliser cmake. Pas la seule bizarrerie frustrante à faire de la syntaxe. – orodbhen

-5

Non portable. Certaines saveurs de make nécessitent absolument des caractères de tabulation. Une autre raison de préférer les onglets aux espaces :-)

45

Il existe une manière alambiquée d'avoir un makefile valide sans onglets.

Si vous changez makefile pour lire:

target: dependencies; command1; command2 

Si fonctionnera. Si vous le voulez sur plus d'une ligne, alors vous pouvez faire:

target: dependencies; \ 
command1; \ 
command2 

Messy, mais cela fonctionne.

+0

C'est moche, mais la première ligne a résolu mon problème. Merci! – velotron

+0

La mise à niveau vers une version de Make prenant en charge '.RECIPEPREFIX' est probablement la meilleure approche. Cependant, comme je n'avais pas envie de le faire, j'ai fini par utiliser une solution basée sur celle-ci. Ligne 1: 'target: \', Ligne 2: [indentation à quatre espaces] suivi de '; command' –

7

En mode insertion de vim, vous pouvez 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.

+0

Cela a fonctionné! Génie. Je vous remercie. – Dan

22

Si vous avez un vimrc dans votre profil, vous pouvez ajouter cette ligne pour éviter vim de changer d'espaces:

autocmd FileType make setlocal noexpandtab 

Moi aussi se débattait avec cela, et ce qu'il fixe pour moi.Passez le bon mot!

34

Au moment où 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. From the mailing list announcement:

Nouvelle variable spéciale

: .RECIPEPREFIX vous permet de réinitialiser la recette caractère d'introduction de la valeur par défaut (TAB) à autre chose. Le premier caractère de cette valeur de variable est le nouveau caractère d'introduction de la recette . Si la variable est définie sur la chaîne vide, TAB est utilisée à nouveau. Il peut être réglé et réinitialisé à volonté; recettes utilisera la valeur active lorsque ils ont d'abord été analysés. 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). Puisqu'il a été à son tour trois ans et changer depuis, il est probable que d'autres saveurs Make aient suivi GNU Make.

+7

Cela fonctionne! Je vous remercie! J'ai ajouté une ligne au début de mon Makefile disant .RECIPEPREFIX = (c'est un espace après les égaux et avant la fin de la ligne) et tout a fonctionné comme je l'espérais. Ceci est utile pour les gens comme moi qui font beaucoup de Python et de Coffeescript et ont besoin d'espaces au lieu d'onglets. – Unoti

8

Ce qu'il fait pour moi si vous souhaitez utiliser des espaces

.RECIPEPREFIX += 

Example

+0

Quelle version de make supporte cela? Cela ne fonctionne pas dans GNU Make 4.1. – Cerin

+2

GNU Make 4.1 Construit pour x86_64-pc-linux-gnu Je suis désolé mais cela fonctionne – neok

+0

probablement, il doit mentionner, que cette variable doit être déclarée à l'intérieur make fichier lui-même (préfixe point facile à ne pas repérer) –

1

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

[Makefile] 
indent_style = tab