Make: ビルドの自動化

毎回コマンドを打つのは疲れる。手順書(レシピ)を書いて自動化しよう。

Makefile
ビルド手順を記述したファイル。
ターゲット
生成したいファイル(例: app, main.o)。
依存関係
ターゲットを作るのに必要なファイル(例: main.c)。これが更新されると再ビルドが走る。
賢いシェフ (The Smart Chef)

Makeは「賢いシェフ」です。Makefile(レシピ)を見て料理を作ります。 普通のシェフと違うのは、「下ごしらえ済み」の材料を見分ける能力があることです。 もし「カット野菜(オブジェクトファイル)」が既にそこにあり、しかも保存状態が新鮮(ソースコードより新しい)なら、わざわざ切り直したりしません。 変更があった材料だけを再調理するので、フルコース(巨大プロジェクト)でも一瞬で完成します。

賢いビルドツール

ファイが増えると gcc a.c b.c c.c ... と打つのが大変になります。 make コマンドは、Makefile という手順書に従ってビルドを自動化します。

すごいのは「更新されたファイルだけをコンパイルし直す(差分ビルド)」 点です。数千ファイルのプロジェクトでも、1行変えただけなら一瞬でビルドが終わります。

基本構文

Warning: Makefileのインデントには必ず「Tab」を使います。スペースを使うとエラーになります!
Makefile
CC = gcc
CFLAGS = -Wall
# 最終成果物 app を作るルール
app: main.o math_utils.o
$(CC) $(CFLAGS) -o app main.o math_utils.o
# main.o を作るルール
main.o: main.c
$(CC) $(CFLAGS) -c main.c
# math_utils.o を作るルール
math_utils.o: math_utils.c
$(CC) $(CFLAGS) -c math_utils.c
# お掃除
clean:
rm -f *.o app

実践テクニック

変数を使う

<code>CC = gcc</code> や <code>CFLAGS = -Wall</code> のようにコンパイラやオプションを変数にしておくと、後で変更するのが簡単になります。

演習課題

課題1: 自動化
前のページで作った3つのファイルをビルドするMakefileを作成し、makeコマンド一発で実行ファイルができることを確認してください。

合格ライン

Makefileのインデントがタブであることを知っている
make clean で生成物を削除できる