Make y el tooling clásico
Make es omnipresente: el kernel de Linux y medio mundo lo usan. Entiende reglas, dependencias y variables, y cuándo elegir Make, Meson o CMake.
Aunque Meson sea más cómodo para proyectos nuevos, Make es cultura general obligatoria en sistemas: está en todas partes, desde el kernel de Linux hasta scripts de build de cualquier proyecto. Entender su modelo —reglas y dependencias— te deja leer y mantener casi cualquier base de código en C.
- El modelo de Make: objetivos, prerrequisitos y recetas.
- Variables y reglas automáticas.
- Objetivos “phony” y las trampas clásicas.
- Cuándo Make, Meson o CMake.
El modelo de Make
Make se basa en una idea simple: un objetivo depende de unos prerrequisitos, y si estos son más nuevos que el objetivo, ejecuta una receta para reconstruirlo. Así solo recompila lo que cambió.
prog: main.o mates.o # objetivo: prerrequisitos
gcc main.o mates.o -o prog # receta (¡empieza con TAB, no espacios!)
main.o: main.c mates.h
gcc -std=c23 -Wall -Wextra -c main.c
mates.o: mates.c mates.h
gcc -std=c23 -Wall -Wextra -c mates.c
make # construye el primer objetivo (prog)
make mates.o # construye un objetivo concreto
La trampa histórica de Make: las líneas de receta deben empezar con un carácter tabulador, no con espacios. Un editor que convierte tabs en espacios te da el críptico error “missing separator”. Configura tu editor para respetar tabs en Makefiles. Es el rito de paso de todo el que aprende Make.
Variables y reglas automáticas
Un Makefile realista usa variables y las variables automáticas de Make ($@ = el objetivo, $^ = todos los prerrequisitos, $< = el primero):
CC := gcc
CFLAGS := -std=c23 -Wall -Wextra -Wpedantic -O2 -g
OBJ := main.o mates.o
prog: $(OBJ)
$(CC) $^ -o $@ # $^ = main.o mates.o, $@ = prog
%.o: %.c # regla patrón: cualquier .o desde su .c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -f $(OBJ) prog
Objetivos phony
Objetivos como clean o all no producen un archivo con ese nombre. Márcalos .PHONY para que Make no se confunda si existe un archivo llamado clean:
.PHONY: all clean test
Cuándo cada herramienta
Make
Omnipresente, cero dependencias, control total. Ideal para proyectos pequeños y para entender cómo funciona todo. Verboso a gran escala.
Meson
Moderno, rápido, ergonómico. La mejor opción para proyectos C nuevos. Genera Ninja.
CMake
El estándar de facto en C/C++ multiplataforma. Más complejo, pero omnipresente en la industria.
La idea profunda de Make trasciende compilar C: es un motor genérico de “reconstruir X si sus dependencias cambian”. Se usa para generar documentación, procesar datos, orquestar pipelines — cualquier cosa expresable como “este resultado depende de estas entradas”. Entender el modelo objetivo↔prerrequisitos↔receta te da una herramienta mental que aplicarás mucho más allá de C. Y aunque uses Meson a diario, sabrás leer el Makefile del kernel, contribuir a proyectos que lo usan, y depurar builds ajenos. En sistemas, Make no es opcional: es alfabetización.
- Escribe un Makefile explícito para un proyecto de dos archivos (ojo al TAB).
- Refactorízalo con variables (
CC,CFLAGS) y variables automáticas ($@,$^,$<). - Añade una regla patrón
%.o: %.cy un objetivo.PHONY: clean. - Cambia un solo archivo y confirma que
makerecompila solo lo necesario.