Use when explaining System V AMD64, ARM AAPCS, RISC-V psABI, stack frames, variadic calls, or FFI register rules. Not for the Rust FFI binding layer: use rust-ffi.
The English summary is being prepared. Showing the original description.
Use when writing or debugging Makefiles, understanding pattern rules and automatic dependency generation, managing CFLAGS/LDFLAGS, or diagnosing incremental build, phony targets, or recursive make.
The English summary is being prepared. Showing the original description.
See how to installReview the instructions the agent will receive before you install.
Idiomatic Makefile patterns for C/C++ projects: phony targets, pattern rules, automatic dependency generation, and incremental-build hygiene. Grounded against GNU Make 4.4.
| Field | Bound contract |
|---|---|
| Trigger | The task writes or debugs a Makefile, sets up pattern rules or automatic dependency generation, manages CFLAGS/LDFLAGS, converts ad-hoc compile commands into a Makefile, or diagnoses incremental build failures. |
| Authority | Reversible local: writes only Makefile/*.mk files and local build outputs; rollback is version control plus make clean. No remote mutation. |
| Side effect | make runs the compiler and writes objects and binaries into the tree or build directory. |
| Done | make builds the target incrementally (a second run reports nothing to do) and make clean removes the outputs. |
.c/.cpp files and headers live.CC, CFLAGS, LDFLAGS, LDLIBS.make builds and make clean removes outputs.CC := gcc
CFLAGS := -std=c23 -Wall -Wextra -g -O2
LDFLAGS :=
LDLIBS :=
SRCS := $(wildcard src/*.c)
OBJS := $(SRCS:src/%.c=build/%.o)
TARGET := build/prog
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
build/%.o: src/%.c | build
$(CC) $(CFLAGS) -c -o $@ $<
build:
mkdir -p build
clean:
rm -rf build
Automatic variables: $@ is the target, $< the first prerequisite, $^ all prerequisites deduplicated, $* the pattern stem, $(@D) the target's directory part.
-MMD writes a .d file per object; -MP adds phony targets for headers so deleting one does not break the build. Done when: touching a header rebuilds exactly its dependents.DEPFLAGS = -MMD -MP
DEPS := $(OBJS:.o=.d)
build/%.o: src/%.c | build
$(CC) $(CFLAGS) $(DEPFLAGS) -MF $(@:.o=.d) -c -o $@ $<
-include $(DEPS) # leading - ignores missing .d files on first build
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
%.s: %.c
$(CC) $(CFLAGS) -S -o $@ $<
make BUILD=debug switches flags and make V=1 shows full commands.BUILD ?= release
ifeq ($(BUILD),debug)
CFLAGS += -g -Og -DDEBUG
else
CFLAGS += -O2 -DNDEBUG
endif
Q := $(if $(V),,@)
build/%.o: src/%.c | build
@echo " CC $<"
$(Q)$(CC) $(CFLAGS) -c -o $@ $<
DESTDIR and PREFIX. Done when: make install DESTDIR=/tmp/stage stages the tree.PREFIX ?= /usr/local
install: $(TARGET)
install -d $(DESTDIR)$(PREFIX)/bin
install -m 0755 $(TARGET) $(DESTDIR)$(PREFIX)/bin/
.mk files, not recursive make. Recursive make fragments the dependency graph and breaks parallelism. Done when: one top-level Makefile sees every prerequisite.# Makefile
include lib/module.mk
include src/app.mk
# lib/module.mk
LIB_SRCS := $(wildcard lib/*.c)
LIB_OBJS := $(LIB_SRCS:lib/%.c=build/lib_%.o)
OBJS += $(LIB_OBJS)
build/lib_%.o: lib/%.c
$(CC) $(CFLAGS) -c -o $@ $<
| Error | Cause | Fix |
|---|---|---|
No rule to make target 'foo.o' | Missing source or rule | Check the source path and pattern rule |
Nothing to be done for 'all' | Targets up to date | Touch a source or run make clean |
Circular dependency dropped | Target depends on itself | Trace the prerequisite chain |
missing separator | Spaces where a tab belongs | Recipes need a literal tab |
multiple target patterns | Bad pattern rule syntax | Check % placement |
| Rebuilds everything | Wrong timestamps or missing .PHONY | Check date; mark all and clean phony |
| Header edit rebuilds nothing | No dependency tracking | Add -MMD -MP and -include $(DEPS) |
Useful flags: make -j"$(nproc)" parallel, make -O synchronizes output, make -n dry run, make -B force rebuild, make -k keep going, make -p print the rule database, make --warn-undefined-variables catch typos.
For the full variable, function, and special-target reference see references/cheatsheet.md.
make does nothing after a header edit: dependency files are missing; add -MMD -MP and -include $(DEPS).missing separator: convert the recipe's leading spaces to a tab.= defers expansion to use time, := expands at definition; pick := unless late expansion is the point. ::= is the POSIX immediate form, available in GNU Make 4.4 and later..mk files from the top Makefile instead of $(MAKE) -C.A Makefile that builds incrementally, tracks header dependencies, supports clean and install, and survives make -j. For debugging tasks, the diagnosed cause and the minimal fix.
No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
Use when explaining System V AMD64, ARM AAPCS, RISC-V psABI, stack frames, variadic calls, or FFI register rules. Not for the Rust FFI binding layer: use rust-ffi.
The English summary is being prepared. Showing the original description.
Use when configuring ADC sampling time, DMA-driven ADC, calibration, or DAC channel setup on bare-metal MCUs. Not for the DMA stream itself: use dma-baremetal.
The English summary is being prepared. Showing the original description.
Use when creating AF_XDP sockets, configuring UMEM and XSK rings, writing an XDP redirect program, or choosing copy versus zero-copy mode. Not for full kernel bypass: use dpdk.
The English summary is being prepared. Showing the original description.
Use when a completed session needs an agent-environment retrospective. Not for an engineering retrospective from telemetry: use engineering-retrospective.
The English summary is being prepared. Showing the original description.
Use when a redacted, trimmed agent transcript must be appended to a GitHub PR or issue body, with human approval and preview. Not for automated or model-initiated insertion.
The English summary is being prepared. Showing the original description.
Use when a repo needs agent setup, AGENTS.md added or made lean, CLAUDE.md audited, or agent instructions scored or pruned. Not for remote, credential, publish, deploy, or irreversible changes.
The English summary is being prepared. Showing the original description.