1 puntos por GN⁺ 2024-09-22 | 2 comentarios | Compartir por WhatsApp
  • Me gustan los Makefiles. Han pasado más de 10 años desde que los usé por primera vez. Incluso en ese entonces parecían una tecnología antigua. Con el paso del tiempo aparecieron y desaparecieron nuevas herramientas de build, pero Makefile seguía usándose. Me familiaricé con él al participar en proyectos y, en algún momento, terminé agarrándole gusto. Hoy es la primera herramienta de automatización que uso cuando empiezo un proyecto nuevo.

  • La razón por la que me gustan los Makefiles es que siguen una convención no oficial para implementar el mismo conjunto de comandos. Cuando me topo con un proyecto nuevo y veo un archivo Makefile, ejecuto make o make build, luego make install, y el proyecto se compila y queda configurado. O al menos puedo enterarme de los pasos adicionales que hacen falta.

  • Intento aplicar la misma convención en mis propios proyectos. Si abro la carpeta de un proyecto viejo y ejecuto make dev, se realizan todos los pasos necesarios para compilar el proyecto y levantar el servidor de desarrollo. Como he usado distintas tecnologías, cada una tenía comandos diferentes. Con Makefile, incluso los proyectos que no he tocado en meses o años se pueden manejar fácilmente.

  • Makefile es simple. No uso condicionales, flags ni otras funciones complejas. La mayoría de las tareas consisten en uno o más comandos de shell. También podría escribir un script de bash con algunas funciones, pero un Makefile es más fácil y más rápido de escribir.

  • La mayoría de los proyectos personales incluyen tareas comunes como estas:

    • dev: iniciar el servidor de desarrollo
    • build: compilar el proyecto (si hace falta una etapa de build)
    • deploy: desplegar/publicar el proyecto
  • Este blog tiene un Makefile simple con un solo target:

    dev:  
      npm run dev  
    
  • En proyectos más complejos uso Makefiles como este:

    # Ejecutar el servidor de desarrollo  
    dev:  
      bundle exec jekyll serve --unpublished -w --config _config.yml,_config-dev.yml --livereload  
    
    # Compilar assets  
    build:  
      npm run gulp build  
    
    # Vigilar una carpeta específica y procesar assets  
    watch:  
      npm run gulp watch -- --wip  
    
    # Compilar el sitio web localmente, cifrarlo y desplegarlo al servidor de Netlify  
    deploy:  
      JEKYLL_ENV=production bundle exec jekyll build; \  
      make encrypt; \  
      netlify deploy --prod  
    
    # Cifrar la carpeta "_site"  
    encrypt:  
      npx staticrypt _site/*.html -r -d _site  
    
  • En el ejemplo anterior estoy ignorando la existencia de los phony targets. Si existe un archivo llamado dev, build, watch, deploy o encrypt, puede que el Makefile no funcione como se espera.

  • GNU Make es muy universal. En Linux es muy probable que ya venga instalado. En mi MacBook tampoco recuerdo haberlo instalado explícitamente. Seguramente vino junto con otras herramientas. Make es simple y tiene menos dependencias adicionales que otras herramientas de build. Eso puede ser útil en entornos restringidos. Es muy probable que Make ya esté disponible. Y si no, siempre se pueden ejecutar manualmente en la shell los comandos del Makefile.

  • No estoy en contra de otras herramientas de build. Me interesa descubrir herramientas nuevas. Pero sigo usando Make para orquestar distintas herramientas.


Resumen de GN⁺

  • Makefile facilita la gestión al ofrecer un conjunto consistente de comandos en distintos proyectos.
  • Su sintaxis simple y la poca cantidad de dependencias lo hacen útil incluso en entornos restringidos.
  • Puede usarse junto con diversas herramientas de build, por lo que ofrece bastante flexibilidad.
  • Herramientas con funciones similares incluyen CMake, Ninja y Gradle.

2 comentarios

 
kayws426 2024-09-22

Si un makefile no define dependencias, reemplazarlo por justfile ofrece una mejor experiencia de uso.

 
GN⁺ 2024-09-22
Comentarios en Hacker News
  • Ánimo para usar Make

    • Una opinión que dice que no hay que desanimarse por usar Make "mal"
    • La ventaja de Make es su simplicidad, y en proyectos pequeños no suele ser un gran problema
    • En la mayoría de los casos no hace falta preocuparse por la forma correcta, y solo se agrega la complejidad necesaria
  • Problemas de los Makefiles

    • Los Makefiles son menos malos que otros sistemas de build, pero aun así tienen muchos problemas
    • Principales problemas de los sistemas de build:
      • Demasiado básicos: en proyectos complejos generan confusión
      • Demasiado complejos: exigen demasiado conocimiento inicial y mantenimiento
      • Falta de biblioteca estándar: hay que definir todo manualmente
      • Demasiado limitados: cuando cambian las necesidades, hay que migrar a otro sistema
      • Demasiada magia: rasgo típico de sistemas mal diseñados
      • Sintaxis críptica o inconsistente
  • Ventajas de Make

    • La opinión de alguien a quien le gusta Make
    • Make es un DSL simple con un conjunto de comandos para transformar archivos
    • También se puede hacer con Bash u otro shell, pero Make es más simple
  • Uso de objetivos PHONY

    • No se usa el seguimiento de dependencias basado en mtime
    • Hay que definir los objetivos como PHONY
    • Últimamente se ha cambiado a just y justfiles para usar algo más simple
  • Debate acalorado sobre Make

    • Make provoca discusiones como la guerra de vi vs emacs
    • Usar un Makefile como driver del sistema de build de más alto nivel es una decisión inteligente
    • Incluso si se usan otras herramientas de build, se puede estandarizar con un Makefile
  • Usos variados de Make

    • Se usa Make para automatizar distintos trabajos
    • Se usa un Makefile para compilar y desplegar un sitio web personal
    • Make se invoca mediante Git push y un Git hook
    • Se usa un Makefile para subir y gestionar archivos PDF
  • Límites de Make y alternativas

    • Make está bien como ejecutor de tareas, pero hay alternativas mejores
    • Make y los Makefiles no están estandarizados
    • No puede resolver dependencias y requiere scripts de configure
    • Usa mtime para verificar si las entradas están actualizadas, pero eso puede causar problemas
    • Fue diseñado según la filosofía Unix, pero tiene límites frente a los sistemas de build modernos
  • Cambio a Justfiles

    • Se cambió a Justfiles para evitar la complejidad de los Makefiles
  • Uso simple del Makefile

    • Una opinión a favor del uso simple del Makefile
    • Se puede compartir sin aprenderlo todo a la perfección
    • Se comparte la experiencia de haber reemplazado el Makefile con un pipeline de GitLab CI