Escribir comandos largos gcc repetidamente es doloroso. Se pone peor cuando agregas bibliotecas o modificas el código constantemente. Makefiles soluciona este problema. Automatizan el proceso de compilación para que dejes de escribir los mismos comandos una y otra vez.
A continuación se muestra un ejemplo sencillo de Makefile. Reemplaza una secuencia de compilación manual.
Guarde esto en un archivo llamado makefile. Ejecute make para compilar el ejecutable. Hay una regla estricta. Debes usar un carácter de tabulación antes de cada línea gcc. Ocho espacios fallarán. La herramienta de construcción lo rechazará. Todas las demás líneas deben comenzar en el margen izquierdo.
Comprender las dependencias
Un Makefile tiene dos tipos de líneas. Las líneas alineadas a la izquierda son líneas de dependencia. Definen relaciones entre archivos. Las líneas con pestañas son comandos ejecutables. Puede ser cualquier comando UNIX válido.
Tome esta línea:
principal.o: principal.c util.h
Esto dice que “main.o” depende de “main.c” y “util.h”. Si alguno de los archivos fuente cambia, se ejecuta el siguiente comando. Recrea main.o.
La primera línea del archivo es especial. Define el objetivo final. En este caso, ese es el ejecutable “principal”. Enumera main.o y util.o como dependencias. Si esos archivos objeto son más nuevos que el origen, Make los reconstruye. Luego los vincula al binario final.
Este comando se ejecuta solo si las dependencias cambian. Si nada cambió, Make no hace nada. Ese es el beneficio principal. Se salta el trabajo que ya está hecho.
Por qué esto es importante para su flujo de trabajo
Los programas grandes tienen muchas bibliotecas y archivos fuente. El seguimiento de qué archivos se cambiaron manualmente es propenso a errores. Un Makefile maneja esto automáticamente. Recompila sólo lo necesario. Cambia un archivo de encabezado. Make reconstruye cada archivo fuente que lo incluye. Cambia una función de utilidad. Make reconstruye solo ese archivo objeto y vuelve a vincular el ejecutable.
No es necesario estar en un sistema UNIX para utilizar esta lógica. La mayoría de los compiladores e IDE modernos incluyen características similares. Consulte la documentación de su compilador. Busque herramientas de automatización de compilación. Funcionan de la misma manera debajo del capó.
Esto nos lleva de nuevo a encabezados como stdio.h. Los incluiste en ejemplos anteriores sin explicar por qué. Son bibliotecas estándar. Alguien los escribió hace años. Los pusieron a disposición para evitarle tener que reinventar funciones básicas. Los Makefiles y las bibliotecas estándar son parte de la misma filosofía. Te permiten concentrarte en la lógica en lugar de en el texto repetitivo.
La herramienta es tan buena como sus reglas. Si sus dependencias son incorrectas, Make no podrá reconstruir lo que debería. O peor aún, generará código obsoleto. Verifique los caracteres de su pestaña. Verifique los nombres de sus archivos. Obtenga la sintaxis correcta y el compilador hará el trabajo pesado.
Quizás se pregunte si la compilación manual es cada vez más rápida. Para un solo archivo, tal vez. Pero en el momento en que tocas un encabezado en un proyecto de varios archivos, el método manual pierde. Empiezas a copiar comandos. Empiezas a cometer errores tipográficos. Empiezas a preguntarte por qué “main.o” no se actualizó.
El verdadero beneficio es pasar de escribir comandos a definir reglas. Tú defines el estado. La herramienta impone las transiciones. Es un pequeño cambio de hábito. Da sus frutos en cada construcción posterior.

























