MAKE.EXE
MAKE.EXE は、プロジェクトのコンパイルとリンクのサイクルの管理を支援するコマンドライン ユーティリティです。MAKE は、本来、コンパイルとリンクに限定されるものではなく、ファイルの依存関係に基づいてコマンドを実行する汎用的なツールです。MAKE を利用すると、前回のコンパイル以降に変更したファイルのみをコンパイルすることによって、素早くプロジェクトをビルドできます。さらに、ビルド内の特殊な環境を MAKE でどのように処理するかを指定するルールをセットアップすることもできます。
目次
MAKE の基礎
MAKE は、ユーザーが記述したルールを、デフォルトの設定と共に使用して、プロジェクト内のファイルのコンパイルの仕方を決定します。たとえば、デバック情報を含むプロジェクトをビルドするタイミングを指定したり、ソース ファイルのタイムスタンプが OBJ ファイルより新しい場合にのみ、OBJ ファイルをコンパイルするように指定できます。強制的にモジュールをコンパイルする必要がある場合は、TOUCH.EXE を使用して、そのモジュールが依存するファイルのタイム スタンプを変更します。
ASCII 形式のメイクファイルには、プロジェクト内のファイルの処理方法を MAKE に指示するために、明示的ルールと暗黙ルールを記述します。MAKE は、ユーザーがセットアップしたルールを使用して、ファイル(またはファイル セット)に対してコマンドを実行するかどうかを決定します。コマンドは、ファイル セットのコンパイルやリンクを MAKE に指示するものが一般的ですが、MAKE を利用して、ほとんどのすべてのオペレーティング システム コマンドを指定できます。
コマンドライン構文
MAKE [<options>...] [<target>[<target>]]
MAKE コマンド、オプション、ターゲット引数の間はスペースで区切らなければなりません。
ターゲットを指定する場合は、ワイルドカード文字(*、? など)を使用して、複数のファイルを指定できます。
コマンドライン要素
要素 | 説明 |
---|---|
<options> |
MAKE のオプションは、MAKE の動作を制御します。詳細は、このトピックの「コマンドライン オプション」を参照。 |
<target> |
メイクファイル内に列挙されている、ビルド対象のターゲットの名前。 |
コマンドライン ヘルプを表示するには、次のように入力します。
make -?
または
make -h
コマンドライン オプション
コマンドライン オプションを使用して、MAKE の動作を制御できます。MAKE のオプションでは、大文字小文字が区別されます。また、オプションの前には、ハイフン(-
)またはスラッシュ(/
)を付けなければなりません。
MAKE コマンド、オプション、ターゲット引数の間はスペースで区切らなければなりません。ターゲットを指定する場合は、ワイルドカード文字(*
、?
など)を使用して、複数のファイルを指定できます。
ほとんどのコマンドライン オプションは、それと同等の機能をもつ、メイクファイル内で使用できる指令に対応しています。
MAKE.EXE では、以下の表に示すコマンドライン オプションをサポートしています。
MAKE コマンドライン オプション
オプション | 説明 |
---|---|
|
MAKE オプションのコマンドライン ヘルプを表示します。デフォルトの設定の後には、プラス記号が表示されます。 |
-a |
.OBJ ファイルに関連付けられたインクルード ファイルとネストしたインクルード ファイルの依存関係をチェックし、.h ファイルが変更されている場合は、.OBJ ファイルを更新します。 |
-B |
ファイルの日付に関係なく、すべてのターゲットをビルドします。 |
-c |
自動依存情報をキャッシュします。これによって、MAKE の処理速度を向上させることができます。 |
-D<macro> |
マクロを単一文字として定義します。これによって、メイクファイルに記述された式 |
[-D]<macro>=[<string>] |
|
-d<directory> |
MAKER(リアル モード バージョンの MAKE)がメモリからスワップ アウトする場合に使用するドライブとディレクトリを指定します。このオプションは、 |
-e |
マクロ名が環境変数と同じ場合は、そのマクロを無視します。マクロの代わりに、MAKE は環境変数を使用します。 |
-f<filename> |
MAKEFILE の代わりに |
-I<directory> |
インクルード ファイルを検索する際に、まず現在のディレクトリを検索し、次にここで指定したディレクトリを検索します。 |
-i |
メイクファイルから実行されるすべてのプログラムの終了ステータスを無視して、ビルド プロセスを続行します。 |
-K |
MAKE が作成する一時ファイルを保存します(通常、MAKE は一時ファイルを削除します)。 |
-m |
MAKE がファイルを処理するたびに、各ファイルの日付とタイムスタンプを表示します。 |
-n |
MAKE コマンドを表示するだけで、実行はしません。このオプションは、メイクファイルをデバッグする際に役立ちます。 |
-N |
MAKE は、Microsoft の NAMKE を模擬します。 |
-p |
メイクファイルを実行する前に、マクロ定義と明示的ルールをすべて表示します。 |
-q |
ターゲットが最新の場合は 0 を返します。ターゲットが最新でない場合は、0 以外の値を返します(これは、バッチ ファイルで使用します)。 |
-r |
BUILTINS.MAK で定義されているすべてのルールを無視します(このトピックの「BUILTINS.MAK」セクションを参照)。 |
-s |
コマンドの画面表示を抑制します(サイレント機能)。 |
-S |
コマンドが実行されている間、MAKER をメモリからスワップ アウトすることによって、メモリのオーバーヘッドを削減し、大規模なモジュールのコンパイルを可能にします。MAKE は、このオプションを無視します。 |
-U<macro> |
|
-W<filename> |
MAKE を |
たとえば、PROJECTA.MAK というファイルをメイクファイルとして使用するには、次のように入力します。
MAKE -fPROJECTA.MAK
MAKE のデフォルトの動作
MAKE コマンドを起動すると、MAKE は BUILTINS.MAK ファイルを探します。このファイルは、MAKE のデフォルト ルールを保存するためにユーザーが作成したファイルです(デフォルト ルールを無視するには、-r
オプションを使用します)。MAKE は、まず、このファイルが現在のディレクトリ内にあるかどうか検索します。次に、MAKE.EXE が保存されているディレクトリ内を検索します。BUILTINS.MAK を読み込むと、MAKE は、現在のディレクトリに MAKEFILE または MAKEFILE.MAK というファイルがあるかどうか検索します(MAKEFILE 以外のファイルを指定するには、-f
オプションを使用します)。メイクファイルが見つからない場合、MAKE はエラー メッセージを出力します。
メイクファイルを読み込むと、MAKE は、最初のターゲットの依存ファイルの日時をチェックすることによって、メイクファイル内に列挙されている最初の明示ターゲットのみのビルドを試みます。依存ファイルがターゲット ファイルよりも新しい場合は、MAKE は、コマンドを実行してターゲットを更新します。
最初のターゲットの依存ファイルの 1 つが、メイクファイル内のほかのどこかでターゲットとして使われている場合は、MAKE は、そのターゲットの依存関係をチェックして、最初のターゲットをビルドする前に、それをビルドします。この連鎖的な動作は、リンク依存と呼ばれます。
ビルド プロセス中にエラーが発生すると、MAKE は、ビルド中だったターゲット ファイルを削除します。ビルド エラーが発生してもターゲットを保存するように MAKE に指示するには、.precious
指令を使用します。
MAKE コマンドを起動した後で、Ctrl+Break または Ctrl+C を押すと、MAKE を中止できます。
メイクファイルについて
メイクファイルは ASCII 形式のファイルで、このファイルには、特定のプロジェクトをビルドするために MAKE が使用する一連の指示が保存されています。MAKE は、メイクファイルが MAKEFILE または MAKEFILE.MAK という名前であることを前提としていますが、-f
オプションを使用して、別のメイクファイル名を指定することもできます。
MAKE は、メイク コマンドと一緒に指定されたターゲット、またはメイクファイル内で見つかった最初のターゲットのいずれかをビルドします。1 つ以上のターゲットをビルドするには、メイクファイル内でシンボリック ターゲットを使用します。
メイクファイルには、次のものを記述できます。
- コメント(コメントの前には、番号記号
#
を付けます) - 明示的ルールと暗黙ルール
- マクロ
- 指令
シンボリック ターゲット
シンボリック ターゲットを利用すると、MAKE にメイクファイル内の複数のターゲットをビルドさせることができます。シンボリック ターゲットを指定する場合は、ビルド対象のすべてのターゲットを、依存関係行に列挙します(シンボリック ターゲットは、基本的にリンク依存を使用して複数のターゲットをビルドします。このトピックの「MAKE のデフォルトの動作」セクションの "リンク依存" についての記述を参照)。
たとえば、次のメイクファイルは、シンボリック ターゲット AllFiles
を使用して、FILE1.EXE と FILE2.EXE の両方をビルドします。
AllFiles: file1.exe file2.exe #AllFiles にはコマンドが含まれていない点に注意 file1.exe: file1.obj bcc32 file1.obj file2.exe: file2.obj bcc32 file2.obj
シンボリック ターゲットの規約
シンボリック ターゲットを使用する場合、次の規約があります。
- シンボリック ターゲット行の後に、コマンド行を記述してはいけません。
- シンボリック ターゲットは、一意の名前を持っていなければなりません。また、現在のディレクトリ内のファイルの名前を同じであってはいけません。
- シンボリック ターゲットの名前は、オペレーティング システムのファイル命名規則に従う必要があります。
BUILTINS.MAK
BUILTINS.MAK というオプション ファイルを作成して、その中に、メイクファイル内のターゲットをビルドする際に MAKE が使用する、標準ルールやマクロを保存しておくことができます。このファイルの存在を無視するには、MAKE の -r
オプションを使用します。
以下に、BUILTINS.MAK ファイルの例を示します。
# # C++Builder BUILTINS.MAK #
CC = bcc32 RC = brcc32 AS = tasm32
.asm.obj: $(AS) $(AFLAGS) $&.asm
.c.exe: $(CC) $(CFLAGS) $&.c
.c.obj: $(CC) $(CFLAGS) /c $&.c
.cpp.exe: $(CC) $(CFLAGS) $&.cpp
.cpp.obj: $(CC) $(CPPFLAGS) /c $&.cpp
.rc.res: $(RC) $(RFLAGS) /r $&
.SUFFIXES: .exe .obj .asm .c .res .rc
!if !$d(BCEXAMPLEDIR) BCEXAMPLEDIR = $(MAKEDIR)\..\EXAMPLES
!endif