MAKEの使い方講座


もくじ
  • 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
     


     
     
     
    もどる トップ すすむ
    2001年4月21日更新

    Copyright (C) Saito Satoru. All rights reserved.