プログラミングユーティリティ

簡単なメークファイルの記述

メークファイルのターゲットのエントリの基本的な書式は、以下のとおりです。

表 4-1 メークファイルのターゲットのエントリ形式
target .  .  .  : [ dependency .  .  .  ] 
            [ command ]
             . . .

最初の行では、ターゲット名のリストの後にコロンを付けます。依存関係がある場合にはコロンの後にそのリストを記述します。複数のターゲットが記述されている場合は、指定された規則を使用して各ターゲットが独立して構築されます。

タブで始まる次の行に示されているように、行はターゲットの規則を示すコマンド行になります。タブの代わりに空白文字を使用することはできません。

# で始まる行は、次の (エスケープされていない) 復帰改行 (NEWLINE) までがコメントとして扱われ、ターゲットのエントリとして処理されません。次にタブ# 以外の文字で始まる空白でない行の直前まで、あるいはファイルの最後までが、ターゲットのエントリとみなされます。

メークファイルは、以下の例のように 1 つのターゲットだけで構成される簡単なものもあります。

表 4-2 簡単なメークファイル
test: 
     ls test 
     touch test

引数を指定せずに make を実行すると、make はまず makefile という名前のファイルを検索し、見つからない場合は Makefile という名前のファイルを検索します。いずれかの名前のメークファイルが SCCS 管理されている場合、make は SCCS の履歴ファイルを調べ、メークファイルが最新でない場合は、最新のバージョンを抽出します。

次に、makeメークファイル内の最初のターゲットのエントリについて依存関係の検査を開始します。メークファイルがない場合は、構築するターゲットのリストをコマンド行で引数として指定する必要があります。ターゲットの構築中には、make が実行中のコマンドが表示されます。

$ make 
ls test
test not found
touch test
ls test
test

この例では、test というファイルが存在しない (つまり最新の状態でない) ため、make はターゲットのエントリに指定されている規則を実行しています。make をもう一度実行すると、ターゲットは最新になっているというメッセージが表示され、規則は実行されません。

$ make 
`test' is up to date.

注 -

セミコロン (;)、切り替え記号 (<>>>|)、置換記号 (*?[]$=)、引用符、エスケープ文字、コメント ("'`¥# など、:) などの、シェルのメタキャラクタがコマンド行に含まれている場合は、make は Bourne シェルを起動してコマンド行を処理します。シェルによるコマンド行の構文解析が必要ない場合は、make はコマンドを直接実行します。


各コマンド行は独立したプロセスまたはシェルによって実行されるため、規則内での行の区切りには重要な意味があります。

以下の規則を例にして説明します。

test: 
       cd /tmp 
       pwd

この規則の実行結果は、以下のようになります。

$ make test
cd /tmp 
pwd
/usr/tutorial/waite/arcana/minor/pentangles 

一連のコマンドをセミコロンで区切って指定すると、シェルを 1 回呼び出すだけですべてのコマンドが実行されます。

test: 
    cd /tmp ; pwd

また、復帰改行をバックスラッシュ (¥) でエスケープすると、2 行に渡って記述された入力コマンドが、1 行で続けて記述された場合と同等に扱われます。make は、エスケープされた復帰改行を空白文字として処理します。

バックスラッシュは、行の最後に記述する必要があります。バックスラッシュの前には、シェルが処理するためのセミコロンが必要です。

test: 
       cd /tmp ; ¥ 
       pwd