it-swarm.dev

¿Puedes hacer Makefiles válidos sin caracteres de tabulación?

target: dependencies
    command1
    command2

En mi sistema (Mac OS X), make parece requerir que Makefiles tenga un carácter de tabulación que preceda al contenido de cada línea command, o arroja un error de sintaxis.

Esto es una molestia al crear o editar Makefiles porque tengo mi editor configurado para que sea todo-espacios-todo el tiempo.

¿Puedes hacer Makefiles válidos sin caracteres de tabulación?

98
xyz

Esta es una rareza/requisito de sintaxis de make, no tiene nada que ver con Mac OS X. Desafortunadamente, no hay nada que puedas hacer al respecto si vas a usar make.

Editar : GNU Hacer ahora admite un prefijo de receta personalizado. Ver esta respuesta .

No eres el primero en desagradar este aspecto de make. Para citar Unix Haters 'Handbook :

El problema con el Makefile de Dennis es que cuando agregó la línea de comentarios, insertó un espacio antes del carácter de tabulación al principio de la línea 2. El carácter de la pestaña es una parte muy importante de la sintaxis de Makefiles. Todas las líneas de comando (las líneas que comienzan con cc en nuestro ejemplo) deben comenzar con pestañas. Después de que hizo su cambio, la línea 2 no lo hizo, de ahí el error.

"¿Y qué?", ​​Usted pregunta: "¿Qué hay de malo en eso?"

No hay nada malo en ello, por sí mismo. Es solo que cuando consideras cómo funcionan otras herramientas de programación en Unix, usar las pestañas como parte de la sintaxis es como una de esas trampas de mazmorras en The Green Berets: el pobre chico de Kansas está caminando frente a John Wayne y no lo hace. t ver el cable de viaje. Después de todo, no hay cables de desconexión en los campos de maíz de Kansas. ¡WHAM!

103
Alok Singhal

Desde el momento en que se hizo esta pregunta originalmente, se lanzó una versión de GNU Make que le permite usar otra cosa que no sea Tab como el caracter del prefijo. Del anuncio de la lista de correo :

Nueva variable especial: .RECIPEPREFIX le permite restablecer el carácter de introducción de la receta del valor predeterminado (TAB) a otra cosa. El primer carácter de este valor variable es el nuevo carácter de introducción de la receta. Si la variable se establece en la cadena vacía, se usa nuevamente TAB. Se puede configurar y restablecer a voluntad; Las recetas usarán el valor activo cuando se analizaron por primera vez. Para detectar esta característica, verifique el valor de $ (. RECIPEPREFIX).

Esta característica se agregó en GNU Make 3.82, lanzada en julio de 2010 (seis meses después de la fecha original de esta pregunta). Dado que, a su vez, han pasado tres años y el cambio desde ese momento, es probable que otros Make flavors hayan seguido GNU Make.

51
Brighid McDonnell

Hay una forma complicada de tener un makefile válido sin pestañas.

Si cambias tu makefile para leer:

target: dependencies; command1; command2

Si va a funcionar. Si lo quieres en más de una línea, entonces puedes hacer:

target: dependencies; \
command1; \
command2

Desordenado, pero funciona.

48
George

Si tiene un vimrc en su perfil, puede agregar esta línea para evitar que vim cambie a espacios:

autocmd FileType make setlocal noexpandtab

Yo también estaba luchando con esto, y esto me lo arregló. ¡Difunde la buena palabra!

30
Pericolo

Esto lo hace por mí si quieres usar espacios.

.RECIPEPREFIX +=

Ejemplo

16
Steven Penny

En el modo de inserción de vim, uno puede usar Ctrl-v <TAB> para insertar una pestaña literal, incluso si ha configurado la tecla de tabulación para insertar espacios. Esto no responde a su pregunta, por supuesto, pero podría ser una alternativa a los métodos disponibles para evitar la necesidad de pestañas literales.

11
Patrick Sanan

Si está utilizando EditorConfig , puede agregar las siguientes líneas a su archivo .editorconfig para forzar a su IDE a usar la pestaña para la sangría en lugar de los espacios en Makefile:

[Makefile]
indent_style = tab
5
iver56