Contenido

Por qué make mola

Siguiendo con los lenguajes que suelo utilizar, he llegado al que utilizo para compilar y automatizar cosas.

Es cierto que existen muchas herramientas de este estilo: rake, cook, scons, Ant, Ivy, … Y algunas mucho más complejas, como Fabric, Capistrano o incluso Maven. Sin embargo, sigo utilizando Make. GNU/Make en concreto, ya que trae algunas mejoras sobre el Make estándar.

GNU

Make mola

Simple

Es un lenguaje muy simple. Tan solo admite variables y reglas. Las variables sólo constan del nombre y el valor. Las reglas, del objetivo, las dependencias y el cuerpo que permite generar el objetivo a partir de las dependencias.

Hay algunos añadidos, como las instrucciones for e if, pero trato de evitarlas todo lo posible. Al final sólo dan problemas.

Declarativo

En el Makefile sólo indicas lo que quieres hacer y él ya se encargará de organizar todo el invento. Buscará dependencias, generará el árbol de compilación y lo ejecutará. Así de simple.

Reglas automáticas

Además, GNU/Make ya tiene algunas reglas implícitas que nos facilitan aún más la vida. Por ejemplo, ya sabe cómo generar un ejecutable a partir de varios archivos .c.

Entorno

Puedes utilizar todas las variables de entorno como si fuera un programa bash, o definir algunas que sólo existirán durante la ejecución. Si un Makefile llama a otro, las variables seguirán definidas.

Rápido

Es muy difícil encontrar un programa de automatización tan rápido como Make.

Evita repetirse

Cuando las dependencias están correctamente especificadas, no realiza un trabajo innecesario. Si un archivo ya existe y sus dependencias no han cambiado, ¿por qué volver a generarlo? Make se encarga de comprobar estas dependencias y de evitar perder el tiempo con tareas innecesarias.

Funciones

Dispone de distintas funciones que permiten una gestión sencilla del entorno, como sustitución en cadenas, obtener la lista de archivos en un directorio, etc.

Comodines

Dispone de comodines y variables automáticas que nos permiten generar reglas genéricas que se ajustarán a distintos patrones, ahorrándonos mucho código.

Distintos objetivos

Se puede lanzar cualquiera de sus objetivos de manera individual.

Genérico

No se ata a nada. Permite automatizar cualquier tarea, desde la generación de código hasta la creación de directorios, ficheros, etc.

Make no mola

Difícil depuración

Al ser un lenguaje declarativo, a menudo resulta muy dificil encontrar un error cuando se produce.

Muy quejica

Es tremendamente exigente con el formato del Makefile. Por ejemplo, si las reglas de generación del objetivo se separan utilizando espacios en lugar de tabuladores, Make fallará.

Por suerte contamos con editores como Emacs que nos avisan de este tipo de problemas cuando estamos guardando.

Difícil de manejar

Cuando el Makefile es pequeño, resulta bastante intuitivo; pero cuando comienza a crecer, seguir la línea de ejecución se va complicando. A menudo llega a unos resultados terribles, ya que suele mezclar distintas reglas para distintos objetivos.

Conexión por red

Realizar tareas en remoto resulta tedioso y difícil. Para eso es mejor utilizar herramientas como Capistrano o Fabric. Claro, que siempre es una opción utilizar Fabric para copiar el proyecto y lanzar el Make en remoto.

Conclusiones

Ésta es una de esas grandes herramientas que han facilitado el despliegue, compilación y gestión en general de aplicaciones, así como el trabajo en grupo. En muchas ocasiones me ha ahorrado el problema de “en mi casa funciona”.

Hay gente que cree que es una herramienta antigua y que ya hay otras herramientas mejores. Yo he tratado de encontrar herramientas que me resuelvan los mismos problemas de una manera más sencilla, pero aún no he encontrado ninguno.

Entiendo que es más complejo autogenerar un Makefile válido que un script Ant, por ejemplo. Pero eso es cuando se está generando automáticamente el archivo. Salvo contadas excepciones, la edición manual de XML debería considerarse un crimen contra la humanidad.