通常の依存関係の検査に加えて、特殊ターゲットの .KEEP_STATE を使用してコマンドの依存関係を検査することができます。この検査を実行すると、make は各ターゲットファイルと依存ファイルとを検査するだけでなく、規則中の各コマンド行と、ターゲットを最後に構築したときに実行したコマンド行の比較も行います。比較の結果は、現在のディレクトリの .make.state ファイルに保存されます (「状態ファイル」を参照してください)。
以下のメークファイルを例として説明します。
CFLAGS= -O .KEEP_STATE: functions: functions.c cc -o functions functions.c
以下に、上記のメークファイルで make コマンドを実行した結果を示します。
$ make cc -O -o functions functions.c $ make CFLAGS=-g cc -g -o functions functions.c $ make "CFLAGS= -O -pg" cc -O -pg -o functions functions.c
プログラムのコンパイル時には、ユーザーが指定したオプションが優先されて使用されます。
.KEEP_STATE を有効にしてから最初に make を実行したときには、必要な情報を収集して記録するため、すべてのターゲットが再コンパイルされます。KEEP_STATE 変数は、環境変数から取り込んだ場合には、.KEEP_STATE ターゲットと同様に機能します。
指定したコマンド行のコマンドの依存関係の検査を抑止するには、タブの後の最初の文字として疑問符を挿入します。
動的なマクロである $? を含む行では、コマンドの依存関係の検査が自動的に抑止されます。このマクロは、現在のターゲットよりも新しい依存関係のリストです。このリストの内容は、make の実行ごとに異なる場合があります。
このマクロを含む行に対してコマンドの依存関係の検査を強制的に実行するには、そのコマンド行の (タブの後) の最初の文字として、! を挿入します。
.KEEP_STATE が有効な場合は、make は .make.state という名前の状態ファイルを現在のディレクトリに生成します。このファイルには、.KEEP_STATE が有効になっている間に処理されたすべてのターゲットおよびそのターゲットを構築する規則が、メークファイルの書式で記述されます。この状態ファイルの整合性を保つために、.KEEP_STATE をメークファイルに追加した後は、内容を変更しないでください。
このターゲットは旧バージョンの make では無視されるため、互換性の問題は生じません。このターゲットは、依存するターゲットがなく、規則が空 (NULL) で、それ自身の依存関係がないので、旧バージョンでは余分なターゲットとして処理されます。名前の先頭にドットがあるため、開始ターゲットして使用されません。