MAKE(1)

名称
make - プログラムの依存関係をメンテナンスする

書式
make [-BPSXeiknqrstv] [-C directory] [-D variable] [-d flags] [-E variable] [-f makefile] [-I directory] [-j max_jobs] [-m directory] [-V variable] [variable=value] [target ...]

解説
make ユーティリティは、プログラムのメンテナンスを単純化するためのツールです。 その入力はファイルの生成とプログラムとの間の依存関係を指定する リストが記述されています。 カレントディレクトリまたは特別なオブジェクトディレクトリ (.OBJDIR 参照) のどちらか一方において BSDmakefile, makefile, Makefile の最初に見つかった方から、この指定のリストが読み込まれます。 .depend というファイルが見つかれば、それも読み込みます (mkdep(1) を参照)。

本マニュアルはリファレンスのためのみのドキュメントです。 make と makefile に関する詳しい紹介は を参照してください。

オプションは以下のとおりです。

-B  シーケンス中の依存行のソースを作成するために、各コマンドに対して 1 つのシェルを実行する、バックワード互換モードで実行しようとします。 このオプションは -j が使用されない限り、デフォルトで有効になります。

-C directory
    makefile の読み取りや他のなにかをする前に、 directory へ移動します。 複数の -C が指定された場合、それぞれは、直前のものに対する相対として解釈されます。 -C / -C etc は -C /etc と等価です。

-D variable
    大域変数 variable を 1 と定義します。

-d flags
    デバッグモードを有効にし、 make が表示するデバッグ情報の種類を指定します。 引数 flags には、以下のうち 1 つ以上を指定できます。

    A   すべてのデバッグ情報を出力します。 他のフラグをすべて指定したことと等価です。

    a   アーカイブ検索とキャッシュに関する情報を表示します。

    c   条件評価に関する情報を表示します。

    d   ディレクトリ検索とキャッシュに関する情報を表示します。

    f   for ループの実行に関するデバッグ情報を表示します。

    g1  処理を行う前に、入力のグラフを表示します。

    g2  すべての処理を行ったあと、あるいはエラーにより終了する前に入力のグラフを 表示します。

    j   複数のシェルを起動する場合の情報を表示します。

    l   @ がコマンドに前置されていようといまいと、 また他の「静寂」フラグの有無に関わらず、Makefile のコマンドを表示します。 これは「やかましい」動作としても知られています。

    m   ターゲットの作成と変更日付に関する情報を表示します。

    s   拡張子解釈に関する情報を表示します。

    t   ターゲットリストのメンテナンスに関する情報を表示します。

    v   変数の値に関する情報を表示します。

-E variable
    (存在すれば) 環境の値で上書きする、makefile の中の変数を指定します。

-e  環境の値で makefile 中のすべての変数の値を上書きするように指示します。

-f makefile
    デフォルトの makefile と Makefile のかわりに、読み込むファイルを指定します。 もし makefile が ‘-’ なら標準入力から読み込みます。 複数のファイルが指定可能で、指定した順に読み込まれます。

-I directory
    makefile と、インクルードされる makefile を検索するためのディレクトリを 指定します。 システムで定義してある makefile のあるディレクトリ (または、 複数のディレクトリ; -m オプションを参照) は自動的にリストに含まれ、検索されます。

-i  makefile から実行されたシェルコマンドが 0 でない終了ステータスを 返しても無視します。 makefile 中でコマンドの先頭に ‘-’ を指定するのと同じです。

-j max_jobs
    make が同時に起動できるジョブの数を指定します。 B フラグを指定しなければ、互換性モードはオフになります。

-k  エラーが発生しても処理を続行します。 ただし、発生したエラーによって作成が不能になったターゲットに 依存したターゲットに関しては処理が中断されます。

-m directory
    <...> 形式で読み込まれる sys.mk や makefile を検索するための ディレクトリを指定します。 複数のディレクトリを検索パスに加えることができます。 このパスは、デフォルトのシステムインクルードパス /usr/share/mk を上書きします。 さらに、システムインクルードパスを "..." 形式のインクルードによって 追加することができます( -I オプションを参照)。

-n  make が実行するであろうコマンド内容の表示のみを行い、実行はしません。

-P  並行して動作するジョブを一緒に混ぜて出力するのでなく、 与えられたジョブの順番をそろえて、ジョブが終了するまで表示しません。 このオプションは -j が使われた時のみ効果を持ちます。

-q  いっさいのコマンドを実行せず、指定されたターゲットが最新のものであれば 0 を、そうでなければ 1 を終了ステータスとして返します。

-r  システムの makefile で定義された組み込みのルールを使用しません。

-S  エラーが起きた時に処理を中止します。 デフォルトの動作です。 このオプションは再帰的な構築の際に -k オプションを打ち消すのに必要となります。

-s  実行するコマンドを表示しません。 makefile のなかで、コマンドの先頭に ‘@’ を指定するのと同じです。

-t  makefile で指定されたターゲットを作り直すのではなく、ターゲットを作成 するか、あるいは最終更新日付を現在の時刻に設定することにより、 ターゲットが最新であるかのようにします。

-V variable
    グローバルな文脈での make の variable の値を表示します。如何なるターゲットも生成しません。 このオプションで複数のインスタンスを指定することができます。 変数は、各行ごとに表示されます。 未定義もしくは空の変数は、空行で 表現されます。

-v  特に冗長表示させます。 複数ジョブの make においては、ファイルバナーを生成させます。

-X  -V オプションを使用して変数の値を表示するときに、再帰的な値の展開をしません。

variable=value
    変数 variable の値を value に設定します。

makefile には 7 種類の行があります: 依存関係記述、シェルコマンド、変数 代入、インクルード文、条件命令、for ループ、コメントです。

一般に、行は行末にバックスラッシュ (‘\’) を置くことにより次行へ継続させることができます。 この場合、バックスラッシュ直後の改行と、次の行の先頭の 空白部分は 1 つの空白に置き換えられます。

ファイル依存関係記述
入力ファイルにおける依存関係記述行は、1 つ以上のターゲット、オペレータ、 0 個 以上のソースからなります。 これは、ターゲットがソースに “依存” しているという関係を 定義しており、通常は、ソースからターゲットが作成されます。 ターゲットと ソースとの厳密な関係はオペレータによって、両者間に指定します。 オペレータには以下の種類があります。

:   ターゲットの最終更新日付が、いずれかのソースの最終更新日付よりも 古いものであれば、ターゲットは古いものであり、作り直されるべきものと 判断されます。 別の行でこのオペレータによる同じターゲットに関するソースの記述があれば、 それらはすべて 1 つにまとめられます。 ターゲットの作成中に make が中断されると、ターゲットは削除されます。

!   ターゲットはつねに作り直されます。 ただし、作り直されるのは、 すべてのソースが検査され、必要と判断されたソースが作り直されたあとです。 このオペレータによる同じターゲットに関するソースの記述が別の行にもあれば、 それらはすべて 1 つにまとめられます。 ターゲットの作成中に make が中断されると、ターゲットは削除されます。

::  ソースが指定されていなかった場合、つねにターゲットは作り直されます。 指定されていた場合にはソースのいずれかがターゲットよりも新しい時だけ ターゲットは作り直されます。 本オペレータでは、別の行において同じ ターゲットに関するソースの記述があっても 1 つにまとめません。 ターゲットの作成中に make が中断されても、ターゲットは削除されません。

ターゲットとソースは、シェルのワイルドカード表記として ‘’?, ‘*’, ‘[]’, ‘{}’ を含むことができます。 ‘’?, ‘*’, ‘[]’ の表記は、ターゲットまたはソースの最後の要素として記述でき、 存在するファイルを指定するものでなければなりません。 表記 ‘{}’ はファイルが存在しなくてもかまいません。 シェルのように辞書順に並べられて 展開されることはなく、ファイルシステム上に並んでいる順番のまま行われます。

シェルコマンド
ターゲットは、シェルコマンドの列と関連付けることができ、通常はそれによって ターゲットを作成します。 これに含まれる各コマンドは、 必ず 行頭のタブに続けて記述します。 同一のターゲットに 対して複数の依存記述行がある場合、 ‘::’ オペレータを使用したのでなければ、それらのうちの 1 つにのみコマンド行を 続けることができます。

コマンドラインの先頭の文字が ‘@’, ‘-’, ‘+’ のいずれか ならば、コマンドは特別な扱いを受けます。 ‘@’ は、コマンド実行前のコマンド内容表示を抑制します。 ‘-’ は、コマンドの 0 ではない終了ステータスを無視するように指示します。 ‘+’ は、たとえ -n がコマンドラインで指定されていたとしても、 コマンドを実行するようにします。

変数代入
make で使われる変数はシェルでの変数に類似しています。 そして、歴史的な経緯から、すべて大文字からなる名前が用いられます。 変数代入には以下の 5 通りのオペレータを使用できます。

=   変数に値を代入します。その時点までの値は失われます。

+=  現在の変数の値に、右辺の値を追加します。

?=  変数が未定義の場合のみ、値を代入します

:=  右辺を展開した値を代入します。つまり、変数に代入する前に値の展開を行います。 通常、値の展開は代入時には行われず、変数が参照されるときに行われます。

!=  右辺を展開した値をシェルに実行させ、実行結果を左辺の変数に代入します。 結果のなかに含まれる改行は空白に置き換えられます。

いずれの場合も、値の前にある空白は無視されます。 値が追加される場合、 変数の直前の値と追加する値との間に空白が挿入されます。

変数は、ドル記号 (‘$’) に続いて中括弧 (‘{}’) または小括弧 (‘()’) で囲まれた変数名を置くことにより展開されます。 もし変数名が 1 文字なら、変数名を囲む括弧は省略できますが、 このような省略形は推奨できません。

変数置換は、変数が用いられている場所により、 2 つの別々のタイミングで 行われます。 依存関係記述行で用いられた変数は、その行が読み込まれたときに 展開されます。 シェルコマンド内で用いられた変数は、シェルコマンド実行時に 展開されます。

変数には、優先度に従って、4 つの異なるクラスがあります:

環境変数
    make の環境中で有効な変数

グローバル変数
    makefile とインクルードされた makefile 内で有効な変数。

コマンドライン変数
    コマンドラインの中で指定された変数、および、 MAKEFLAGS 環境変数または .MAKEFLAGS ターゲットから取得した変数。

ローカル変数
    あるターゲットのみに対して定義される変数。 ローカル変数には、以下の 7 種類があります:

    .ALLSRC
        このターゲットに対するすべてのソースのリスト。 ‘>’ も同じです。

    .ARCHIVE
        アーカイブファイル名。 ‘’! も同じです。

    .IMPSRC
        ターゲット名に変換するのに使用するソースのファイル名またはパス名 ( “暗黙の” ソース)。 ‘<’ も同じです。

    .MEMBER
        アーカイブのメンバ。 ‘%’ も同じです。

    .OODATE
        ターゲットよりも新しいソースのリスト。 ‘’? も同じです。

    .PREFIX
        ターゲットのディレクトリ名と拡張子を取り除いた名前。 ‘*’ も同じです。

    .TARGET
        ターゲットの名前。 ‘@’ も同じです。

    短い形式 ‘@’, ‘’!, ‘<’, ‘%’, ‘’?, ‘>’, ‘*’ は互換性のためのものですが、利用することは推奨できません。 また、 ‘@F’, ‘@D’, ‘<F’, ‘<D’, ‘*F’, ‘*D’ は AT&T UNIX の makefile との互換性のために存在していますが、利用することは 推奨できません。

    次の 4 つのローカル変数は依存関係記述行のソースに使うことができます。 これらは、その行のターゲット毎の値に展開されます。 これらのローカル変数は .TARGET, .PREFIX, .ARCHIVE, .MEMBER です。

さらに、 make では以下の内部変数または環境変数を利用することができます。

$   単一のドル記号 ‘$’ 。 すなわち、 ‘$$’ は単一のドル記号に置換されます。

MAKE
    make の起動に使用された名前 (argv[0]) 。

.CURDIR
    make が実行されたディレクトリ。 make ユーティリティは .CURDIR を、 getcwd(3) から渡される公式なパスに設定します。

.OBJDIR
    ターゲットを作成するディレクトリへのパス。 起動時に、 make はターゲットファイルを置く代わりのディレクトリを検索します。 make はこの特別なディレクトリに移動することを試み、 makefile がカレントディレクトリになかった場合にはこのディレクトリで 検索されます。 以下の順番でディレクトリは試されます:

    1.  ${MAKEOBJDIRPREFIX}/`pwd`
    2.  ${MAKEOBJDIR}
    3.  obj.${MACHINE}
    4.  obj
    5.  /usr/obj/`pwd`

    最初に make が移動に成功したディレクトリが使われます。 もし MAKEOBJDIRPREFIX または MAKEOBJDIR のどちらかが環境で設定されていて make が対応するディレクトリに移動できなかった場合は、 リストの残りをチェックすることなしにカレントディレクトリが使われます。 それらが定義されておらず make が残った 3 つのディレクトリのいずれにも移動できなかった場合、 カレントディレクトリが使われます。 MAKEOBJDIRPREFIX と MAKEOBJDIR とは環境変数でなければならず、 make のコマンドラインで設定してはいけません。

    make ユーティリティは、 getcwd(3) で与えられる正規化されたパスを .OBJDIR へ設定します。

.MAKEFILE_LIST
    デフォルトファイルや、コマンドラインや、 .include ディレクティブから得られた makefile も含め、 make がさまざまな makefile を読み込むときに、 .MAKEFILE_LIST 変数にそれらの名前が自動的に追加されます。 現在の makefile の名前がこの変数の末尾の単語となるようにするため、 これらは、 make がパーズ開始する前に右側に追加されます。

.MAKEFLAGS
    環境変数 MAKEFLAGS は、 make のコマンドラインにて指定されるあらゆるものを含みます。 その中身は .MAKEFLAGS 変数に記憶されます。 make のコマンドラインで指定されたオプションと変数代入のすべてが .MAKEFLAGS 変数に追加され、 make が実行する全プログラムの環境にこの変数が MAKEFLAGS として組み込まれます。

MFLAGS
    下位互換性のために提供されます。 この変数は、 MAKEFLAGS 環境変数から得たオプションすべてに加え、 make のコマンドラインで指定されたオプションすべてを含みます。

.TARGETS
    make が現在構築しているターゲットのリスト。

.INCLUDES
    .INCLUDES 特殊ターゲット参照。

.LIBS
    .LIBS 特殊ターゲット参照。

MACHINE
    MACHINE 環境変数、または定義されていない場合は uname(3) によって得られる、 make が動作しているマシンアーキテクチャの名称。

MACHINE_ARCH
    make のコンパイル時に定義された make がどのマシンアーキテクチャ向けにコンパイルされたかを示す名称。

VPATH
    Makefile はコロンで区切られたディレクトリのリストを VPATH に設定することができます。 make が全ての入力 makefile の解析を終了した後、 このディレクトリでソースファイルを検索します。

変数展開において、その変数内の単語を選択したり、変更したりすることが できます ( “単語” とは空白で区切られた文字列です)。 変数展開の一般形は、次のとおりです。

    {variable[:modifier[:...]]}

各修飾子は、コロンと以下に示すいずれかの文字のうち 1 文字からなります。 リテラルなコロン (‘’): を指定するにはコロンの前にバックスラッシュ (‘\’) を置きます。

C/pattern
    /replacement /[1g] 拡張正規表現 pattern (re_format(7) を参照) に一致する部分それぞれを、 ed(1) スタイルの replacement 文字列と置換することで、その値の各語を変更します。 通常、値中の各語の最初のパターンを置換します。 ‘1’ 修飾子は、置換対象をたかだか 1 語に制限します。 ‘g’ 修飾子は、置換対象の個数が、 語 (または複数の語) 中で見つかる検索パターン数と同じになるようにします。 ‘1’ と ‘g’ は直交していることに注意してください。 前者は、複数の語が影響を受け得るか否かを指定しますが、 後者は、影響を受ける各語の中で複数の置換が発生し得るか否かを指定します。

E   変数中の各単語を拡張子で置換します。

H   変数中の各単語を、パスの最後の要素 を除いた部分で置換します。

L   変数を小文字に変換します。

Mpattern
    pattern にマッチする単語を選択します。 標準的なワイルドカード (‘*’, ‘’?, ‘[]’) が使用できます。 ワイルドカード文字はバックスラッシュ (‘\’) によりエスケープできます。

Npattern
    pattern にマッチしない単語を選択します。 それ以外は M と同様です。

O   変数中のすべての語をアルファベット的に整列させます。

Q   変数中のすべてのシェルメタ文字をクォートし、再帰起動される make に安全に渡せるようにします。

R   変数中の各単語から拡張子を取り除きます。

S/old_string
    /new_string /[g] 変数の値で各単語中の最初の old_string を new_string に置換します。 もし、最後のスラッシュのあとに ‘g’ が指定されていれば、各単語中に出現したすべての old_string が new_string に置換されます。 old_string がキャレット (‘^’) で始まっているなら、 old_string を各単語の先頭からマッチさせることを 意味します。 old_string がドル記号 (‘$’) で終わっているなら、その文字列を各単語の終端にマッチさせることを 意味します。 new_string 中のアンパサンド (‘&’) は old_string に置換されます。修飾文字列の区切りにはどんな文字を使ってもかまいません。 ‘^’ , ‘$’ , ‘&’ と区切り文字はバックスラッシュ (‘\’) によりエスケープできます。

    old_string と new_string 中では通常の変数置換が行われます。 ただし、ドル記号 (‘$’) の展開を抑制するためには、通常のドル記号の前置ではなく、 バックスラッシュでエスケープします。

old_string=new_string
    これは AT&T UNIX での変数置換の形式です。これは最後の修飾子として指定する必要があります。 もし、パターンマッチ文字 % が new_string にも old_string にも含まれないなら、 new_string と old_string はどちらも単語の最後にマッチするものとみなされます。 すなわち、 拡張子のみか、または単語全部が置換されることになります。 そうでなければ、 % が old_string に含まれており、それは new_string に置換されます。

T   変数中の各単語をパスの最後の要素 で置換します。

U   変数を大文字に変換します。

ディレクティブ、条件式、FOR ループ
make では、C 言語を彷彿させるディレクティブ、条件文、ループを使用することが できます。 これらの制御構造は、行頭に単一のドット (‘’). がくることで識別されます。 以下のディレクティブがサポートされています:

.include <file>

.include file
    指定した makefile をインクルードします。 アングルブラケットが使用された場合は、 makefile はシステムの makefile ディレクトリにあるものを用います。 ダブルクォートが使用された場合は、 makefile が存在するディレクトリ、 -I オプションで指定されたディレクトリ、システムの makefile ディレクトリの 順に検索します。

.undef variable
    指定したグローバル変数を未定義とします。 グローバル変数のみ、未定義とすることができます。

.error message
    makefile の処理を即座に終了します。 makefile のファイル名と、どの行でエラーとなったかと、 指定したエラーメッセージとを、標準出力に表示し、 make は終了コード 1 で終了します。

.warning message
    警告メッセージを発します。 makefile のファイル名、どの行でエラーになったかと、 指定したエラーメッセージとを、標準エラー出力に表示します。 メッセージ中の変数は展開されます。

条件文は Makefile のどの部分を処理するのかを判定するために使用します。 C プリプロセッサがサポートする条件文と同様に使用されます。 以下の条件文がサポートされています:

    .if [!]expression [operator expression ...] 式の値をテストします。

    .ifdef [!]variable [operator variable ...] 変数の値をテストします。

    .ifndef [!]variable [operator variable ...] 変数の値をテストします。

    .ifmake [!]target [operator target ...] ターゲット target が作成中かどうかをテストします。

    .ifnmake [!]target [operator target ...] ターゲット target が作成中かどうかをテストします。

.else
    最後に行った条件文の意味を逆にします。

    .elif [!]expression [operator expression ...] .else と直後の .if を対にしたものです。

    .elifdef [!]variable [operator variable ...] .else と直後の .ifdef を対にしたものです。

    .elifndef [!]variable [operator variable ...] .else と直後の .ifndef を対にしたものです。

    .elifmake [!]target [operator target ...] .else と直後の .ifmake を対にしたものです。

    .elifnmake [!]target [operator target ...] .else と直後の .ifnmake を対にしたものです。

.endif
    条件文の本体を終了させます。

オペレータ operator は、以下のうちのいずれかです。

||  論理 OR 。

&&  論理 AND 。 ‘||’ より優先順位が上です。

C 言語と同様、 make は条件式を、式の値を決定するのに必要なところまでしか評価しません。 評価順序を変更するには括弧を使います。 論理オペレータ ‘’! は条件式全体の値を反転するのに使用します。 これは ‘&&’ より優先順位が上です。

式 expression は、以下のいずれかの形式です:

defined
    引数として変数名をとり、変数が定義されていれば真となる。

make
    引数としてターゲット名をとり、そのターゲットが make のコマンドライン引数に指定されているか、デフォルトのターゲット (明示的なものも暗黙的なものも含む。 .MAIN の項を参照) として宣言されている場合に真となる。

empty
    引数として変数名 (と修飾子) をとり、展開した結果が空文字列ならば真となる。

exists
    引数としてファイル名をとり、ファイルが存在すれば真となる。 ファイルはシステム検索パス (.PATH の項を参照) にそって検索される。

target
    引数としてターゲット名をとり、ターゲットが定義されているなら真となる。

条件式 expression としては、数値あるいは文字列の比較を用いることもでき、 左辺には変数展開を使用可能です。 比較オペレータの 両辺は、変数展開が適用されたあとに比較されます。 値が 0x で始まるなら 16 進数であると解釈し、 さもなければ 10 進数と解釈します。 8 進数はサポートしていません。 標準的な C 言語の関係オペレータは全て利用可能です。 変数展開後、 ‘==’ または ‘!=’ の左辺値または右辺値のいずれかが数値とは認められない場合、文字列として 比較を行います。 関係オペレータが指定されなかった場合、展開された変数と 0 とを 比較します。

条件式を評価中に、評価できない単語が出現した場合は、条件式の形式によって、 “make” または “defined” オペレータを適用します。 条件式が .if, .ifdef または .ifndef ならば “defined” を、条件式が .ifmake または .ifnmake ならば “make” を、それぞれ適用します。

条件式が真と評価されたなら、makefile の解析はそのまま続行されます。 偽と評価されたなら、 .else または .endif が見つかるまで makefile の解析をスキップします。

for ループは、いくつかのルールを一連のファイルに適用するのによく 用いられます。 以下がループの形式です:

.for variable in expression
<make-rules>
.endfor

expression は評価されたあとに単語に分解され、それぞれを variable に代入 しながら、 make-rules 部分を繰り返し展開します。

コメント
コメントはハッシュ記号 (‘#’) から始まり、シェルコマンド行以外のどこにでも置くことができます。 コメントは改行で終わります。

特殊ソース

.IGNORE
    本ターゲットに関連したコマンドでのエラーを無視します。 シェルコマンドの先頭にダッシュ ‘-’ を指定したのと等価です。

.MAKE
    たとえ、 -n や -t オプションが指定されていても、このターゲットに関連したシェルコマンドを 実行します。 通常、再帰的な make のために用いられます。

.NOTMAIN
    通常 make は、最初に発見したターゲットをデフォルトのターゲットとみなします。 .NOTMAIN が指定されたターゲットはデフォルトのターゲットとはみなされなくなります。

.OPTIONAL
    もし .OPTIONAL が指定されたターゲットの作り方がわからなくても、エラーとはせず、 そのターゲットは必要ないか、すでに存在しているものとみなします。

.PRECIOUS
    通常 make が中断されたときは、作成途中のターゲットは削除されます。 本ソースを指定することで、そのターゲットを削除しなくなります。

.SILENT
    指定されたターゲットに関連づけられたシェルコマンドを実行するときに エコーを行いません。 シェルコマンドの先頭に ‘@’ を指定したのと等価です。

.USE
    指定されたターゲットをマクロ的に扱います。 .USE をソースに持つターゲット (以下ではマクロと呼びます) が別のターゲットのソースとなった場合、その ターゲットはコマンド、ソース、属性( .USE は除く) をマクロから受け取ります。 もし、すでにターゲットにコマンドが指定されていた 場合は、マクロのコマンドが追加されます。

.WAIT
    特別な .WAIT ソースが依存関係行に現れた時には、ソースはその行中でソースが 作成されるまで待ちます。 ループは検出されず、ループ形式のターゲットは単に無視されます。

特殊ターゲット
特殊ターゲットは、他のターゲットとともに使用してはいけません。 すなわち、 依存関係記述行の唯一のターゲットとして指定する必要があります。

.BEGIN
    本ターゲットに指定されたシェルコマンドは他の処理に先立って実行されます。

.DEFAULT
    これは、作成方法がわからないどんなターゲットにも適用される .USE ルールのようなものです。シェルスクリプトのみを使用します。 .DEFAULT に指定されたコマンド中の .IMPSRC 変数はターゲット自身の名前に置換されます。

.END
    本ターゲットに指定されたシェルコマンドは、他のすべての処理の終了後に 実行されます。

.IGNORE
    指定されたソースに .IGNORE 属性を付与します。 もしソースが指定されていなければ、 -i オプションを指定したのと同じ意味になります。

.INCLUDES
    ソースファイル中で include される可能性のあるファイルの拡張子のリスト。 拡張子はあらかじめ .SUFFIXES で宣言されていなければなりません; このように宣言された拡張子は自身の検索パス( .PATH 参照) にそれぞれ -I フラグを前に付けた状態で .INCLUDES 特殊変数に設定されます。

.INTERRUPT
    make が中断されたとき、本ターゲットに指定されたコマンドを実行します。

.LIBS
    .INCLUDES が include ファイルに対して行うことと同じことを ライブラリに対して行います。 ただし -L フラグが使われます。

.MAIN
    ターゲットを指定せずに make が起動された場合、本ターゲットを処理します。 make がデフォルトターゲットを選択した際に、 利用者がコマンドラインからデフォルトターゲットを指示できるようにするため、 明示的・暗黙的に関わらず必ず設定されます。

.MAKEFLAGS
    ソースにおいて、 make に指定するフラグを指定します。 フラグはシェルでタイプしたのと同様に 渡されますが、 -f オプションは無効になります。

.MFLAGS
    上と同様です。下位互換性のためのものです。

.NOTPARALLEL
    並列モードを使いません。

.NO_PARALLEL
    上と同じですが、 pmake の変種のための互換性のためにあります。

.ORDER
    シーケンス中の名前付きターゲットが作成されます。

.PATH
    カレントディレクトリに発見できなかったときのファイルの検索パスを、 本ターゲットのソースとして指定します。 ソースが指定されなかった場合、 以前に設定されていたディレクトリが無効になります。 可能であれば .PATH を利用する方が、 VPATH 変数を利用するよりも好まれています。

.PATHsuffix
    カレントディレクトリに発見できなかったときの suffix のついたファイルの検索パスをソースとして指定します。 make ユーティリティはファイルが見つからなかった場合に、 デフォルトパスよりも先に、まず suffix の付いた検索パスで探します。 この形式は .LIBS と .INCLUDES が動作するために必要です。

.PHONY
    .PHONY 属性を指定したソースに適用します。 この属性を持ったターゲットは いつでも更新されていると考えられます。

.PRECIOUS
    指定されたソースに .PRECIOUS 属性を付与します。 もし、ソースが指定されなかった場合、 すべてのターゲットに .PRECIOUS 属性を与えます。

.SILENT
    指定されたソースに .SILENT 属性を付与します。 もし、ソースが指定されなかった場合、 ファイル中のすべてのコマンドに .SILENT 属性を与えます。

.SUFFIXES
    ソースにおいて、 make で用いる拡張子を指定します。 ソースが指定されなかった場合は、 以前の指定が無効になります。

互換性
make の古いバージョンは MAKEFLAGS の代わりに MAKE を使っていました。 この機能は POSIX への互換性のために削除されました。 内部変数 MAKE は .MAKE と同じ値が代入されます ; この機能は将来削除されるかもしれません。

ここに書かれている以上の make の奥義のほとんどは、 より多くの互換性を保つために使用を避けるべきです。

環境変数
make ユーティリティは、存在する場合、次の環境変数の値を用います: MACHINE, MAKE, MAKEFLAGS, MAKEOBJDIR, MAKEOBJDIRPREFIX

関連ファイル
.depend
    依存関係リスト
Makefile
    依存関係リスト
makefile
    依存関係リスト
obj オブジェクトディレクトリ
sys.mk
    システム定義の makefile (他のすべてのファイルよりも前に処理されます。 これには makefile と Makefile も含まれます)
/usr/share/mk
    システム定義の makefile が置かれるディレクトリ
/usr/share/doc/psd/12.make
    PMake のチュートリアル
/usr/obj
    デフォルトの MAKEOBJDIRPREFIX ディレクトリ

使用例
インクルードされた makefile すべてを、訪問順にリストする。

    make -V .MAKEFILE_LIST | tr \  \\n

バグ
.OBJDIR の決定は不条理といっていいほどまで曲解されます。

複数の .MAIN 特殊ターゲットが存在した場合、 make は最初のもの以外は黙って無視します。

make がターゲット名なしに起動され、かつ、 .MAIN 特殊ターゲットが存在しなかった場合、 .TARGETS にデフォルトターゲットは設定されません。

テストにおける expression の評価は非常に単純です。 今のところ、 ‘.if ${VAR} op something’ という形式でしか動きません。 例えば、テストは ‘.if ${VAR} == string’ のように書かなければなりません。 他の書き方ではエラーになります。

for ループはテストされる前に展開されるため、

    .for ARCH in ${SHARED_ARCHS}
    .if ${ARCH} == ${MACHINE}
         ...
    .endif
    .endfor

のような断片は動きません。 例えば、

    .for ARCH in ${SHARED_ARCHS}
    .if ${MACHINE} == ${ARCH}
         ...
    .endif
    .endfor

のように書き直す必要があります。

コロンの後のセミコロンの扱いに関して解析コードが壊れているため、

    HDRS=   foo.h bar.h
    all:
    .for h in ${HDRS:S;^;${.CURDIR}/;}
         ...
    .endfor

のような断片は動きません。

関連項目
mkdep(1), make.conf(5) PMake - A Tutorial. /usr/share/doc/psd/12.make にあります。

歴史
make は PWB UNIX ではじめて現れました。