131 votes

Pouvez-vous faire des Makefiles valides sans tabulation?

 target: dependencies
    command1
    command2
 

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

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 faire des Makefiles valides sans tabulation?

136voto

Alok Singhal Points 33073

C'est une syntaxe bizarrerie/exigence d' make, il n'a rien à voir avec Mac OS X. Malheureusement, il n'y a rien que vous pouvez faire à ce sujet si vous allez utiliser make.

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

Le problème avec Dennis Makefile, c'est que quand il a ajouté que la ligne de commentaire, il a par inadvertance inséré 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 fichiers Makefile. Toutes les lignes de commande (les lignes commençant par le cc dans notre exemple) doit commencer par onglets. Après il a fait de son changement, la ligne 2 n'a pas, d'où l'erreur.

"Et alors?" demandez-vous, "Quel est le problème avec ça?"

Il n'y a rien de mal avec elle, par elle-même. C'est juste que quand vous considérez la façon dont les autres outils de programmation de travail sous Unix, en utilisant les onglets dans le cadre de la syntaxe est comme un de ces pungee les pièges de bâton dans Les "Bérets Verts": le pauvre jeune homme de Kansas est la marche en avant de John Wayne et de ne pas voir le fil de voyage. Après tout, il n'ya pas de fils-pièges à regarder dehors pour dans le Kansas champs de maïs. WHAM!

68voto

Sean M Points 1945

Au moment où cette question a été initialement demandé, une version de GNU Make a été publié qui vous permet d'utiliser autre chose que de l' onglet comme le caractère de préfixe. À partir de la liste de diffusion de l'annonce:

Nouvelle variable spéciale: .RECIPEPREFIX vous permet de réinitialiser la recette introduction de caractères par défaut (ONGLET) pour quelque chose d'autre. L' premier caractère de la valeur de la variable est la nouvelle recette introduction caractère. Si la variable est vide, l'ONGLET est utilisé à nouveau. Il peut être définir et redéfinir à volonté; les recettes d'utiliser la valeur de l'actif lorsque ils ont d'abord été analysées. Pour détecter cette fonctionnalité vérifier la valeur de $(.RECIPEPREFIX).

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

54voto

George Points 251

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

Si vous changez votre makefile pour lire:

 target: dependencies; command1; command2
 

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

 target: dependencies; \
command1; \
command2
 

En désordre, mais ça marche.

36voto

Pericolo Points 111

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

 autocmd FileType make setlocal noexpandtab
 

Moi aussi je me débattais avec ça, et ça a réglé le problème pour moi. Passez le bon mot!

14voto

TheNobleSunfish Points 449

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 évidemment pas à votre question, mais pourrait constituer une alternative aux méthodes disponibles pour éviter de recourir à des onglets littéraux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X