Makefile: ビルド自動化

依存関係を定義して効率的にビルド。

make
ビルド自動化ツール。
ターゲット
生成するファイル。
.PHONY
ファイルを作らないターゲット。

Makefile

Basic Makefile
# Makefile の基本
# 変数
CC = gcc
CFLAGS = -Wall -Wextra -g
# ターゲット: 依存ファイル
main: main.o utils.o
$(CC) $(CFLAGS) -o main main.o utils.o
# パターンルール
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# PHONY ターゲット(ファイルを作らないターゲット)
.PHONY: clean all
clean:
rm -f *.o main
all: clean main
Bad
Terminal window
# ❌ Bad: 毎回手動でコンパイル
gcc -c main.c -o main.o
gcc -c utils.c -o utils.o
gcc main.o utils.o -o main
Good
Terminal window
# ✅ Good: make で自動化
make # ビルド
make clean # クリーン
make all # フルビルド

パターン

Variables, Auto-vars
# 自動変数
# $@ - ターゲット名
# $< - 最初の依存ファイル
# $^ - すべての依存ファイル
# 完全な例
CC = gcc
CFLAGS = -Wall -Wextra -std=c11
LDFLAGS = -lm
SRC = main.c utils.c parser.c
OBJ = $(SRC:.c=.o)
TARGET = app
$(TARGET): $(OBJ)
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
%.o: %.c %.h
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean install
clean:
rm -f $(OBJ) $(TARGET)
install: $(TARGET)
cp $(TARGET) /usr/local/bin/
Tip: タブ文字が必須。スペースではエラー。

合格ライン

基本的な Makefile を書ける
$@, $<, $^ を使える