記述ブロック
記述ブロックはメイクファイルの中核となります。 "ターゲット" (または作成するファイル) とその "依存関係" (ターゲットの作成に必要なファイル) を記述します。 記述ブロックには、依存関係からターゲットを作成する方法を記述する "コマンド" を含めることができます。 記述ブロックは依存関係の行で、必要に応じてコマンド ブロックを続けます。
targets... : dependents...
commands...
依存関係の行
"依存関係の行" では、1 個以上のターゲットと、0 個以上の依存ファイルを指定します。 ターゲットが存在しない場合、またはタイムスタンプが依存ファイルより前である場合、NMAKE によってコマンド ブロック内のコマンドが実行されます。 ターゲットが疑似ターゲットである場合も、NMAKE によってコマンド ブロックが実行されます。 依存関係の行の例を次に示します。
hi_bye.exe : hello.obj goodbye.obj helper.lib
この依存関係の行では、hi_bye.exe
がターゲットです。 依存関係は hello.obj
、goodbye.obj
、helper.lib
です。 この依存関係の行は、hello.obj
、goodbye.obj
、または helper.lib
が hi_bye.exe
よりも最近変更されていた場合にターゲットをビルドするよう NMAKE に指示します。
ターゲットは、行の先頭に入力する必要があります。 スペースやタブでインデントすることはできません。 コロン (:
) を使って、ターゲットと依存ファイルを分けます。 ターゲット、コロン区切り記号 (:
)、依存ファイルの間には、スペースやタブを使用できます。 依存関係の行を分割するには、ターゲットまたは依存ファイルの後に円記号 (\
) を指定します。
NMAKE では、コマンド ブロックを実行する前に、すべての依存関係と適用可能な推論規則がスキャンされ、"依存関係ツリー" が作成されます。 依存関係ツリーによって、ターゲットを完全に更新するために必要な手順が指定されます。 NMAKE は、依存ファイル自体が別の依存関係リスト内でターゲットになっているかどうかを再帰的に確認します。 依存関係ツリーが作成されたら、NMAKE はタイム スタンプをチェックします。 ツリー内の依存ファイルがターゲットより新しかった場合、NMAKE はそのターゲットをビルドします。
目標値
依存関係の行のターゲット セクションでは、1 つ以上のターゲットを指定します。 ターゲットには、任意の有効なファイル名、ディレクトリ名、または疑似ターゲットを指定できます。 複数のターゲットを分割するには、1 つ以上のスペースまたはタブを使用します。 ターゲットは大文字と小文字が区別されません。 ファイル名にパスを指定することができます。 ターゲットとそのパスに使用できるのは、256 文字までです。 コロンの前のターゲットが 1 文字の場合は、スペースで区切ります。 それ以外の場合、NMAKE は文字のコロンの組み合わせをドライブ指定子として解釈します。
複数のターゲット
NMAKE は、1 つの依存関係に含まれる複数のターゲットを、それぞれが個別の記述ブロックで指定されているかのように評価します。
たとえば、次の規則:
bounce.exe leap.exe : jump.obj
echo Building...
これは次のように評価されます。
bounce.exe : jump.obj
echo Building...
leap.exe : jump.obj
echo Building...
依存関係の追加
記述ブロックでは、ターゲットが繰り返された場合、依存関係が追加されます。
たとえば、次の一連の規則:
bounce.exe : jump.obj
bounce.exe : up.obj
echo Building bounce.exe...
これは次のように評価されます。
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
1 つの記述ブロック内で複数の依存関係の行に複数のターゲットを指定する場合、NMAKE はそれぞれが個別の記述ブロックで指定されているかのように評価します。 ただし、コマンド ブロックを使用するのは最後の依存関係の行に含まれるターゲットのみです。 NMAKE は、その他のターゲットについては推論規則を使用しようとします。
たとえば、次の一連の規則:
leap.exe bounce.exe : jump.obj
bounce.exe climb.exe : up.obj
echo Building bounce.exe...
これは次のように評価されます。
leap.exe : jump.obj
# invokes an inference rule
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
climb.exe : up.obj
echo Building bounce.exe...
複数の記述ブロックのターゲット
複数の記述ブロックで異なるコマンドを使って 1 つのターゲットを更新するには、ターゲットと依存ファイルの間に 2 つの連続するコロン (::) を指定します。
target.lib :: one.asm two.asm three.asm
ml one.asm two.asm three.asm
lib target one.obj two.obj three.obj
target.lib :: four.c five.c
cl /c four.c five.c
lib target four.obj five.obj
依存関係の副作用
異なる場所にある 2 つの依存関係の行で、コロン (:) を使ってターゲットを指定することもできます。 そのうち 1 つの行の後にのみコマンドを指定する場合、NMAKE は、それらの行が隣接している、または結合されているかのように依存関係を解釈します。 コマンドを指定しない依存関係に対して推論規則は呼び出されません。 代わりに、NMAKE はそれらの依存関係が 1 つの記述ブロックに属しているものと見なし、もう 1 つの依存関係で指定されたコマンドを実行します。 次の一連の規則を考えてみましょう。
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
これは次のように評価されます。
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
2 つのコロン (::
) を使う場合、この効果は発生しません。 たとえば、次の一連の規則:
bounce.exe :: jump.obj
echo Building bounce.exe...
bounce.exe :: up.obj
これは次のように評価されます。
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
# invokes an inference rule
疑似ターゲット
"疑似ターゲット" は、依存関係の行でファイル名の代わりに使うラベルです。 存在しないファイルとして解釈されるため、最新ではありません。 NMAKE では、疑似ターゲットのタイムスタンプが、そのすべての依存ファイルの中で最新のものと同じであると仮定されます。 依存ファイルがない場合は、現在の時刻が仮定されます。 疑似ターゲットをターゲットとして使う場合、そのコマンドは常に実行されます。 依存ファイルとして使う疑似ターゲットは、別の依存関係でターゲットとして指定する必要もあります。 ただし、その依存関係はコマンド ブロックを持つ必要はありません。
疑似ターゲットの名前は、ターゲットのファイル名構文規則に従います。 ただし、名前に拡張子が付いていない場合は、ファイル名の 8 文字の制限を超えることができ、最大 256 文字まで使用できます。
擬似ターゲットは、NMAKE で複数のターゲットを自動的に作成したい場合に便利です。 NMAKE では、コマンド ラインで指定したターゲットのみがビルドされます。 また、コマンド ラインのターゲットを指定しない場合は、メイクファイル内の最初の依存関係の最初のターゲットのみがビルドされます。 複数のターゲットを、コマンド ライン上で個別に指定することなくビルドするように NMAKE に指示できます。 擬似ターゲットを含む依存関係を使って記述ブロックを作成し、その依存ファイルとしてビルドするターゲットを指定します。 その後、この記述ブロックをメイクファイルの最初に追加するか、NMAKE のコマンド ラインで擬似ターゲットを指定します。
次の例では、UPDATE は擬似ターゲットです。
UPDATE : *.*
COPY $** c:\product\release
UPDATE が評価されると、NMAKE によって、現在のディレクトリにあるすべてのファイルが、指定したドライブとディレクトリにコピーされます。
次のメイクファイルでは、コマンド ラインで all
を指定するか、ターゲットを指定しなかった場合、擬似ターゲット all
によって project1.exe
と project2.exe
の両方がビルドされます。 擬似ターゲット setenv
により、.exe
ファイルが更新される前に LIB 環境変数が変更されます。
all : setenv project1.exe project2.exe
project1.exe : project1.obj
LINK project1;
project2.exe : project2.obj
LINK project2;
setenv :
set LIB=\project\lib
依存関係
依存関係の行で、コロン (:
) または 2 つのコロン (::
) の後に、任意の有効なファイル名または擬似ターゲットを使って、0 個以上の依存ファイルを指定します。 複数の依存ファイルを分割するには、1 つ以上のスペースまたはタブを使用します。 依存ファイルは大文字と小文字が区別されません。 ファイル名にパスを指定することができます。
推論による依存ファイル
依存関係の行で明示的に指定する依存ファイルと共に、NMAKE では "推論による依存ファイル" も想定できます。 推論による依存ファイルは推論規則から派生し、明示的な依存ファイルの前に評価されます。 推論による依存ファイルがそのターゲットと比較して古くなっている場合、NMAKE はその依存関係のコマンド ブロックを呼び出します。 推論による依存ファイルが存在しない場合、またはその独自の依存ファイルと比較して古くなっている場合、NMAKE は最初に推論による依存ファイルを更新します。 推論による依存ファイルの詳細については、「推論規則」を参照してください。
依存ファイルの検索パス
依存ファイルごとに、必要に応じて検索パスを指定できます。 検索する一連のディレクトリを指定する構文を次に示します。
{<ディレクトリ>[;<ディレクトリ>...]}<依存ファイル>
ディレクトリ名を中かっこ ({ }
) で囲みます。 複数のディレクトリを区切るには、セミコロン (;
) を使用します。 スペースやタブは使用できません。 NMAKE は、最初に現在のディレクトリで依存ファイルを検索し、次にディレクトリのリストを指定した順序で検索します。 マクロを使って、検索パスの一部またはすべてを指定できます。 この検索パスを使用するのは、指定した依存ファイルだけです。
ディレクトリ検索パスの例
次の依存関係の行は、検索のためのディレクトリ指定を作成する方法を示しています。
reverse.exe : {\src\omega;e:\repo\backwards}retro.obj
ターゲット reverse.exe
には 1 つの依存ファイル retro.obj
があります。 中かっこで囲まれたリストは、2 つのディレクトリを指定します。 NMAKE は、まず現在のディレクトリで retro.obj
を検索します。 そこになかった場合、NMAKE は \src\omega
ディレクトリを検索し、次に e:\repo\backwards
ディレクトリを検索します。