目次
はじめに:Makefileとは何か?
Makefile(メイクファイル)とは、プログラムのビルド(コンパイルやリンクなど)を自動化するための設定ファイルです。
C言語などのソースコードをビルドする際に使われるツール「make」がこのMakefileを読み取り、記述された手順通りに処理を進めます。
✅ ポイント
Makefile は「何を」「どんな順序で」「どうやって」実行すべきかを定義するレシピのようなものです。
なぜMakefileが必要か?
たとえば、以下のようなC言語のプロジェクトを考えてみましょう。
main.c
util.c
util.h
これを手動でコンパイルするには:
gcc -c main.c
gcc -c util.c
gcc -o myprogram main.o util.o
しかし、ファイルが多くなると手動では非効率ですし、変更があったファイルだけを再コンパイルするのも大変です。
→ そこで登場するのが Makefile です。
Makefileの基本構文
ターゲット: 依存ファイル
<TAB> コマンド
用語解説
| 用語 | 説明 |
|---|---|
| ターゲット | 作成したいファイル(例:myprogram) |
| 依存ファイル | ターゲットを作るために必要なファイル(例:.cや.hなど) |
| コマンド | ターゲットを生成するための実行命令(必ず Tab文字 で始める) |
例:CプログラムのMakefile
myprogram: main.o util.o
gcc -o myprogram main.o util.o
main.o: main.c util.h
gcc -c main.c
util.o: util.c util.h
gcc -c util.c
clean:
rm -f *.o myprogram
説明
myprogramを作るにはmain.oとutil.oが必要main.oを作るにはmain.cとutil.hが必要cleanはクリーンアップ用の「おまけターゲット」(中間ファイル削除)
makeコマンドの使い方
make # デフォルト(最初のターゲット)を実行
make clean # cleanターゲットのコマンドを実行
自動的に再コンパイルされる条件
makeは「依存ファイルが更新されていれば、そのターゲットを再生成」します。
つまり、main.c を変更した場合だけ main.o を再コンパイルします。
これにより無駄な再ビルドを避け、ビルド時間を短縮できます。
便利なMakefileの機能
1. 変数(マクロ)
CC = gcc
CFLAGS = -Wall
myprogram: main.o util.o
$(CC) $(CFLAGS) -o myprogram main.o util.o
2. パターンルール(%.o: %.c)
%.o: %.c
$(CC) $(CFLAGS) -c $<
$<は「最初の依存ファイル」$@は「ターゲット名」
よくあるmakeターゲット例
| ターゲット名 | 役割 |
|---|---|
all | すべてのターゲットを一括ビルド |
clean | 中間ファイルを削除 |
install | ファイルの配置(インストール) |
test | テストスクリプトの実行 |
help | Makefileの説明表示 |
Makefileが使われる場面
- C/C++ プロジェクトのビルド自動化
- カーネルモジュールのビルド(Linux)
- DockerやCI/CDのワークフローでも併用
- 単純なタスクランナーとして使う(Python/Goでも便利)
🧱 よく使う特殊変数
| 変数 | 意味 |
|---|---|
$@ | ターゲット名(target) |
$< | 最初の依存関係 |
$^ | すべての依存関係(重複なし) |
$? | 更新された依存関係 |
main.o: main.c
gcc -c $< -o $@
📋 サンプル
CC = gcc
CFLAGS = -Wall
TARGET = app
OBJS = main.o util.o
$(TARGET): $(OBJS)
$(CC) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
.PHONY: clean
補足
- Makefile中のコメントは
#を使用 - コマンドを表示せずに実行するには先頭に
@をつける:@echo "Building..." - make は自動的に変更時刻を見て再ビルド対象を判断してくれる
- インデントは必ずTab!スペースでは動かない
- 依存関係を正しく記述する
- 拡張子
.mkで分割管理も可能
おわりに:Makefileを学ぶ意味
Makefileは最初はとっつきにくいかもしれませんが、理解すればビルドの効率化・再現性向上に非常に有効です。
シンプルなプロジェクトからでも、ぜひ一度書いてみましょう!

コメント