### 19-2　MAKE記述ファイル

MAKE記述ファイルは、テキトファイル形式です。作成する場合は、テキストエディタを使用します。通常、MAKEファイル名はMAKEFILEとしますが、複数のMAKEファイルが存在する場合など、ユニークな名称を付加することができます。MAKE記述ファイルは、記述ブロック、マクロ、推論規則、およびディレクティブで構成されています。

#### 19-2-1　記述ブロック

記述ブロックは、MAKEファイルの中心となる部分です。次にMAKEの記述ブロックを示します。

>     ターゲット部  ：  依存部
>     sample.eva : sample.obj sample.opt sample.cgr   ←　依存記述行
>         l86k/p sample;                              ←　コマンド記述ブロック
>         copy        sample.eva c:\myprog\           ←　コマンド記述ブロック

#### 依存記述行

記述ブロックは、「依存記述行」で始まります。依存記述行には、コロン（：）で区切られた2つの部分があります。コロンの左側の部分を「ターゲット」と呼び、更新されるべきファイルを記述します。コロンの右側の部分を「ソース」と呼び、ターゲットを更新するためのソースになるファイルを記述します。上記の例では、“sample.eva”がターゲット、“sample.obj”“sample.opt”“sample.cgr”がソースとなります。依存記述行の先頭には、空白（スペースまたはタブ）を置いてはいけません。また、ターゲットおよびソースは、それぞれ空白で区切ることにより、複数個記述することができます。

依存記述行は、「ターゲットがソースよりも古いか、ターゲットが存在しない場合に、更新処理を行う」ことを表します。ただし、ソースが指定されていない場合は、例外として更新処理が行われます。依存記述ブロックが、複数ブロック記述されている場合は、MAKEファイル中で1番最初に現れる依存記述部のターゲットを最終ターゲットとするので、EVAファイルに関する依存記述ブロックは最初に記述するようにしてください（MAKE起動時にターゲットの指定が可能）。最終ターゲットは、.TARGETディレクティブにより、ディフォルトターゲットファイルの拡張子を設定できます。依存記述行の記述が長い場合は、各行の終わりに円記号（￥）を付加すると、MAKEは次の行を継続行と解釈します。

#### 継続行の使用例

>     sample.eva : sample.obj \
>                  sample.opt \
>                  sample.cgr
>           l86k/p sample;
>     sample.obj : sample.asm
>           m86k sample;

#### コマンドブロック

コマンド行は、依存記述行の直後に記述します。依存記述行に続く先頭に空白の置かれた行の集まりを、コマンドブロックと呼びます。MAKEは、先頭の空白の有無によって依存記述行とコマンド行を区別します。コマンド行には、依存記述部のターゲットを更新するためのコマンドを記述します。コマンドブロックが複数行からなる場合は、上から順に1行ずつ実行されます。コマンド行では、DOSコマンドが記述できます。また、内部コマンド（dirなど）も記述できます。長いコマンド行は、各行の終わりに円記号（￥）を付加すると、MAKEは次の行を継続行と解釈します。MAKEは、継続行を1コマンド行としてDOSに渡しますがDOSのコマンド行の長さの制限（最大127文字）を超えることはできません。

MAKE実行中は、MAKE本体およびワークエリアとして100KB程度消費するので、コマンド実行時、メモリ不足が発生する可能性があります。

#### コマンド修飾子

コマンド修飾子を用いることにより、コマンドブロックの制御をより細かく制御可能になります。1つのコマンドに複数のコマンド修飾子を使用できます。コマンド修飾子は、修飾するコマンドの前に付加します。

#### ＠command

MAKEが実行中のコマンドのコマンド行をディスプレイに表示しません。ただし、コマンドの結果（コマンドが出力する）は、表示されます。関連する機能として、／Sオプションスイッチ、.SILENTディレクティブがあります。

／Sオプションは、MAKEファイル全体に対してコマンド表示を禁止します。 .SILENTディレクティブは、コマンド非表示モードになります。

#### -command

コマンドのエラーチェックをしません。MAKEは、コマンドが返す終了コードが、0以外の時、処理を中断します。−修飾子を用いると、MAKEはそのコマンド行の終了コードを 無視します。関連する機能として、／Iオプションスイッチ、.IGNOREディレクティブがあります。

／Iオプションは、MAKEファイル全体に対して、コマンドの終了コードを無視します。 .IGNOREディレクティブは、コマンドの終了コードを無視するモードになります。

#### コマンド修飾子の使用例

>     sample.eva : sample.obj subr.obj sample.opt sample.cgr
>         @echo sample.eva creating now.   ←　エコー表示
>         l86k/p sample+subr;
>     sample.obj : sample.asm
>         -m86k sample;                    ←　アセンブルエラーを無視
>     subr.obj : subr.asm
>         -m86k subr;                      ←　アセンブルエラーを無視

#### 擬似ターゲット

擬似ターゲットは、ターゲットの指定の1つですが、ファイルを指定するのではなく単にラベルという感覚でターゲットを指定することをいいます。この場合MAKEは、擬似ターゲットを、常に存在しない更新の必要なファイルと解釈します。擬似ターゲットとして指定する場合は、カレントディレクトリに同一名のファイルが、存在しないことを確認してください。

#### 擬似ターゲットの使用例

>     all : copy sample1.eva sample2.eva
>     sample1.eva : sample1.obj sample1.opt sample1.cgr
>          m86k/p sample1;
>     sample2.eva : sample2.obj sample2.opt sample2.cgr
>          m86k/p sample2;
>     copy : copy sampl?.eva c:\old_prog\

上記の例では、MAKE起動時のコマンドパラメータで、allが指定またはターゲットの指定がすべて省略された時、擬似ターゲットallは“sampe1.eva”“sample2.eva”の両方をビルドします。擬似ターゲットcopyは“sample1.exa”“sample2.eva”を更新する前に、c：\old_progへコピーします。

#### 19-2-2　マクロ

マクロは、MAKEファイル中の文字列を別の文字列に置換する機能です。C言語における＃defineと同等の機能といえます。マクロには、ユーザーマクロと組み込みマクロがあります。ユーザーによって定義されるマクロをユーザーマクロと言います。また、既に組み込まれているマクロのことを組み込みマクロと言います。

#### ユーザーマクロ定義

新しくマクロを定義するには、次の構文に基づいて行います。

>     macroname=string

macronameには、英数字とアンダースコア（_）を任意に組み合わせた文字列を指定します。macronameの最大長は、255文字です。マクロ名の大文字と小文字は区別されません。たとえば、MacroNameとMACRONAMEは同じマクロとみなします。また、macronameには、マクロ参照を含むことができます。その場合、参照されるマクロは、それ以前の行で、定義されていなければなりません。

stringは、任意の長さの文字列を指定できますが、マクロ定義は1行で完結しなければなりません。円記号（￥）による継続行指定が可能です。また、長ささ0の文字列も指定できます。この場合、このマクロを参照しても、置換される文字列はないので、文字列の消去などに利用できます。同一名のマクロが2か所以上で定義されている場合は、最後に定義されたものが有効となります。

#### 内部マクロと外部マクロ

ユーザー定義マクロには、MAKEファイル内で定義参照される「内部マクロ」と、MS-DOSシェル機能が、サポートしている環境変数を用いた「外部マクロ」があります。いずれも、書式は同じです。内部マクロと外部マクロの優先度は、ディフォルトで内部マクロ優先ですが、／Eオプションを指定することにより、外部マクロを優先することができます。

#### ユーザーマクロ参照

マクロを参照するには、ドル記号（＄）の後にカッコで囲み、マクロ名を指定します。ただし、マクロ名が1文字の場合は、カッコで囲む必要はありません。

>     $（macroname）または $c

未定義のマクロ名が参照された場合、置換される文字列はありません。

#### 組み込みマクロの参照

MAKEには、ファイル名を表す組み込みマクロが用意されています。

#### マクロ設定および参照例

>     ASM  = m86k                     # LC86000 シリーズ アセンブラ
>     LINK = l86k/p                   # LC86000 シリーズ リンカ

>     all : sample.eva                   ←　擬似ターゲットの使用
>     sample.obj : $*.asm                ←　ターゲットのベース名参照
>                  $ (ASM)  $*;          ←　アセンブラ コマンドの参照
>     sample.eva : $*.obj $*.opt $*.cgr  ←　ターゲットのベース名参照
>                  $ (LINK) $*;          ←　リンカ コマンドの参照

#### 19-2-3　ディレクティブ

ディレクティブは、記述ブロックの外側で、しかも行の先頭に記述します。MAKEには、次の3つのディレクティブがあります。

#### .IGNORE：{＋｜−}

MAKEファイルのコマンド実行により、起動されたプログラムが返す終了コードを無視するモードを変更します。プラス記号（＋）を指定した時、終了コードを無視するモード、マイナス記号（−）を指定した時、終了コードを有効ににするモードとなります。デフォルトでは、終了コードが0以外の時、MAKEは処理を中断します。1つのコマンドに対してのみ終了コードを無視するには、マイナス記号修飾子を使用します。MAKEファイル全体に対して終了コードを無視するには、／Iオプションを使用します。

#### .SILENT：{＋｜−}

MAKEファイルのコマンドを実行する時、そのコマンドを表示しないモードにします。プラス記号（＋）を指定した時、コマンドを表示しないモード、マイナス記号（−）を指定した時、コマンドを表示するモードとなります。デフォルトでは、実行するコマンドを表示します。1つのコマンドに対してのみ表示を禁止するには、アットマーク記号（＠）修飾子を使用します。MAKEファイル全体に対して表示を禁止するには、／Sオプションを使用します。

#### .DEFAULT：

MAKEでは、コマンドブロックの記述がない記述ブロックでは、推論規則が機能し対応する生成規則のコマンドを実行します。この時、生成規則がない場合は、コマンドブロックは空欄となりますが、MAKEファイルに.DEFAULTで始まる行によって、コマンド列を記述すると、その時に実行すべきコマンドを指定することができます。

>     .DEFAULT
>                commands

#### .TARGET：suffixs

MAKEでは、最終ターゲット（ビルドしたいターゲット）をコマンドラインで指定できますが、省略した場合は、最初の記述ブロックのターゲットを最終ターゲットとしますが、この.TARGETディレクティブにより、ディフルト最終ターゲットの拡張子を指定することで、ビルドしたいファイルの拡張子を最終ターゲットに指定できます。suffixは、ピリオド（.）を含めて4文字までです。また、suffixは、スペースで区切ることで複数指定できます。

[←] | [INDEX] | [→]