mcpField
M
make

make

github.com/mohitmishra786開発269660 回インストール18 週間前に更新
リポジトリ

make について

C/C++プロジェクトのMakefile作成とトラブル対応を支援する、GNU Makeのスキルです。依存関係の追跡、パターンルール、ビルド設定、複数ディレクトリーの構成を扱います。

主な機能

  1. 01C/C++ Makefileの基本パターン
  2. 02依存関係の自動生成と追跡
  3. 03パターンルールと自動変数
  4. 04デバッグ・リリースビルド設定
  5. 05並列ビルドとインストール規則
  6. 06複数ディレクトリーの構成方法

活用シーン

  1. 01CプロジェクトのMakefile作成
  2. 02ヘッダー変更時の再ビルド修正
  3. 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 を使用します

コメント