推論規則

NMAKE の推論規則には、ターゲットを更新し、ターゲットの依存ファイルを推論するコマンドがあります。 推論規則の拡張子は、同じベース名を持つ 1 つのターゲットおよび依存ファイルと一致します。 推論規則は、ユーザー定義または定義済みです。定義済みの規則は再定義できます。

古い依存関係にコマンドがなく、.SUFFIXES に依存ファイルの拡張子が含まれている場合、NMAKE は、拡張子がターゲットと一致する規則と、現在または指定されたディレクトリ内の既存のファイルを使用します。 複数の規則が既存のファイルと一致する場合、.SUFFIXES のリストで使用するものが決定されます。リストの優先順位は、左から右に向かって低くなります。 依存ファイルが存在せず、別の記述ブロックのターゲットとしてリストにない場合、推論規則は、同じベース名を持つ別のファイルから不足している依存ファイルを作成できます。 記述ブロックのターゲットに依存ファイルまたはコマンドがない場合、推論規則はターゲットを更新できます。 推論規則は、記述ブロックが存在しない場合でも、コマンド ライン ターゲットを作成できます。 明示的な依存ファイルが指定されている場合でも、NMAKE は推論された依存ファイルの規則を呼び出す場合があります。

規則の定義

from_ext は依存ファイルの拡張子を表し、to_ext はターゲット ファイルの拡張子を表します。

.from_ext.to_ext:
   commands

拡張子は大文字と小文字が区別されません。 マクロを呼び出して、from_extto_ext を表すことができます。マクロは前処理の間に展開されます。 from_ext の前にあるピリオド (.) は、行の先頭に配置する必要があります。 コロン (:) の前には、0 個以上のスペースまたはタブが付きます。 後に付けることができるのは、スペースまたはタブ、コマンドを指定するセミコロン (;)、コメントを指定するシャープ記号 (#)、または改行文字のみです。 他のスペースは使用できません。 コマンドは、記述ブロックとして指定されます。

規則の検索パス

{from_path}.from_ext{to_path}.to_ext:
   commands

推論規則は、依存関係で指定されているパスが推論規則のパスと完全に一致する場合にのみ、依存関係に適用されます。 依存ファイルのディレクトリを from_path で指定し、ターゲットのディレクトリを to_path で指定します。スペースは使用できません。 拡張子ごとに 1 つのパスのみを指定します。 1 つの拡張子のパスに対して、他方に 1 つのパスが必要です。 現在のディレクトリを指定するには、ピリオド (.) または空の中かっこ ({ }) を使用します。 マクロで from_extto_ext を表すことができます。それらは前処理の間に展開されます。

検索パスの例

{dbi\}.cpp{$(ODIR)}.obj::
        $(CC) $(CFLAGS) $(YUDBI) $<

{ilstore\}.cpp{$(ODIR)}.obj::
        $(CC) $(CFLAGS) $<

{misc\}.cpp{$(ODIR)}.obj::
        $(CC) $(CFLAGS) $(YUPDB) $<

{misc\}.c{$(ODIR)}.obj::
        $(CC) $(CFLAGS) $<

{msf\}.cpp{$(ODIR)}.obj::
        $(CC) $(CFLAGS) $<

{bsc\}.cpp{$(ODIR)}.obj::
        $(CC) $(CFLAGS) $(YUPDB) $<

{mre\}.cpp{$(ODIR)}.obj::
        $(CC) $(CFLAGS) $(YUPDB) $<

{namesrvr\}.cpp{$(ODIR)}.obj::
        $(CC) $(CFLAGS) $(YUPDB) $<

{src\cvr\}.cpp{$(ODIR)}.obj::
        $(CC) $(CFLAGS) $<

バッチ モード規則

{from_path}.from_ext{to_path}.to_ext::
   commands

バッチ モード推論規則では、この推論規則を通過する N 個のコマンドに対して、推論規則が 1 回だけ呼び出されます。 バッチ モード推論規則を使用しないと、N 個のコマンドを呼び出す必要があります。 N は、推論規則をトリガーする依存ファイルの数です。

標準推論規則との唯一の構文上の違いは、バッチ モード推論規則は二重コロン (::) で終わることです。

Note

呼び出されるツールは、複数のファイルを処理できる必要があります。 バッチ モード推論規則では、依存ファイルにアクセスするためのマクロとして $< を使用する必要があります。

バッチ モード推論規則を使用すると、ビルド プロセスを高速化できます。 バッチ モードでは、コンパイラ ドライバーの呼び出しが 1 回だけなので、コンパイラへのファイルの提供が速くなります。 たとえば、C および C++ のコンパイラは、プロセス全体を通してメモリに常駐できるので、一連のファイルの処理の実行速度が速くなります。

次の例は、バッチ モード推論規則の使用方法を示したものです。

#
# sample makefile to illustrate batch-mode inference rules
#
O = .
S = .
Objs = $O/foo1.obj $O/foo2.obj $O/foo2.obj $O/foo3.obj $O/foo4.obj
CFLAGS = -nologo

all : $(Objs)

!ifdef NOBatch
{$S}.cpp{$O}.obj:
!else
{$S}.cpp{$O}.obj::
!endif
   $(CC) $(CFLAGS) -Fd$O\ -c $<

$(Objs) :

#end of makefile

バッチ モード推論規則を使わないと、NMAKE から次の出力が生成されます。

E:\tmp> nmake -f test.mak -a NOBatch=1

Microsoft (R) Program Maintenance Utility   Version 7.00.0000
Copyright (C) Microsoft Corp 1988-2001. All rights reserved.
        cl -nologo -Fd.\ -c .\foo1.cpp
foo1.cpp
        cl -nologo -Fd.\ -c .\foo2.cpp
foo2.cpp
        cl -nologo -Fd.\ -c .\foo3.cpp
foo3.cpp
        cl -nologo -Fd.\ -c .\foo4.cpp
foo4.cpp

バッチ モード推論規則を使うと、NMAKE から次の結果が生成されます。

E:\tmp> nmake -f test.mak -a

Microsoft (R) Program Maintenance Utility   Version 7.00.0000
Copyright (C) Microsoft Corp 1988-2001. All rights reserved.

        cl -nologo -Fd.\ -c .\foo1.cpp .\foo2.cpp .\foo3.cpp .\foo4.cpp
foo1.cpp
foo2.cpp
foo3.cpp
foo4.cpp
Generating Code...

定義済み規則

組み込み推論規則では、NMAKE のコマンド マクロおよびオプション マクロが使用されます。

ルール コマンド 既定の動作 バッチ規則 プラットフォーム
.asm.exe $(AS) $(AFLAGS) $< ml $< いいえ x86
.asm.obj $(AS) $(AFLAGS) /c $< ml /c $< はい x86
.asm.exe $(AS) $(AFLAGS) $< ml64 $< いいえ X64
.asm.obj $(AS) $(AFLAGS) /c $< ml64 /c $< はい X64
.c.exe $(CC) $(CFLAGS) $< cl $< いいえ all
.c.obj $(CC) $(CFLAGS) /c $< cl /c $< はい すべて
.cc.exe $(CC) $(CFLAGS) $< cl $< いいえ all
.cc.obj $(CC) $(CFLAGS) /c $< cl /c $< はい すべて
.cpp.exe $(CPP) $(CPPFLAGS) $< cl $< いいえ all
.cpp.obj $(CPP) $(CPPFLAGS) /c $< cl /c $< はい すべて
.cxx.exe $(CXX) $(CXXFLAGS) $< cl $< いいえ all
.cxx.obj $(CXX) $(CXXFLAGS) /c $< cl /c $< はい すべて
.rc.res $(RC) $(RFLAGS) /r $< rc /r $< いいえ all

推論による依存ファイルと推論規則

該当する推論規則が存在する場合、NMAKE はターゲットに対して推論された依存ファイルを想定します。 次の場合、規則が適用されます。

  • to_ext がターゲットの拡張子と一致します。

  • ターゲットのベース名を持ち、現在または指定されたディレクトリに存在するファイルの拡張子と、from_ext が一致します。

  • from_ext.SUFFIXES 内にあり、一致する規則内の他の from_ext に、それより高い .SUFFIXES 優先度を持つものがありません。

  • 明示的な依存ファイルに、さらに高い .SUFFIXES 優先度を持つものがありません。

推論された依存ファイルにより、予期しない副作用が発生する可能性があります。 ターゲットの記述ブロックにコマンドが含まれている場合、NMAKE は規則内のコマンドではなくそれらのコマンドを実行します。

推論規則の優先順位

推論規則が 2 回以上定義されている場合、NMAKE は優先順位が最も高い定義を使用します。 優先順位の高い方から低い方へと並べると、次のようになります。

  1. メイクファイルで定義されている推論規則。後にある定義が優先されます。

  2. Tools.ini で定義されている推論規則。後にある定義が優先されます。

  3. 事前定義された推論規則。

関連項目

NMAKE リファレンス