ビルドシステムの使い方

Makefileという名前のファイルを作成

Makefile内に次のように記述する

program : 事前用件
[TAB] レシピ

例えば

program : source
[TAB] cat source > program

事前用件の数を増やすこともできる

source : source01 source02 source03
    cat source01 source02 source03 > source

また、makeを引数を付けずに実行すると、一番上に書かれたルールが実行される。

引数としてターゲットを指定すると、そのターゲットのルールと、依存するルールが実行される。

ただし、ターゲットと同じファイル名が存在すると、ルールは実行されない。

変数

Makefile内で変数を使うこともできる。

variable = foobar

target : $(variable)

自動変数

$@

target :
    echo $@

このMakefileを実行すると次のようになる。

% make
echo target

$<

target : A B C
    echo $<

このMakefileを実行すると次のようになる。

% make
echo A

$^

target : A B C
    echo $^

このMakefileを実行すると次のようになる。

$ make
echo A B C

自動変数の組み合わせ

target : prerequisite
    cat prerequisite > target

と書く代わりに次のように書ける。

target : prerequisite
    cat $< > $@

PHONYターゲット

PHONYターゲットとは、ファイル名を意味せず、単にレシピを実行するターゲット名としてのみ機能するターゲットのこと。

hi :
    echo hi

hello :
    echo hello

これを実行すると次のようになる。

$ make
echo hi
hi

ちなみにmakeを引数を付けずに実行すると、一番上に書かれたルールが実行される。

また、引数としてターゲットを指定すると、そのターゲットのルールと、依存するルールが実行される。

$ make hi
echo hi
hi
$ make hello
echo hello
hello

ただし、ターゲットと同じファイル名が存在すると、

$ touch hello
$ make hello
make: 'hello' is up to date.

このように、ルールは実行されない。

hello :
    echo hello

.PHONY : hello

Makefileテンプレ

gcc_options = -std=c++17 -Wall --pedantic-errors

program : main.cpp all.h all.h.gch
    g++ $(gcc_options) -include all.h $< -o $@

all.h.gch : all.h
    g++ $(gcc_options) -x c++-header -o $@ $<

run : program
    ./program

clean :
    rm -f ./program
    rm -f ./all.h.gch

.PHONY : run clean

参考

cpp-intro/002-build.md at master · EzoeRyou/cpp-intro · GitHub