wandres.dev
HERRERO · Make y el tooling clásico

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.

⏱ 14 min

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.

🎯 Al terminar esta lección sabrás
  • 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 receta empieza con TAB (el error nº1)

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.

Make no es solo build: es un motor de dependencias

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 Makefiles
  1. Escribe un Makefile explícito para un proyecto de dos archivos (ojo al TAB).
  2. Refactorízalo con variables (CC, CFLAGS) y variables automáticas ($@, $^, $<).
  3. Añade una regla patrón %.o: %.c y un objetivo .PHONY: clean.
  4. Cambia un solo archivo y confirma que make recompila solo lo necesario.