Saltar a contenido

Apéndice G — Cheatsheet de Makefile

Makefile de referencia (proyecto multi-archivo)

# ---- Configuración ----
CC      := gcc
CFLAGS  := -std=c17 -Wall -Wextra -Wpedantic -Wshadow -g
LDFLAGS :=
LDLIBS  :=

SRC_DIR := src
OBJ_DIR := build
BIN     := programa

SRC := $(wildcard $(SRC_DIR)/*.c)
OBJ := $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
DEP := $(OBJ:.o=.d)

# ---- Reglas ----
all: $(BIN)

$(BIN): $(OBJ)
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
    $(CC) $(CFLAGS) -MMD -MP -c $< -o $@

$(OBJ_DIR):
    mkdir -p $@

# Compilaciones especiales
debug:   CFLAGS += -O0 -fsanitize=address,undefined
debug:   clean all
release: CFLAGS += -O2 -DNDEBUG
release: clean all

test: $(BIN)
    ./$(BIN) --test

clean:
    $(RM) -r $(OBJ_DIR) $(BIN)

-include $(DEP)          # dependencias automáticas de cabeceras

.PHONY: all debug release test clean

Conceptos clave

Elemento Significado
target: prereqs Regla: cómo construir target a partir de prereqs
$@ El target actual
$< El primer prerrequisito
$^ Todos los prerrequisitos
$* El stem (parte que casa con %)
% Comodín en reglas de patrón
:= Asignación inmediata (recomendada)
?= Asignar solo si no está definida
+= Añadir
.PHONY Targets que no son archivos

Tabulaciones, no espacios

Las recetas de Make deben indentarse con un tabulador real, no con espacios. Es la fuente nº 1 de errores *** missing separator.

Variables automáticas frecuentes

$(wildcard *.c)              # lista de archivos que casan
$(patsubst %.c,%.o,$(SRC))   # sustitución de patrón
$(SRC:.c=.o)                 # forma corta de lo anterior
$(shell uname -s)            # salida de un comando
$(addprefix build/,$(OBJ))   # añadir prefijo

Generación automática de dependencias

-MMD -MP hace que el compilador emita archivos .d con las dependencias de cabeceras; -include $(DEP) las incorpora, de modo que cambiar un .h recompila solo lo necesario.

Más en el Capítulo 10. Para proyectos multiplataforma, considera CMake (también en el cap. 10).