make の開始後、make は最初の依存関係を検査し、ターゲットが検出されるとそのターゲットが処理されます。以下のメークファイルを例として説明します。
batch: a b touch batch b: touch b a: touch a c: echo "you won't see me"
make は、batch というターゲットから処理を開始します。batch には検査されていない依存関係、つまり a と b があるため、make は a と b の依存関係の検査が終了するまで batch を実行しません。
a には依存関係がないため、make は a を処理します。ファイルがない場合は、make はターゲットのエントリの規則を実行します。
$ make touch a ...
次に、make は親のターゲットである batch に戻ります。まだ検査されていない依存関係 b があるため、make は b に移って検査を行います。
b にも依存関係がないため、make はその規則を実行します。
... touch b ...
これで batch のすべての依存関係が検査され (必要であれば) 構築されたため、最後に make は batch を検査します。
make が batch の依存関係のうち少なくとも 1 つを再構築したため、make は batch が最新ではないものとみなして再構築します。つまり 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
この場合は、下図のようにターゲットが検査および処理されます。
要約すると、make は以下のような処理を実行します。
batch の依存関係を検査して依存関係を 3 つ検出するので、batch の処理はまだ実行しません。
最初の依存関係である a を検査します。依存関係を 2 つ検出します。同様に、make は次の処理を実行します。
a1 を検査し、必要であればそれを再構築します。
a2 を検査し、必要であればそれを再構築します。
a を再構築するかどうかを決定します。
b を検査し、必要であればそれを再構築します。
c を検査し、必要であれば それを再構築します。
make は、依存関係のツリー構造をすべて処理した後に、最上位のターゲットである batch の検査および処理を行います。batch に規則が含まれている場合は、make はその規則を実行します。この例では、batch には規則が含まれていないため、make は規則を実行せずにその batch を再構築します。batch に依存するすべてのターゲットも再構築されます。