target: dependencies
command1
command2
En mi sistema (Mac OS X), make
parece requerir que Makefiles tenga un carácter de tabulación antes del contenido de cada command
línea, o arroja un error de sintaxis.
Esto es una molestia al crear o editar Makefiles porque tengo mi editor configurado para ser todo-espacios-todo-el-tiempo.
¿Puedes crear Makefiles válidos sin caracteres de tabulación?
Respuestas:
Esta es una rareza / requisito de sintaxis de
make
, no tiene nada que ver con Mac OS X. Desafortunadamente, no hay nada que pueda hacer al respecto si lo va a usarmake
.Editar : GNU Make ahora admite un prefijo de receta personalizado. Vea esta respuesta .
No eres el primero al que no le gusta este aspecto
make
. Para citar el manual de los enemigos de Unix :fuente
.RECIPEPREFIX
). Una de las respuestas a continuación también menciona eso, y debe marcarse como "correcta" en lugar de como mía. stackoverflow.com/a/21920142En el tiempo transcurrido desde que se hizo esta pregunta originalmente, se ha lanzado una versión de GNU Make que le permite usar algo más que Tabcomo carácter de prefijo. Desde el anuncio de la lista de correo :
Esta característica se agregó en GNU Make 3.82, lanzado en julio de 2010 (seis meses después de la fecha de solicitud original de esta pregunta). Dado que a su vez han pasado tres años y han cambiado desde eso, es probable que otras versiones de Make hayan seguido a GNU Make.
fuente
Hay una forma complicada de tener un archivo MAKE válido sin pestañas.
Si cambia su archivo MAKE para que lea:
Si funcionará. Si lo desea en más de una línea, puede hacer lo siguiente:
Desordenado, pero funciona.
fuente
.RECIPEPREFIX
es probablemente el mejor enfoque. Sin embargo, como no tenía ganas de hacer eso, terminé usando una solución basada en esta. Línea 1:,target:\
Línea 2: [sangría de cuatro espacios] seguida de;command
Si tiene un vimrc en su perfil, puede agregar esta línea para evitar que vim cambie a espacios:
Yo también estaba luchando con esto, y esto me solucionó. ¡Difunde la buena palabra!
fuente
Esto lo hace por mí si desea usar espacios.
Ejemplo
fuente
.RECIPEPREFIX
que "Si la variable está vacía (como está por defecto ) ese carácter es el carácter de tabulación estándar". Esto significa que la variable está definida por defecto. Se confirma usandoifeq ($(origin .RECIPEPREFIX), undefined)
. Debido a que+=
agrega un solo espacio y el rhs al lhs, sevar +=
establecevar
en un solo espacio (más una cadena vacía) siempre quevar
ya se haya definido. (Sivar
no está definido,+=
es lo mismo que=
.)En el modo de inserción de vim, se 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.fuente
Si está usando EditorConfig , puede agregar las siguientes líneas a su
.editorconfig
archivo para forzar a su IDE a usar tabulación para sangría en lugar de espacios enMakefile
:fuente
Hasta GNU Make 4.2
La respuesta de Steven Penny funciona.
La razón por la que esto funciona se describe en mi comentario .
Desde GNU Make 4.3 (lanzado el 19 de enero de 2020)
El comportamiento del
+=
operador se ha modificado de forma incompatible con versiones anteriores. Si el operando de la izquierda tiene un valor vacío, ya no se agrega un espacio .En su lugar, puede utilizar
, donde
<space>
hay un solo espacio. Aunque$(.RECIPEPREFIX)
se expande como un valor vacío, es necesario para que GNU Make no lo ignore<space>
. Tenga en cuenta que este código funciona incluso en GNU Make anterior a la versión 4.3.fuente
en ubuntu: vi Makefiles reemplaza el espacio por pestaña (o cualquier otra cosa que desee):
Por ejemplo, reemplace 8 espacios por tabulación:
Atención: ^ Inserto con la tecla de tabulación, no ^ e I caracteres: D
fuente
No portátil. Ciertos tipos de marca requieren absolutamente caracteres de tabulación. Otra razón más para preferir las pestañas a los espacios :-)
fuente