make 前:もっとも簡単な例 次:マクロの利用

makeの第一歩: 複数ファイルの場合

makeの本領は、複数のソースファイルからなるプログラムの場合です。 このページのイントロダクションmakeって何するもん?の例に戻って説明しましょう。

依存関係の表現

サンプルのmycatは、3つのファイル、mycat.cgetline.ccopy.cから出来ていて、これらから実行ファイルmycatを作るには

      $ gcc -c mycat.c 
      $ gcc -c getline.c
      $ gcc -c copy.c
      $ gcc mycat.o getline.o copy.o -o mycat 
とするのでした。 これを良くみて、各ファイル間の依存関係 を考えましょう。 この例ではこれだけですね。 この依存関係をMakefileの中に書きこんでやればよいのです。書式は
        ターゲット: ソース 
です。 ターゲットがソースに依存し、そのソースによりターゲットが生成されるということを表わします。 具体例では次のようになります。
        mycat:          mycat.o getline.o copy.o
        mycat.o:        mycat.c
        getline.o:      getline.c
        copy.o:         copy.c 
これらをMakefileに書き込んでmakeを実行します。 (注: あとで省略記法を説明します!) 必要ならばCCやCFLAGSなどの設定も書きこんでおきましょう。
      $ make
      gcc -Wall -O2   -c mycat.c -o mycat.o
      gcc -Wall -O2   -c getline.c -o getline.o
      gcc -Wall -O2   -c copy.c -o copy.o
      gcc   mycat.o getline.o copy.o   -o mycat
      $ ls
      Makefile copy.c copy.o getline.c getline.o mycat mycat.c mycat.o 

mycatが出来ていますね。

なお、引数なしでmakeを実行すると、makeは最初に書かれたターゲット(例ではmycat:)を生成することを目標に動きます。 他のターゲットは、その過程で必要がなければ生成されません。


推論機構による省略

実は、上で書いたMakefileの後半の3行、

        mycat.o:        mycat.c
        getline.o:      getline.c
        copy.o:         copy.c 

は不要です。 というのは、makeは、mycat.oはmycat.cから作るもの、getline.oはgetline.cから作るもの、、、と知っているのです。 これはファイル名のサッフィクス(.oや.c)から判断しています。 だから

        mycat:  mycat.o getline.o copy.o 
とだけMakefileに書いておけばよく、複数ファイルの場合もたった一行で十分なのです。 この一行だけのMakefileでの、makeの動作を追ってみましょ う。
  1. makeはとりあえずmycatを作ろうとします。
  2. それにはまずmycat.oが必要です。
  3. makeは、mycat.oのソースはmycat.cだと知っています。
  4. mycat.oが無い、またはmycat.oがmycat.cより古いとすれば、新しくmycat.oを作らなければなりません。
  5. さらにmakeは.cで終わるファイルはCのソースと知っていているので、Cのコンパイラを使ってmycat.oを作ります。
  6. getline.oやcopy.oについても同様にして、必要なオブジェクトがそろったところでリンクしてmycatを生成します。
makeは、ターゲットが依存するソースが無かったり古ければターゲットを更新する前にソースを更新しようとします。 このことを覚えておいてください。

最終的なMakefile

        CC = gcc
        CFLAGS = -Wall -O2

        mycat:  mycat.o getline.o copy.o 

となります。 この最終版ではオプションも指定しています。 見てのとおり、CCはコンパイラの指定、CFLAGSはCCへ与えるオプションです。 これらCCやCFLAGSをマクロといいます。


make 前:もっとも簡単な例 次:マクロの利用
小栗栖 修
メールアドレス: ogurisu[AT]kanazawa-u.ac.jp ([AT]を@におきかえてください)