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.
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.