コンテンツにスキップ

Make

Make は1976年に登場して現在でも使用されているビルド自動化ツールです。

インストール

msys2 のターミナルを起動して下記コマンドを打ってインストールします。

$ pacman -S make

ビルド実行

makeMakefile という名前のファイルを読み込んで動作します。

main.cc をビルドして a.exe を生成する場合は、 Makefile というファイルを作成して次のように記述します。

1
2
a.exe: main.cc
	g++ -std=c++11 main.cc

g++ の前のインデントはタブ文字です。 スペース文字では代用できないので注意が必要です。

この Makefile がある状態で下記コマンドを実行すると a.exe がビルドされます。

$ make a.exe

a.exe: main.cc という記述は a.exe を生成するためには main.cc が必要という意味です。 a.exe のような生成したいファイルのことを ターゲット と呼びます。

a.exe を生成した後に再度実行すると次のようなメッセージが出力されます。

$ make a.exe
make: 'a.exe' は更新済みです.

a.exe を生成するために必要な main.cca.exe の更新日時を確認して、 a.exe より main.cc の方が新しい場合にのみ処理を行うことでビルド時間を短縮しており、 処理が不要と判断された場合にこのようなメッセージが出力されます。

main.cc を更新すると a.exe よりも更新日時が新しくなるためビルドが実行されます。

2行目では先頭の文字をタブ文字にし、 その後に a.exe の生成のために実施するコマンド g++ -std=c++11 main.cc を記述します。 make は行頭がタブ文字である行をコマンド行として扱う仕様で、スペース文字では代用することができません。

ファイル単位でのコンパイル

複数のソースファイルから成り立つプログラムのビルドは 一般に次のように段階を分けて実行されます。

  1. ソースファイルをコンパイルした結果をオブジェクトファイルとして保存する
  2. オブジェクトファイルをリンクする

こうすることで変更のあったソースファイルだけをコンパイルしてオブジェクトファイルを更新し、 リンクを再実行すればビルドが完了するため不要なコンパイルを省略してビルド時間を短縮することができます。

このような処理を行うためには次のような Makefile を記述します。

a.exe: main.o util.o
	g++ -std=c++11 main.o util.o

main.o: main.cc
	g++ -std=c++11 -c main.cc

util.o: util.cc
	g++ -std=c++11 -c util.cc

タスク実行

.PHONY でターゲットを擬似ターゲットとして指定することで、ファイル生成以外のタスク実行のために使用できます。

.PHONY: clean

clean:
	rm -f a.exe

.PHONY による指定を行わない場合、 ターゲットと名称が同一のファイルがあると実行不要と判断されて実行されなくなります。