もくじ
MAKEとは
MAKEの使い方
メイクファイルの定義
マクロの使い方
その他の便利な機能
MAKEとは
MAKE とは、コマンドラインでのコンパイル、リンクを支援するツールです。
ソースファイルのタイムスタンプを調べ、ソースファイルに変更があったらコンパイルをするという働きをします。
実行ファイルがひとつのファイルから成り立っているなら
MAKE の有用性はあまりありませんが、複数のファイルが関係する場合 MAKE を使うと効率的に処理してくれます。
例えば、ヘッダーファイルを更新した場合、整合性を保つためにそのヘッダーファイルを使用しているソースを再コンパイルしなくてはなりませんが、MAKE
を使うことによってそれらを自動化し、管理を軽減させてくれます。
MAKEの使い方
メイクファイルにコンパイル、リンクをするためのルールを定義し、MAKE
を起動します。
MAKE はデフォルトで、makefile もしくは makefile.mak を読み込みます。ほかのファイルを指定する場合はオプション
-f を使います。オプションは大/小文字が区別されます。
ファイルの指定
make -f sample.mak
比較したファイルのタイムスタンプを表示
make -m
実行するコマンドを表示のみし、実行はしない (メイクファイルのデバッグ用)
make -n
タイムスタンプを無視し、すべてを作成
make -B
メイクファイルの定義
MAKE はメイクファイルの定義次第で複雑な処理もできますが、ここでは基本的なルールの定義を説明します。
ルールには「暗黙のルール」と「明示的なルール」、そして「関連付け」があります。
★★★ 1 ... 暗黙のルールの定義 ★★★
例 *.cpp を bcc32 でコンパイルして *.obj を生成する方法
.cpp.obj:
bcc32 -c $<
$< はマクロで、ソースファイル名+拡張子に展開されます。
bcc32 へのオプション -c はコンパイルのみの指定を意味する。
★★★ 2 ... 明示的なルールの定義 ★★★
例 main.obj と sub.obj を bcc32 でリンクして sample.exe
を生成する方法
sample.exe: main.obj sub.obj
bcc32 -e$* $**
$** はソースファイルすべて、$* はターゲットファイル名に展開され以下のようになります。
bcc32 -esample main.obj sub.obj
bcc32 へのオプション -e は実行ファイル名の指定を意味する。
★★★ 3 ... 関連付け (どれがどのファイルに依存しているのかを定義)
★★★
例 main.obj が sub.h をインクルードし、sub.obj も sub.h
をインクルードしている場合
main.obj: main.cpp sub.h
sub.obj: sub.cpp sub.h
main.obj は、main.cpp と sub.h からタイムスタンプ (更新された時間)
で比較され、更新の余地があるなら、前述の暗黙のルールでコンパイルされます。
sub.obj は、sub.cpp と sub.h から同じく比較され、更新の必要がある場合更新されます。
マクロの使い方
コンパイラに与えるオプションなどを、マクロを使って一つにまとめておけば、管理がしやすくなります。
マクロの定義
マクロ名 = 展開される文字列
マクロの使い方
$(マクロ名)
例 aaa.cpp bbb.cpp ccc.cpp から sample.exe を生成
cc = bcc32
opt = -d -O
obj = aaa.obj bbb.obj ccc.obj
lib = test.lib example.lib
exe = sample
.cpp.obj:
$(cc) $(opt) -c $<
$(exe).exe: $(obj)
$(cc) $(opt) -e$* $** $(lib)
aaa.obj: aaa.cpp
bbb.obj: bbb.cpp
ccc.obj: ccc.cpp
その他の便利な機能
通常 MAKE はエラーが出ると処理を中断します。しかし、コマンドラインで使われるプログラムの中には戻り値を設定していないものもあり、その結果無意味な値を返し、MAKE
がエラーと勘違いして処理が中断されてしまう場合もあります。
そんなときは、コマンドの前に - をつけると戻り値を無視してくれます。
例 エラーが出ても続行
.cpp.obj:
-bcc32 -c $<
処理するファイル数が多くなるとコマンドラインに納まらない場合も出てきます。
そのときは &&| と | を使うと、命令の一部をファイルに書き出すことができます。
例
sample.exe: aaa.obj bbb.obj ccc.obj
bcc32 @&&|
$(opt)
-e$*
$**
$(lib)
|
&&| から | までを一時的なファイルに書き出します。
※終わりの | は行の先頭になくてはならない。
bcc32 の後の @ は、ファイルから命令を読み込むときに指定します。
ただ単に前後の行をつなげたいという場合は、\ を使います。
例
opt = -d \
-DDEBUG \
-O
|