9.プリプロセッサとメイクファイル

9-6. メイクの利用

ソースファイルが100個、200個になると

>lcc file1.obj file2.obj file3.obj file4.obj file5.obj file6.obj …

このようにコマンドを打つことになり、タイプミスによるエラー続発の温床になります。と説明しました。

こんなことならコンパイル・リンクのためのバッチファイルがあればいいのに・・・ということで今回はコンパイル・リンクを支援する make を紹介します。

Linux でソースで配布されているアプリケーションをインストールする時必ずといっていいほど make を利用します。
・・・それは、もうコンパイルのコマンドが make ?って思うほどです。

それで今日は make って何? という部分と使いかたについて説明します。

なお前回のファイル構成(依存関係)のままで説明します。
   ┌────┐┌────┐
   │file2.h ││file3.h │
   └────┘└────┘
    /  \  /  \
┌────┐┌────┐┌────┐
│file1.c ││file2.c ││file3.c │
└────┘└────┘└────┘
前回、一度コンパイルした後ソースファイルの改変など行った後どのファイルだけをコンパイルすればよいか説明しました。
しかし、ファイル数が膨大になると状況の把握が困難になり、コンパイルのし忘れが原因で実行ファイルを作成した後、更新した部分が適用されていなかったり、ヘッダーファイルの改変となるともっと管理しづらく最悪の場合リンクエラーが発生しチェックが大変になります。
(実際、リンクエラーはコンパイルエラーよりも対処が大変)
そんなことでは分割コンパイルの利点も無くなってしまいます。
そこで、make コマンドを利用する事によりファイルの管理を自動化させることができます。ただしバージョン管理まではしません。

※バージョン管理を支援するソフトとして RCS,CVS 等があります。
 コマンド名はci(check in), co(check out) です。
 ただしUNIX系での話です。

では、早速使い方

>make

で終わりです。後は特に指定が無い限り何もいりません。
これだけで、コンパイルが必要なファイルをコンパイルして更新しアプリケーションを完成させます。
とにかく、ソースを書き換えたら make。ラクでしょ。
これならコンパイルのし忘れやファイルの更新状態について考えなくてもいいわけです。
そしてこの make にルールを定義するために makefile を作る必要があります。
上の make とだけコマンド打っていますが、このとき makefile を参照しそこに書かれたルールにしたがってコンパイル・リンクしているのです。
この makefile は別のファイル名でもかまいません。
そのときはコマンドラインで指定する必要があります。
makefile の代わりに install というファイルをルールとして利用するとします。
コマンドラインは

>make -f install

となります。makefile 以外のファイルを指定する時はオプション -fを使用してください。

これに近い記述、Linuxを触れている人なら見たことがあると思います。
ソースをコンパイルするだけでなくアプリケーションを生成する場所もルールとして指定すればインストーラーとしても使えたりします。

注:実際にUNIX等でよく使う make install のコマンドラインはinstall というメイクファイル名でなく、 makefile 中で定義されている install ターゲットの可能性があります。

ということで最初に出てきた5つのファイルもmakefileにルールを記述するだけで、あとは make コマンドによる更新をすることにより煩わしさを解消する事ができます。

◇メイクファイルの書き方

make につかうメイクファイルの書き方について説明します。
※LSI-C以外のコンパイラの方はそれぞれコマンド行を置き換えてください

プログラムの構成は前回とと同じです。
   ┌────┐┌────┐
   │file2.h ││file3.h │
   └────┘└────┘
    /  \  /  \
┌────┐┌────┐┌────┐
│file1.c ││file2.c ││file3.c │
└────┘└────┘└────┘

それでは、早速ルールの定義といきましょう。

ルールの定義は上から順番に最終目標、次にその直前の目標という感じで定義していきます。

最終目標
その直前の目標
またその直前の目標
   ・
   ・
   ・

上のプログラム構成を例にしてまず、最終的に program.exe という実行ファイルを作るとします。

そのとき、まずメイクファイルには

program.exe :

と書きます。そのまま引き続き右側に program.exe を作るときに必要なファイルを定義します。今回はオブジェクトファイルからリンクして実行ファイルを作るので file1.obj file2.obj file3.obj が構成するファイルです。

program.exe : file1.obj file2.obj file3.obj

よって最初の記述はこのようになります。

書式:(必ずコロンの両脇は半角スペースを入れてください)
ターゲット : 依存ファイル

次に行にはターゲット program.exe のコマンドラインを書きます。

lcc -o program.exe file1.obj file2.obj file3.obj

先頭の空白はここではスペースにしていますが実際に書く時は必ずタブを入れて下さい。(ターゲット行との区別のため)

次にfile1.obj file2.obj file3.objを作るため定義をします。先の例と同じく

file1.obj : file1.c file2.h
lcc -c file1.c

file2.obj : file2.c file2.h file3.h
lcc -c file2.c

file3.obj : file3.c file3.h
lcc -c file3.c

と書きます。

これで、メイクファイルは完成です。
分割コンパイルも、更新も make 一発で完了します。