make について
C/C++プロジェクトのMakefile作成とトラブル対応を支援する、GNU Makeのスキルです。依存関係の追跡、パターンルール、ビルド設定、複数ディレクトリーの構成を扱います。
主な機能
- 01C/C++ Makefileの基本パターン
- 02依存関係の自動生成と追跡
- 03パターンルールと自動変数
- 04デバッグ・リリースビルド設定
- 05並列ビルドとインストール規則
- 06複数ディレクトリーの構成方法
活用シーン
- 01CプロジェクトのMakefile作成
- 02ヘッダー変更時の再ビルド修正
- 03重複ビルドやルールエラーの調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill makeインストール後、Claude Code で/makeを入力して読み込まれたか確認します。
同梱ファイルreferences/cheatsheet.md
詳細
GNU Make
目的
C/C++ プロジェクト向けの慣用的な Makefile パターンについて、エージェントをガイドします。phony ターゲット、パターンルール、自動依存関係生成、一般的なビルドのイディオムを扱います。
トリガー
- 「C プロジェクト用の Makefile はどう書けばよいですか?」
- 「Makefile を実行するたびにすべてが再ビルドされます」
- 「Make に依存関係の追跡を追加するにはどうすればよいですか?」
- 「
$@、$<、$^は何を意味しますか?」 - 「'make: Nothing to be done for all' が表示されます」
- 「シェルのコンパイルスクリプトを Makefile に変換するにはどうすればよいですか?」
ワークフロー
1. C 向けの最小限かつ正しい Makefile
CC := gcc
CFLAGS := -std=c11 -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
自動変数:
$@— ターゲット名$<— 最初の前提条件$^— すべての前提条件(重複を除去)$*— ステム(パターンルールの%部分)$(@D)—$@のディレクトリ部分
2. 自動依存関係生成
これがないと、ヘッダーを変更しても、そのヘッダーをインクルードする .c ファイルは再ビルドされません。
CC := gcc
CFLAGS := -std=c11 -Wall -Wextra -g -O2
DEPFLAGS = -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. パターンルールのチートシート
# 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 file
build/%.processed: src/%.raw | build
mytool $< > $@
4. よく使われる Make のパターン
デバッグビルドとリリースビルド
BUILD ?= release
ifeq ($(BUILD),debug)
CFLAGS += -g -Og -DDEBUG
else
CFLAGS += -O2 -DNDEBUG
endif
使用方法:make BUILD=debug
並列ビルド
make -j$(nproc) # use all CPUs
make -j4 # exactly 4 jobs
出力を順序どおりにするには -Otarget(または -O)を追加します:make -j$(nproc) -O
詳細出力
# In Makefile: suppress with @
build/%.o: src/%.c | build
@echo " CC $<"
@$(CC) $(CFLAGS) -c -o $@ $<
$(V) を使って制御している場合は、make V=1 で非表示設定を上書きできます:
Q := $(if $(V),,@)
build/%.o: src/%.c
$(Q)$(CC) $(CFLAGS) -c -o $@ $<
インストール
PREFIX ?= /usr/local
install: $(TARGET)
install -d $(DESTDIR)$(PREFIX)/bin
install -m 0755 $(TARGET) $(DESTDIR)$(PREFIX)/bin/
5. 複数ディレクトリのプロジェクト
中規模のプロジェクトでは、再帰的な make は避けてください(壊れやすく、遅いため)。サブ Makefile をインクルードするフラットな Makefile を使用します:
# project/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 $@ $<
6. よくあるエラー
| エラー | 原因 | 対処方法 |
|---|---|---|
No rule to make target 'foo.o' | ソースまたはルールがありません | ソースパスとパターンルールを確認します |
Nothing to be done for 'all' | ターゲットは最新の状態です | ソースファイルに touch を実行するか、make clean を実行します |
Circular dependency dropped | ターゲットが自身に依存しています | 依存関係の連鎖を確認します |
missing separator | タブとスペースの混在 | レシピにはスペースではなくタブを使用する必要があります |
*** multiple target patterns | パターンルールの構文エラー | % の配置を確認します |
| 実行するたびにすべてが再ビルドされる | タイムスタンプが正しくないか、PHONY がありません | date を確認し、all が .PHONY であることを確認します |
| ヘッダーの変更が検出されない | 依存関係の追跡がありません | -MMD -MP と -include $(DEPS) を追加します |
変数と関数の完全なリファレンスについては、references/cheatsheet.md を参照してください。
関連スキル
- CMake ベースのプロジェクトには
skills/build-systems/cmakeを使用します - Make のバックエンドとして Ninja を使用する場合は
skills/build-systems/ninjaを使用します - CFLAGS の詳細については
skills/compilers/gccを使用します
コメント
Markdown 対応