Make

mohitmishra786/low-level-dev-skills/skills/build-systems/make

作者 mohitmishra786bdc58472fa9f无许可证253 个星标收录于 2026年10月9日更新于 2026年10月9日仓库3个月前更新

GNU Make skill for C/C++ build systems. Use when writing or debugging Makefiles, understanding pattern rules and automatic dependency generation, managing CFLAGS/LDFLAGS, converting ad-hoc compile commands into maintainable Makefiles, or diagnosing incremental build issues. Activates on queries about Makefiles, make targets, pattern rules, phony targets, dependency tracking, recursive make, or make errors.

AI 生成的概览

指导编写和调试用于 C/C++ 构建的 GNU Makefile,涵盖模式规则、依赖跟踪和常见错误。

功能
提供适用于 C 和 C++ 项目的惯用 GNU Makefile 模式,包括最小构建文件、模式规则、使用 -MMD -MP 的自动依赖生成以及调试/发布配置。它讲解自动变量、并行与详细输出构建、安装目标以及多目录项目布局。它还列出常见 make 错误及其原因和修复方法,并指向随附的速查表以查阅变量和函数参考。
适用场景
在为 C 或 C++ 项目编写或调试 Makefile、添加头文件依赖跟踪、将临时编译命令转换为可维护的 Makefile,或诊断增量构建问题和 make 错误时使用。
运行要求
除智能体本身外无需脚本或工具,仅为说明性内容。它引用随附的速查表文件,并假定使用者熟悉 GNU Make、gcc 等 C/C++ 编译器以及用于运行 make 命令的 shell。

GNU Make

Purpose

Guide agents through idiomatic Makefile patterns for C/C++ projects: phony targets, pattern rules, automatic dependency generation, and common build idioms.

Triggers

  • "How do I write a Makefile for my C project?"
  • "My Makefile rebuilds everything every time"
  • "How do I add dependency tracking to Make?"
  • "What does $@, $<, $^ mean?"
  • "I'm getting 'make: Nothing to be done for all'"
  • "How do I convert my shell compile script to a Makefile?"

Workflow

1. Minimal correct Makefile for C

makefile
CC      := gccCFLAGS  := -std=c11 -Wall -Wextra -g -O2LDFLAGS :=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:

  • $@ — target name
  • $< — first prerequisite
  • $^ — all prerequisites (deduplicated)
  • $* — stem (the % part in a pattern rule)
  • $(@D) — directory part of $@

2. Automatic dependency generation

Without this, changing a header doesn't trigger a rebuild of .c files that include it.

makefile
CC      := gccCFLAGS  := -std=c11 -Wall -Wextra -g -O2DEPFLAGS = -MMD -MP            # -MMD: generate .d file; -MP: phony targets for headers
SRCS    := $(wildcard src/*.c)OBJS    := $(SRCS:src/%.c=build/%.o)DEPS    := $(OBJS:.o=.d)TARGET  := build/prog
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)	$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
build/%.o: src/%.c | build	$(CC) $(CFLAGS) $(DEPFLAGS) -MF $(@:.o=.d) -c -o $@ $<
-include $(DEPS)    # '-' ignores errors on first build (no .d files yet)
build:	mkdir -p build
clean:	rm -rf build

3. Pattern rules cheatsheet

makefile
# Compile C%.o: %.c	$(CC) $(CFLAGS) -c -o $@ $<
# Compile C++%.o: %.cpp	$(CXX) $(CXXFLAGS) -c -o $@ $<
# Generate assembly%.s: %.c	$(CC) $(CFLAGS) -S -o $@ $<
# Run a tool on each filebuild/%.processed: src/%.raw | build	mytool $< > $@

4. Common Make patterns

Debug and release builds
makefile
BUILD ?= release
ifeq ($(BUILD),debug)  CFLAGS += -g -Og -DDEBUGelse  CFLAGS += -O2 -DNDEBUGendif

Usage: make BUILD=debug

Parallel builds
bash
make -j$(nproc)     # use all CPUsmake -j4            # exactly 4 jobs

Add -Otarget (or -O) for ordered output: make -j$(nproc) -O

Verbose output
makefile
# In Makefile: suppress with @build/%.o: src/%.c | build	@echo "  CC  $<"	@$(CC) $(CFLAGS) -c -o $@ $<

Override silence: make V=1 if you guard with $(V):

makefile
Q := $(if $(V),,@)build/%.o: src/%.c	$(Q)$(CC) $(CFLAGS) -c -o $@ $<
Installing
makefile
PREFIX ?= /usr/local
install: $(TARGET)	install -d $(DESTDIR)$(PREFIX)/bin	install -m 0755 $(TARGET) $(DESTDIR)$(PREFIX)/bin/

5. Multi-directory projects

For medium projects, avoid recursive make (fragile, slow). Use a flat Makefile that includes sub-makefiles:

makefile
# project/Makefileinclude lib/module.mkinclude src/app.mk
makefile
# lib/module.mkLIB_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 $@ $<

6. Common errors

ErrorCauseFix
No rule to make target 'foo.o'Missing source or ruleCheck source path and pattern rule
Nothing to be done for 'all'Targets up to dateTouch a source file or run make clean
Circular dependency droppedTarget depends on itselfCheck dependency chain
missing separatorTab vs spacesRecipes must use a tab, not spaces
*** multiple target patternsPattern rule syntax errorCheck % placement
Rebuilds everything every timeTimestamps wrong, or PHONY missingCheck date; ensure all is .PHONY
Header change not detectedNo dep trackingAdd -MMD -MP and -include $(DEPS)

For a full variable and function reference, see references/cheatsheet.md [blocked].

Related skills

  • Use skills/build-systems/cmake for CMake-based projects
  • Use skills/build-systems/ninja for Ninja as a make backend
  • Use skills/compilers/gcc for CFLAGS details

来源与署名

来源:mohitmishra786/low-level-dev-skills位于skills/build-systems/make提交bdc5847

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架