MAKE の指令

提供: RAD Studio
移動先: 案内検索

MAKE.EXE への移動


MAKE の指令は、C や Pascal などの言語の指令に似ています。 MAKE では、指令によってさまざまな制御機能(コマンドを画面に表示してから実行するなど)を実行します。 MAKE の指令は、感嘆符またはピリオドのいずれかで始まります。また、指令は、コマンドラインで指定されたどのオプションよりも優先されます。 感嘆符で始まる指令は、新しい行の先頭に記述しなければなりません。

MAKE の指令とそのコマンドライン オプション

次の表に、MAKE の指令とそれに対応するコマンドライン オプションを示します。

指令 オプション (使用できる場合) 説明/例

.autodepend

-a

自動依存チェックをオンにします。 自動依存とは、ビルド対象のターゲットに自動的にインクルードされるファイル(C++ ソース コード内のヘッダー ファイルなど)のことです。 .autodepend をオンにすると、MAKE は、.OBJ のビルドに使われるすべてのファイル(自動依存ファイルを含む)の日付と時刻を比較します。 .OBJ ファイルのビルドに使われるファイルの日付や時刻が、その .OBJ ファイルの日付/時刻スタンプよりも新しい場合に、.OBJ ファイルが再コンパイルされます。 リンク依存を構成する代わりに .autodepend(または -a)を使用できます。

.cacheautodepend

-c

自動依存のキャッシングをオンにします。

!cmdswitches

+ または - の後ろに非文字列オプション文字を続けて使用し、各オプションをオンまたはオフにします。 + 演算子や - 演算子の前には、スペースまたはタブを必ず入れ、この演算子とオプション文字の間には、何も入れません。

!elif

C の else if と同様の動作をします。

!else

C の else と同様の動作をします。

!endif

!if 文、!ifdef 文、または !ifndef 文を閉じます。

!error

MAKE を停止し、エラー メッセージを出力します。  !error 指令の構文は:

!error <message>

MAKE は、処理を停止させ、この指令が出ると、次の文字列を出力します: Fatal makefile exit code: Error directive - <message>

次の例のように、条件文に !error を埋め込むことによって、処理を中断してエラー メッセージを出力します。

!if !$d(MYMACRO) #MYMACRO が定義されていない場合
!error MYMACRO が定義されていません
! endif

MYMACRO が定義されていない場合、MAKE は終了し、次を出力します:

Fatal makefile 4: Error directive - MYMACRO isn't defined

エラーチェック制御: MAKE には、次の 4 つのエラーチェック制御があります。

  • .ignore 指令は、makefile の選択された部分のエラー チェックをオフにします。
  • -i コマンドライン オプションは、makefile 全体のエラー チェックをオフにします。
  • -num 接頭辞をルールの一部として入力すると、終了コードが指定数を超えた場合に、それに関連するコマンドのエラー チェックをオフにします。
  • - 接頭辞は、終了コードに関係なく、それに関連するコマンドのエラー チェックをオフにします。

!if

条件文を開始します。

!ifdef

C の #ifdef と同様の動作をします。指定されたマクロが定義されているかどうかをテストします。

!ifndef

C の #ifndef と同様の動作をします。指定されたマクロが未定義かどうかをテストします。

.ignore

-i

MAKE は、コマンドの戻り値を無視します。

!include

この指令は、C または C++ 言語の #include プリプロセッサ指令と同様の動作をします -- makefile に他のファイルのテキストを挿入することができます:

!include <filename>

ファイル名は、二重引用符 " " か角かっこ < > で囲むことができ、指令の入れ子の深さに制限はありません。

しかし、1 つの makefile 内に複数の !include 指令を記述することはできません -- その場合、インクルード ファイルにエラー メッセージ サイクルが入ります。

ルール、コマンドまたは指令は、1 つのソース ファイル内で完結する必要があります。コマンドを !include ファイルの中で開始し、makefile 内で終了させることはできません。 -I コマンドライン オプションを使って他のディレクトリを指定しないと、MAKE は、現在のディレクトリ内で !include ファイルを検索します。

.keep

-K

MAKE が作成する一時ファイルを保存します(通常、MAKE はそうしたファイルを削除します)。

!message

MAKE が makefile を実行している間、メッセージを標準出力に出力します。

!message 指令を利用すると、makefile からのメッセージを画面に出力できます。 これらのメッセージは、正しく動作しない makefile のデバッグに役立てることができます。 たとえば、マクロ定義に問題がある場合、makefile 内に次の行を記述します。

!message ここで定義されるマクロ: $(MacroName)

MAKE はこの行を解釈し、画面に次のように出力します(マクロが .CPP に展開される場合)。

ここで定義されるマクロ: .CPP

.noautodepend

-a-

自動依存チェックをオフにします。

.nocacheautodepend

-c-

自動依存のキャッシングをオフにします。

.noIgnore

-i-

.Ignore をオフにします。

.nokeep

-K-

MAKE が作成する一時ファイルを保存しません。

.nosilent

-s-

MAKE は、コマンドを表示してからそのコマンドを実行します。

.noswap

-S-

MAKE に対し、コマンドを実行前に、MAKE 自身をメモリからスワップ アウトしないよう指示します。

.path.ext

MAKE に対し、path ディレクトリ内の .ext 拡張子を持つファイルを検索するよう指示します。

MAKE に対し、.c 拡張子のファイルを、C:\SOURCE または C:\CFILES で、.obj 拡張子のファイルを、C:\OBJS で検索するよう指示するには:

.path.c = C:\CSOURCE;C:\CFILES .path.obj = C:\OBJS

.precious

ビルドが失敗してもターゲットは保存します。

MAKE ビルドが失敗した場合、MAKE はターゲット ファイルを削除します。 .precious 指令によって、ファイルを削除しないようにし、これを、特定の種類のターゲットに適用できます。 たとえば、あるモジュールをライブラリに追加するビルドに失敗しても、そのライブラリは削除したくない場合です。 .precious の構文は:

.precious: <target> [<target>...]

.silent

-s

MAKE は、先にコマンドを表示せずに、そのコマンドを実行します。

.suffixes

あいまいな依存関係に対する暗黙ルールを決定します。 .suffixes 指令は、MAKE に対し、暗黙ルールを作成する際の順序(ファイルの拡張子による)を指示します。 .suffixes の構文は:

.suffixes: .<ext> [.<ext> ...]

ここでの .<ext> は、暗黙ルールに列挙する依存ファイルの拡張子を表します。

たとえば、次の行、 .suffixes: .asm .c .cpp を含めると、MAKE に対し、makefile での出現順序に関係なく、.ASM ファイル、.C ファイル、.CPP ファイルの順で、そのファイルに依存する暗黙ルールを解釈するよう指示できます。

次の .suffixes の例では、MAKE に対し、ソース ファイルの検索を、最初に .ASM 拡張子を持つもの、次に .C 拡張子を持つもの、最後に .CPP 拡張子を持つものの順に行うよう指示します。 MAKE が MYPROG.ASM を見つけると、TASM を呼び出し、そのアセンブラ ファイルから MYPROG.OBJ をビルドします。 次に、MAKE は ILINK32 を呼び出します。それ以外の場合、MAKE は、MYPROG.C を検索して .OBJ ファイルをビルドし、それもなければ MYPROG.CPP を検索します。

.suffixes: .asm .c .cpp 
myprog.exe: myprog.obj
bcc32 myprog.obj
.cpp.obj: 
bcc32 -P -c $<
.asm.obj: 
tasm /mx $
.c.obj:
bcc32 -P- -c $<

.swap

-S

MAKE に対し、コマンド実行前に、MAKE 自身をメモリからスワップ アウトするよう指示します。

!undef

マクロ定義をクリアします。 これ以降、そのマクロは未定義となります。 !undef(定義取消)指令により、 !ifdef MacroName テストは失敗します。

!undef 指令の構文は: !undef MacroName


指令でのマクロの使用

 !if 条件指令と一緒に $d マクロを使用すると、特定のマクロが定義されている場合にいくつかの処理を実行できます。 $d の後に記述するマクロ名は、次の例のように、かっこ、または中かっこで囲みます。

!if $d(DEBUG)            #If DEBUG is defined,
bcc32 -v f1.cpp f2.cpp   #compile with debug information;
!else                    #otherwise
bcc32 -v- f1.cpp f2.cpp   #don't include debug information.
!endif

NULL マクロ

!ifdef MacroName テストで、未定義のマクロ名は false を返しますが、null で定義された MacroNametrue を返します。 null マクロを定義するには、スぺースか改行文字の後に続いて等号(=)を使用してください。 たとえば、次の行は makefile で null マクロを定義しています:

NULLMACRO =

または、MAKE のコマンドラインで、次の行を指定することによって NULL マクロを定義できます。

NULLMACRO =""
-DNULLMACRO

 !if 指令とその他の条件指令

!if 指令は、C の if 文と同様の動作をします。 次に示すように、!if 指令とその他の条件指令の構文は、コンパイラの条件指令に似ています。

!if condition

!if condition

!if condition

!ifdef macro

!endif

!else

!elif condition

!endif

!endif

!endif


次の式は等価です:

!ifdef macro /* is equivalent to */ !if $d(macro)
ifndef macro /* is equivalent to */ !if !$d(macro) 

条件指令には次の規約が適用されます:

  • !if!ifdef!ifndef と、!endif の指令の間に、!else 指令は 1 つしか入れられません。
  • !if!ifdef!ifndef!else!endif の指令の間に、!elif 指令は複数入れることができます。
  • 複数の条件指令に渡って、ルールを分割することはできません。
  • 条件指令はネストさせることができます。
  • !if!ifdef!ifndef は、対応する !endif 指令が同じファイル内になければなりません。

!if!endif の指令の間には、次の情報を含めることができます:

  • マクロ定義
  • 明示的ルール
  • 暗黙ルール
  • Include 指令
  •  !error 指令
  •  !undef 指令

if 文中の条件式は、10進数、8進数、または16進数の定数と、次の表に示す演算子で構成されます。

演算子 説明 演算子 説明

-

否定

?:

条件式

~

2 の補数

!

論理 NOT

+

加算

>>

右へシフト

-

減算

<<

左へシフト

*

乗算

&

ビット and

/

除算

|

ビット or

%

剰余

^

ビット xor

&&

論理 AND

>+

以上 *

||

論理 OR

<+

以下 *

>

より大きい

==

等しい *

<

より小さい

!=

等しくない *

  • が付いた演算子は、文字列式でも動作します。

MAKE は、条件式を、32 ビットの符号付整数または文字列のいずれかとして評価します。

関連項目