MAKE(1)

名称
make - ファイル間の依存関係に従い、ファイルを更新する

書式
make [-eiknqrstv] [-D variable] [-d flags] [-f makefile] [-I directory] [-j max_jobs] [variable=value] [target ...]

解説
make は、プログラムのメンテナンスを単純化するためのツールです。プログラムと それを作成するために必要なファイルのリストを入力とします。もしファイル ‘makefile’ が存在すればそれを、さもなければ ‘Makefile’ を読み込みます。 ‘.depend’ というファイルがあれば、それも読み込みます (mkdep(1) を参照) 。

本マニュアルはリファレンスのためのドキュメントです。 make と makefile に関する詳しい記述は を参照してください (“/usr/src/usr.bin/make/PSD.doc” に、本 make の元になった pmake に関する nroff(1) でフォーマットできるドキュメントがあります)。

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

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

-d flags
    デバッグモードをオンにし、 flags で指定されたデバッグ情報を出力します。 flags には、以下のうち 1 つ以上を指定できます。

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

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

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

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

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

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

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

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

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

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

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

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

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

-I directory
    makefile と、インクルードされる makefile を検索するためのディレクトリを 指定します。システムで定義してある makefile のあるディレクトリは自動的 に検索されます。

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

-j max_jobs
    make が同時に起動できるジョブの数を指定します。

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

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

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

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

-s  コマンドを実行するときに、コマンド名と引数を表示しません。makefile のなかで、 コマンドの先頭に ‘@’ を置くことで同様の効果が得られます。

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

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

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

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

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

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

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

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

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

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

もし最初の文字が ‘@’ または ‘-’ ならば (2 文字とも指定することも可能) 、コマンドは特別な扱いを受けます。 ‘@’ は、コマンドが実行される前にコマンド内容が表示されることを禁止します。 ‘-’ は、コマンドの 0 ではない終了ステータスを無視するように指示します。

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

=   変数に値を代入します。

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

?=  変数がすでに定義されていなければ、変数に値を代入します

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

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

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

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

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

変数には 4 つの異なるクラスがあります。

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

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

コマンドライン変数
    コマンドラインで指定された変数

ローカル変数
    タ−ゲットに依存して定義される変数。局所変数には、以下のものがあります。

    .ALLSRC
        このタ−ゲットに対するすべてのソースのリスト。 ‘>’ としても知られている。

    .ARCHIVE
        アーカイブファイル名

    .IMPSRC
        ターゲットが作成される元となるソース名 (ターゲットが foo.o なら foo.c 等) 。 ‘<’ としても知られている。

    .MEMBER
        アーカイブのメンバー

    .OODATE
        タ−ゲットよりも新しいソースのリスト。 ‘’? としても知られている。

    .PREFIX
        タ−ゲットのパス名と拡張子を取り除いた名前。 ‘*’ としても知られている。

    .TARGET
        タ−ゲットの名前。 ‘@’ としても知られている。

    短い形式 ‘@’ 、 ‘’? 、 ‘>’ 、 ‘*’ は従来の make との互換性のために存在しています。また、 ‘@F’ 、 ‘@D’ 、 ‘<F’ 、 ‘<D’ 、 ‘*F’ 、 ‘*D’ は AT&T UNIX との互換性のために存在しています。これらを利用することは推奨できません。

    ‘.TARGET’ 、 ‘.PREFIX’ 、 ‘.ARCHIVE’ 、 ‘.MEMBER’ の 4 つのローカル変数はタ−ゲットやソースとして使用することができます。

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

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

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

    .CURDIR
        make が実行されたディレクトリ。

    .OBJDIR
        タ−ゲットが作成されるディレクトリ

    MAKEFLAGS
        環境変数 ‘MAKEFLAGS’ には、 make のコマンドラインで指定できるすべてのオプションを指定することができます。 make のコマンドラインで指定されたオプションは、すべて ‘MAKEFLAGS’ に追加され、 make が起動するすべてのコマンドの環境に継承されます。

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

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

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

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

    H   変数中の各単語を、パスの最後の要素 (最後のスラッシュ (‘/’) より後の部分) 以外の部分で置換します。

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

    Npattern
        pattern にマッチしない単語を選択します。

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

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

        old_string と new_string 中では通常の変数置換が行われます。ただし、ドル記号 (‘$’) はバックスラッシュでエスケープします (これ以外の場所では ‘$’ によりエスケープします)。

    T   変数中の各単語をパスの最後の要素(最後のスラッシュ (‘/’) より後の部分)で置換します。

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

        たとえば、以下の例において、

            OBJS+=  ${SRCS:N*.h:N*.sh:R:S/$/.o/g}

        OBJS は、 SRCS の各単語のうち、 ‘*.h’ 、 ‘*.sh’ にマッチするものを除き、さらに拡張子のかわりに ‘.o’ を付加した単語のリストになります。

        もし、

            SRCS = foo.c bar.c foo.h

        ならば、

            OBJS = foo.o bar.o

        となります。

インクルード文、条件式、FOR ループ
make では、C 言語を彷彿させるインクルード、条件文、 for ループを使用することができます。これらの制御構造は、行頭に単一のドット (‘’). がくることで識別されます。ファイルのインクルードは ‘.include <file>’ または、 ‘.include file’ により行います。 ブラケット (‘<>’) と ダブルクォート (‘’) 中の変数は展開されます。もし、 ブラケットが使用されたなら、makefile はシステムの makefile ディレクト リにあるものを用います。ダブルクォートなら、まず、実行中の makefile が 存在するディレクトリ、 -I オプションで指定されたディレクトリ、最後にシステムの makefile ディレクトリが 検索されます。

条件式も、行頭のドットから開始します。条件式には以下のものがあります。

.undef variable
    グローバル変数を未定義とします。グローバル変数以外は 未定義とすることができません。

    .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
    引数として変数名をとり、変数が定義されていれば true となる。

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

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

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

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

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

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

条件式が true と評価されたなら、makefile の解析はそのまま続行されます。 false と評価されたなら、 ‘.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 は除く) をマクロから受け取ります。もし、すでにタ−ゲットにコマンドが指定されて いた場合は、マクロのコマンドが追加されます。

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

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

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

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

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

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

.MAIN
    タ−ゲットを指定せずに make が起動された場合、本タ−ゲットを処理します。

.MAKEFLAGS
    ソースにおいて、 make に指定するフラグを指定します。 -f オプションを指定しても意味はありません。

.PATH
    カレントディレクトリに発見できなかったときのファイルの検索パスを、 本タ−ゲットのソースとして指定します。ソースが指定されなかった場合、 以前に設定されていたディレクトリが無効になります。

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

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

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

環境変数
make は以下の環境変数の値を用います: MAKE, MAKEFLAGS, MAKEOBJDIR

関連ファイル
.depend
    依存関係リスト
Makefile
    依存関係リスト
makefile
    依存関係リスト
sys.mk
    システム定義の makefile
/usr/share/mk
    システム定義の makefile が置かれるディレクトリ

関連項目
mkdep(1)

歴史
make コマンドは AT&T UNIX において追加されました。