プログラミングユーティリティ

依存関係の処理

make の開始後、make は最初の依存関係を検査し、ターゲットが検出されるとそのターゲットが処理されます。以下のメークファイルを例として説明します。

batch: a b 
     touch batch 
b: 
     touch b 
a: 
     touch a 
c: 
     echo "you won't see me"

make は、batch というターゲットから処理を開始します。batch には検査されていない依存関係、つまり ab があるため、makeab の依存関係の検査が終了するまで batch を実行しません。

Graphic

a には依存関係がないため、makea を処理します。ファイルがない場合は、make はターゲットのエントリの規則を実行します。

$ make 
touch a 
...

次に、make は親のターゲットである batch に戻ります。まだ検査されていない依存関係 b があるため、makeb に移って検査を行います。

Graphic

b にも依存関係がないため、make はその規則を実行します。

...
touch b 
...

これで batch のすべての依存関係が検査され (必要であれば) 構築されたため、最後に makebatch を検査します。

Graphic

makebatch の依存関係のうち少なくとも 1 つを再構築したため、makebatch が最新ではないものとみなして再構築します。つまり make はタイムスタンプを比較する検査を行うので、a または b が、この make の実行では構築されていないが、ディレクトリ内には存在していて batch より新しい場合にも、 batch が再構築されます。

...
touch batch

依存関係の検査で検出されないターゲットのエントリは処理されません。c のターゲットエントリがメークファイル中にありますが、batch の依存関係の検査において c のエントリは検出されていないため、c の規則は実行されません。make コマンドの引数として入力すると、c を開始ターゲットとして指定することができます。

次の例では、batch のターゲットはファイルを生成せず、複数のターゲットを 1 つのグループとして示すラベルとして使用されます。

batch: a b c
a: a1 a2 
      touch a
b: 
      touch b 
c: 
      touch c
a1: 
      touch a1
a2: 
      touch a2

この場合は、下図のようにターゲットが検査および処理されます。

Graphic

要約すると、make は以下のような処理を実行します。

  1. batch の依存関係を検査して依存関係を 3 つ検出するので、batch の処理はまだ実行しません。

  2. 最初の依存関係である a を検査します。依存関係を 2 つ検出します。同様に、make は次の処理を実行します。

    1. a1 を検査し、必要であればそれを再構築します。

    2. a2 を検査し、必要であればそれを再構築します。

  3. a を再構築するかどうかを決定します。

  4. b を検査し、必要であればそれを再構築します。

  5. c を検査し、必要であれば それを再構築します。

  6. make は、依存関係のツリー構造をすべて処理した後に、最上位のターゲットである batch の検査および処理を行います。batch に規則が含まれている場合は、make はその規則を実行します。この例では、batch には規則が含まれていないため、make は規則を実行せずにその batch を再構築します。batch に依存するすべてのターゲットも再構築されます。