MAKE のマクロ
MAKE.EXE への移動
マクロは変数の一種で、MAKE はメイクファイル内でマクロに遭遇すると、それを文字列に展開します。 たとえば、mylib.lib
という文字列を表す LIBNAME
というマクロを定義できます。 それには、メイクファイルの先頭に LIBNAME = mylib.lib
という行を記述します。 次に、MAKE がこのマクロ $(LIBNAME)
に遭遇すると、それを文字列 mylib.lib
に置き換えます。 マクロを利用すると、さまざまなプロジェクトに合わせて変更可能なテンプレート メイクファイルを作成できます。
メイクファイルでマクロを使用するには、$(MacroName)
と記述します。MacroName
は定義済みのマクロです。 MacroName
は、中かっこ、またはかっこで囲みます。
MAKE は、メイクファイル内にマクロが出現する場所に応じて、さまざまなタイミングでマクロを展開します。
- ネストしたマクロは、外側のマクロが呼び出されたときに展開されます。
- ルールや指令に含まれるマクロは、MAKE が最初にメイクファイルをロードしたときに展開されます。
- コマンド内のマクロは、そのコマンドが実行されるときに展開されます。
MAKE は、メイクファイル内に未定義のマクロを見つけると、それと同じ名前のオペレーティング システム環境変数(通常、SET を利用して定義する)を検索して、その定義を展開テキストとして使用します。 たとえば、メイクファイル内に $(PATH)
が記述されていて、PATH が定義されていない場合、MAKE は AUTOEXEC.BAT 内の PATH に定義されているテキストを使用します。 環境変数の定義については、オペレーティング システムのマニュアルを参照してください。
構文
<MacroName> = <expansion_text>
要素 | 説明 |
---|---|
<MacroName> |
マクロ名では大文字小文字が区別されます( |
<expansion_text> |
最大 4096 文字まで。 展開テキストには、英数字、句読点、またはスペースを使用できます。 |
メイクファイル内では、マクロごとに独立した行で定義しなければなりません。また、各マクロの定義は、その行の先頭の文字から始めなければなりません。 可読性を良くするために、通常、マクロ定義はメイクファイルの先頭に置きます。 MAKE ファイルが、同じマクロ名に対して複数の定義を検出した場合は、新しい定義が古い定義を上書きします。
-D
コマンドライン オプションを使用して、マクロを定義することもできます。 等号(=
)の前後に、スペースを入れることはできません。ただし、スペースで定義を区切ることによって、複数のマクロを定義できます。 次の例は、コマンドラインで定義されたマクロです。
make -Dsourcedir=c:\projecta make -Dcommand="bcc32 -c" make -Dcommand=bcc32 option=-c
メモ:メイクファイル内で定義されたマクロは、コマンドラインで定義されたマクロを上書きします。
MAKE のマクロでの文字列置換
MAKE を利用すると、以前定義したマクロ内の文字列を一時的に置き換えることができます。 たとえば、次のようなマクロを定義した場合、
SOURCE = f1.cpp f2.cpp f3.cpp
次のような MAKE コマンドを使用すると、文字列 .cpp の代わりに、文字列 .obj を使用できます。
$(SOURCE:.cpp=.obj)
この置換によって、マクロを再定義されるわけではありません。
マクロ置換の規約:
- 構文:
$(MacroName:original_text=new_text)
- コロンの前後にはスペースを入れません。
original_text
内の文字列は、マクロ定義内の文字列と完全に一致していなければなりません(大文字小文字は区別されます)。
MAKE では、置換マクロ内でマクロを使用することもできます。 例:
MYEXT=.C SOURCE=f1.cpp f2.cpp f3.cpp $(SOURCE:.cpp=$(MYEXT)) #Changes 'f1.cpp' to 'f1.C', etc.
キャレット記号(^
)を利用すると、MAKE は次の文字を文字どおりに解釈します。 これは、改行文字を挿入する場合に役立ちます。 例:
MYEXT=.C SOURCE=f1.cpp f2.cpp f3.cpp ($(SOURCE):.cpp=$(MYEXT)^ ) # changes 'f1.cpp f2.cpp f3.cpp' to: # f1.C # f2.C # f3.C
この例では、キャレット記号によって、.cpp
の出現箇所を .C
の後に改行文字が付加された文字列に置換するように MAKE に指示しています。
これを使用して、次の例のように、TLIB.EXE 用の応答ファイルを生成する明示的ルールを作成できます。 例:
myfile.lib: file1.obj file2.obj file3.obj TLIB $@ @&&! +-$(**: = &^ +-) !
この例では、MAKE は、依存リスト内のすべてのスペース文字を、スペースの後にアンパサンド(&
)、改行文字、"+-
" が続いた文字列に置換します。 その結果、応答ファイルは次のようになります:
+-file1.obj & +-file2.obj & +-file3.obj & +-
デフォルトの MAKE マクロ
MAKE には、ユーザーがメイクファイルで使用できるデフォルトのマクロがいくつか含まれています。 次の表にそのマクロの一覧と、それが明示的ルールと暗黙ルールで何に展開されるかを示します。
マクロ | 暗黙ルールでの展開 | 明示的ルールでの展開 |
---|---|---|
$* |
パス\依存ファイル |
パス\ターゲット ファイル |
$< |
パス\依存ファイル(拡張子を含む) |
パス\ターゲット ファイル(拡張子を含む) |
$: |
依存ファイルへのパス |
ターゲット ファイルへのパス |
$. |
依存ファイル(拡張子を含む) |
ターゲット ファイル(拡張子を含む) |
$& |
依存ファイル |
ターゲット ファイル |
$** |
パス\依存ファイル(拡張子を含む) |
すべての依存ファイル(拡張子を含む) |
$? |
パス\依存ファイル(拡張子を含む) |
古い依存ファイル |
マクロ | 展開後の値 | コメント |
---|---|---|
__MSDOS__ |
1 |
DOS で実行中の場合 |
__MAKE__ |
0x0370 |
MAKE の 16 進数のバージョン番号 |
MAKE |
make |
MAKE の実行可能ファイルの名前 |
MAKEFLAGS |
options |
コマンドラインに記述したオプション |
MAKEDIR |
directory |
MAKE.EXE が存在するディレクトリ |
デフォルトの MAKE マクロの変更
デフォルトのマクロが希望どおりの文字列を提供しない場合は、マクロ修飾子を利用して、目的に合うように文字列の一部を抽出できます。 通常、マクロ修飾子は $<
または $@
と一緒に使用します。
デフォルトのマクロを変更するには、次の構文を使用します。
$(MacroName [modifier])
次の表にマクロ修飾子の一覧と使用例を示します:
修飾子 | 展開されるファイル名の部分 | 例 | 結果 |
---|---|---|---|
D |
ドライブとディレクトリ |
$(<D) |
C:\PROJECTA\ |
F |
基本名と拡張子 |
$(<F) |
MYSOURCE.C |
B |
基本名のみ |
$(<B) |
MYSOURCE |
R |
ドライブ、ディレクトリ、および基本名 |
$(<R) |
C:\PROJA\SOURCE |