MAKE の(明示的および暗黙)ルールとコマンド
MAKE.EXE への移動
MAKE にメイクファイル内のターゲットのビルド方法を指示するには、明示的ルールと暗黙ルールを記述します。 一般に、これらのルールは次のように定義されます。
- 明示的ルールは、特定のファイルへの指示である。
- 暗黙ルールは、明示的ルールを必要としない、ファイルへの一般的な指示である。
すべてのルールは、次の一般的な形式に従って記述します:
Dependency line Command line
依存行
の構文は、明示的ルールと暗黙ルールで異なりますが、コマンド行
の構文は、どちらのタイプのルールでも同じです。
MAKE は、1 つのターゲットに対して複数の依存行をサポートしています。また、1 つのターゲットは複数のコマンド行を持つことができます。 ただし、唯一の依存行が、関連するコマンド行を持つようにすべきです。 例:
Target1: dependent1 dep2 dep3 dep4 dep5 Target1: dep6 dep7 dep8 bcc32 -c $**
目次
明示的ルールの構文
明示的ルールは、特定のターゲットをビルドする際に MAKE が従わなければならない指示を定義します。 明示的ルールの名前は、末尾に 1 つまたは 2 つのコロンが付加されたターゲット(複数可)になります。 コロンが 1 つの場合は、ターゲットに対して 1 つのルールが記述されていることを意味します。コロンが 2 つの場合は、ターゲットに対して複数のルールが記述されていることを意味します。
明示的ルールは、次の構文に従います:
<target> [<target>...]:[:][{<path>}] [<dependent[s]>...] [<commands>]
要素 | 説明 |
---|---|
<target> |
ビルド対象のファイルの名前と拡張子を指定します(ターゲットはメイクファイル内の行の先頭から記述しなければなりません。したがって、ターゲット名の前にスペースやタブを置くことはできません)。 複数のターゲットを指定するには、ターゲット名をスペースまたはタブで区切ります。 また、明示的ルールのターゲット部分で、同じターゲット名を複数回使用することはできません。 |
<path> |
MAKE に依存ファイルの検索場所を指示するディレクトリのリスト。 複数のディレクトリを指定するには、それぞれのディレクトリをセミコロンで区切り、パス指定全体を中かっこで囲みます。 |
<dependent> |
MAKE が、日付と時刻が |
<commands> |
任意のオペレーティング システム コマンド(複数可)。 コマンド行は、少なくとも 1 つのスペースまたはタブによって段下げしなければなりません。そうしないと、ターゲットとして解釈されます。 複数のコマンドを記述する場合は、スペースで区切ります。 |
依存行やコマンド行が、次の行に続く場合は、最初の行の末尾にバックスラッシュ(\
)を記述して、行が続くことを示します。 例:
MYSOURCE.EXE: FILE1.OBJ\ #Dependency line FILE3.OBJ #Dependency line continued bcc32 file1.obj file3.obj #Command line
1 つのターゲットが複数のルールを持つ場合
1 つのターゲットが、複数の明示的ルールを持つ場合もあります。 明示的ルールを複数指定するには、ターゲット名の後にダブルコロン(::
)を使用します。
以下に、複数のルールとコマンドを持つターゲットの例を示します。
.cpp.obj: bcc32 -c -ncobj $< .asm.obj: tasm /mx $<, asmobj\ mylib.lib :: f1.obj f2.obj #double colon specifies multiple rules echo Adding C files tlib mylib -+cobjf1 -+cobjf2 mylib.lib :: f3.obj f4.obj echo Adding ASM files tlib mylib -+asmobjf3 -+asmobjf4
暗黙ルールの構文
暗黙ルールは、MAKE が特定のファイル拡張子を持つファイルをビルドする方法についての一般的なルールを定義します。 暗黙ルールは、パスまたはピリオドで始まります。 このルールの主な構成要素は、ピリオドで区切られたファイル拡張子です。 最初の拡張子は依存側に属し、2 番目の拡張子はターゲット側に属します。
暗黙の依存ファイルがターゲット ファイルに比べて古い場合や、依存ファイルが存在しない場合は、MAKE は、そのルールに関連付けられたコマンドを実行します。 MAKE は、暗黙の依存ファイルを更新する前に、明示的な依存ファイルを更新します。
暗黙ルールは、次の基本構文に従います。
[{>source_dir>}].<source_ext>[{target_dir}].<target_ext>: [<commands>]
要素 | 説明 |
---|---|
<source_dir> |
依存ファイルを含むディレクトリ(複数可)を指定します。 複数のディレクトリを指定する場合は、セミコロンで区切ります。 |
.<source_ext> |
依存ファイル名の拡張子を指定します。 |
<target_dir> |
MAKE がターゲット ファイルを置くディレクトリを指定します。 暗黙ルールは、このディレクトリ内のターゲットに対してのみ適用されます。 ターゲット ディレクトリを指定していない場合は、任意のディレクトリのターゲットに暗黙ルールが適用されます。 |
.<target_ext> |
ターゲット ファイル名の拡張子を指定します。 ここにマクロを使用することもできます。 |
: (コロン) |
依存行の終わりを表します。 |
<commands> |
任意のオペレーティング システム コマンド(複数可)。 コマンド行は、少なくとも 1 つのスペースまたはタブによって段下げしなければなりません。そうしないと、ターゲットとして解釈されます。 |
2 つの暗黙ルールが 1 つのターゲット拡張子に一致し、依存ファイルが存在しない場合は、MAKE は、.SUFFIXES
指令のリストに最初に出現する拡張子の依存ファイルを持つ暗黙ルールを使用します。
暗黙のコマンドを含む明示的ルール
明示的ルールのターゲットが、暗黙ルールのコマンド行を取得する場合があります。 次の例は、暗黙ルールの後に、コマンド行を持たない明示的ルールが続く場合を示しています。
.c.obj: bcc32 -c $< #This command uses a macro $< described later myprog.obj: #This explicit rule uses the command: bcc32 -c myprog.c
この暗黙ルールのコマンドは、MAKE に MYPROG.C をコンパイルするよう指示します(マクロ $<
は、名前 myprog.obj
を myprog.c
に置き換えます)。
MAKE コマンドの構文
コマンドは、明示的ルールまたは暗黙ルールの直後に続けます。また、コマンド行は新しい行から始めて、行頭にはスペースまたはタブを置かなければなりません。 コマンドには、任意のオペレーティング システム コマンドを使用できます。また、オペレーティング システムが認識しない、MAKE のマクロ、指令、特殊演算子をコマンド内に含めることもできます(ただし、|
はコマンド内で使用できません)。
次に、コマンドの例を示します。
cd.. bcc32 -c mysource.c COPY *.OBJ C:\PROJECTA bcc32 -c $(SOURCE) #Macros in "Using MAKE macros"
コマンドは、次の一般的な構文に従います。
[<prefix>...] <commands>
コマンドの接頭辞
明示的ルールと暗黙ルールのどちらのコマンドにも接頭辞を付けることができます。接頭辞は、MAKE がそのコマンドを処理する方法を変更します。 次の表に、メイクファイル内で使用可能な接頭辞の一覧を示します。
プレフィックス | 説明 |
---|---|
@ |
コマンドの実行中に、そのコマンドを表示しません。 |
-<num> |
コマンドから返された終了コードが、整数 |
- |
コマンドからの終了コードに関係なく、メイクファイル内のコマンドの処理を続行します。 |
& |
マクロ |
! |
|
@
の使用
次のコマンドは、@
接頭辞を使用して、MAKE がコマンドを画面に表示するのを抑制します。
diff.exe : diff.obj @bcc32 diff.obj
-<num>
と -
の使用
接頭辞 -<num>
と -
(ハイフン)は、エラーが発生した場合のメイクファイルの処理を制御します。エラーが発生した場合に、MAKE の処理を続行することを選択したり、許容するエラー番号を指定することができます。
次の例では、BCC32 がエラーを返した場合、MAKE は処理を続行します。
target.exe : target.obj target.obj : target.cpp -bcc32 -c target.cpp
&
の使用
&
接頭辞は、各依存ファイルにコマンドを 1 回実行します。 これは、ファイル リストをパラメータとして受け取らないコマンドの場合に役立ちます。 例:
copyall : file1.cpp file2.cpp © $** c:\temp
その結果、次のように COPY が 2 回呼び出されます。
copy file1.cpp c:\temp copy file2.cpp c:\temp
&
修飾子がないと、MAKE は COPY を 1 回しか呼び出しません。
メモ:
&
接頭辞は、マクロ$**
と$!
とのみ動作します。
MAKE コマンドの演算子
MAKE のコマンド セクションでは任意のオペレーティング システム コマンドを使用できますが、次に示す特殊演算子を使用することもできます。
演算子 | 説明 |
---|---|
< |
標準入力ではなく、指定したファイルからの入力を使用します。 |
> |
コマンドからの出力をファイルに送ります。 |
>> |
コマンドからの出力をファイルに追加します。 |
<< |
一時的なインライン ファイルを作成し、その内容をコマンドへの標準入力として使用します。 また、-N を使用した場合は、一時応答ファイルも作成されます。 メモ: これは、Microsoft の NMAKE でのみ使用されます。 |
&& |
一時応答ファイルを作成し、その名前をメイクファイルに挿入します。 |
<delimiter> |
一時応答ファイルと一緒に区切り文字を使用します。 区切り文字としては、 |