MAKE(1) FreeBSD 一般コマンドマニュアル 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 に関する詳しい紹介は Make − A Tutorial を参照してください。 オプションは以下のとおりです。 |
−B
シーケンス中の依存行のソースを作成するために、各コマンドに対して 1 つのシェルを実行する、バックワード互換モードで実行しようとしま す。このオプションは −j が使用されない限り、デフォルトで有効にな ります。 −C directory −D variable −d flags A a c d f g1 g2 j l m s t v −E variable −e −f makefile −I directory −i −j max_jobs −k −m directory −n −P −q −r −S −s −t −V variable −v −X variable=value makefile には 7 種類の行があります: 依存関係記述、シェルコマンド、変数代 入、インクルード文、条件命令、for ループ、コメントです。 一般に、行は行末にバックスラッシュ (‘\’) を置くことにより次行へ継続させる ことができます。この場合、バックスラッシュ直後の改行と、次の行の先頭の空 白部分は 1 つの空白に置き換えられます。 ファイル依存関係記述 |
入力ファイルにおける依存関係記述行は、1 つ以上のターゲット、オペレータ、 0 個 以上のソースからなります。これは、ターゲットがソースに ‘‘依存’’ して いるという関係を定義しており、通常は、ソースからターゲットが作成されま す。ターゲットとソースとの厳密な関係はオペレータによって、両者間に指定し ます。オペレータには以下の種類があります。 |
:
ターゲットの最終更新日付が、いずれかのソースの最終更新日付よりも古 いものであれば、ターゲットは古いものであり、作り直されるべきものと 判断されます。別の行でこのオペレータによる同じターゲットに関する ソースの記述があれば、それらはすべて 1 つにまとめられます。ターゲッ トの作成中に make が中断されると、ターゲットは削除されます。 ! :: ターゲットとソースは、シェルのワイルドカード表記として ‘?’, ‘*’, ‘[]’, ‘{}’ を含むことができます。 ‘?’, ‘*’, ‘[]’ の表記は、ターゲットまたはソー スの最後の要素として記述でき、存在するファイルを指定するものでなければな りません。表記 ‘{}’ はファイルが存在しなくてもかまいません。シェルのよう に辞書順に並べられて展開されることはなく、ファイルシステム上に並んでいる 順番のまま行われます。 シェルコマンド |
ターゲットは、シェルコマンドの列と関連付けることができ、通常はそれによっ てターゲットを作成します。これに含まれる各コマンドは、 必ず行頭のタブに続 けて記述します。同一のターゲットに対して複数の依存記述行がある場合、 ‘::’ オペレータを使用したのでなければ、それらのうちの 1 つにのみコマンド行を続 けることができます。 コマンドラインの先頭の文字が ‘@’, ‘−’, ‘+’ のいずれかならば、コマンドは特 別な扱いを受けます。 ‘@’ は、コマンド実行前のコマンド内容表示を抑制しま す。 ‘−’ は、コマンドの 0 ではない終了ステータスを無視するように指示しま す。 ‘+’ は、たとえ −n がコマンドラインで指定されていたとしても、コマンド を実行するようにします。 |
変数代入
make で使われる変数はシェルでの変数に類似しています。そして、歴史的な経緯 から、すべて大文字からなる名前が用いられます。変数代入には以下の 5 通りの オペレータを使用できます。 |
=
変数に値を代入します。その時点までの値は失われます。 += ?= := != いずれの場合も、値の前にある空白は無視されます。値が追加される場合、変数 の直前の値と追加する値との間に空白が挿入されます。 変数は、ドル記号 (‘$’) に続いて中括弧 (‘{}’) または小括弧 (‘()’) で囲まれ た変数名を置くことにより展開されます。もし変数名が 1 文字なら、変数名を囲 む括弧は省略できますが、このような省略形は推奨できません。 変数置換は、変数が用いられている場所により、 2 つの別々のタイミングで行わ れます。依存関係記述行で用いられた変数は、その行が読み込まれたときに展開 されます。シェルコマンド内で用いられた変数は、シェルコマンド実行時に展開 されます。 変数には、優先度に従って、4 つの異なるクラスがあります: 環境変数 グローバル変数 コマンドライン変数 ローカル変数 .ALLSRC .ARCHIVE .IMPSRC .MEMBER .OODATE .PREFIX .TARGET 短い形式 ‘@’, ‘!’, ‘<’, ‘%’, ‘?’, ‘>’, ‘*’ は互換性のためのもので すが、利用することは推奨できません。また、 ‘@F’, ‘@D’, ‘<F’, ‘<D’, ‘*F’, ‘*D’ は AT&T System V UNIX の makefile との互換性のた めに存在していますが、利用することは推奨できません。 次の 4 つのローカル変数は依存関係記述行のソースに使うことができま す。これらは、その行のターゲット毎の値に展開されます。これらの ローカル変数は .TARGET, .PREFIX, .ARCHIVE, .MEMBER です。 さらに、 make では以下の内部変数または環境変数を利用することができます。 $ MAKE .CURDIR .OBJDIR 1. ${MAKEOBJDIRPREFIX}/‘pwd‘ 最初に make が移動に成功したディレクトリが使われます。も し MAKEOBJDIRPREFIX または MAKEOBJDIR のどちらかが環境で 設定されていて make が対応するディレクトリに移動できな かった場合は、リストの残りをチェックすることなしにカレン トディレクトリが使われます。それらが定義されておらず make が残った 3 つのディレクトリのいずれにも移動できなかった場 合、カレントディレクトリが使われます。 MAKEOBJDIRPREFIX と MAKEOBJDIR とは環境変数でなければならず、 make のコマ ンドラインで設定してはいけません。 make ユーティリティは、 getcwd(3) で与えられる正規化され たパスを .OBJDIR へ設定します。 .MAKEFILE_LIST .MAKEFLAGS MFLAGS .TARGETS .INCLUDES .LIBS MACHINE MACHINE_ARCH VPATH 変数展開において、その変数内の単語を選択したり、変更したりすることができ ます ( ‘‘単語’’ とは空白で区切られた文字列です)。変数展開の一般形は、次の とおりです。 {variable[:modifier[:...]]} 各修飾子は、コロンと以下に示すいずれかの文字のうち 1 文字からなります。リ テラルなコロン (‘:’) を指定するにはコロンの前にバックスラッシュ (‘\’) を 置きます。 C/pattern E H L Mpattern Npattern O Q R S/old_string old_string と new_string 中では通常の変数置換が行われます。た だし、ドル記号 (‘$’) の展開を抑制するためには、通常のドル記号 の前置ではなく、バックスラッシュでエスケープします。 old_string=new_string T U ディレクティブ、条件式、FOR ループ |
make では、C 言語を彷彿させるディレクティブ、条件文、ループを使用すること ができます。これらの制御構造は、行頭に単一のドット (‘.’) がくることで識別 されます。以下のディレクティブがサポートされています: |
.include <file>
.include "file" .undef variable .error message .warning message 条件文は Makefile のどの部分を処理するのかを判定するために使用します。 C プリプロセッサがサポートする条件文と同様に使用されます。以下の条件文がサ ポートされています: .if [ .ifdef [ .ifndef [ .ifmake [ .ifnmake [ .else .elif [ .elifdef [ .elifndef [ .elifmake [ .elifnmake [ .endif オペレータ operator は、以下のうちのいずれかです。 || && C 言語と同様、 make は条件式を、式の値を決定するのに必要なところまでしか 評価しません。評価順序を変更するには括弧を使います。論理オペレータ ‘!’ は 条件式全体の値を反転するのに使用します。これは ‘&&’ より優先順位が上で す。 式 expression は、以下のいずれかの形式です: defined make empty exists 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 expression は評価されたあとに単語に分解され、それぞれを variable に代入し ながら、 make-rules 部分を繰り返し展開します。 コメント |
コメントはハッシュ記号 (‘#’) から始まり、シェルコマンド行以外のどこにでも 置くことができます。コメントは改行で終わります。 |
特殊ソース
.IGNORE
本ターゲットに関連したコマンドでのエラーを無視します。シェル コマンドの先頭にダッシュ ‘−’ を指定したのと等価です。 .MAKE .NOTMAIN .OPTIONAL .PRECIOUS .SILENT .USE .WAIT 特殊ターゲット |
特殊ターゲットは、他のターゲットとともに使用してはいけません。すなわち、 依存関係記述行の唯一のターゲットとして指定する必要があります。 |
.BEGIN
本ターゲットに指定されたシェルコマンドは他の処理に先立って実 行されます。 .DEFAULT .END .IGNORE .INCLUDES .INTERRUPT .LIBS .MAIN .MAKEFLAGS .MFLAGS .NOTPARALLEL .NO_PARALLEL .ORDER .PATH .PATHsuffix .PHONY .PRECIOUS .SILENT .SUFFIXES 互換性 |
make の古いバージョンは MAKEFLAGS の代わりに MAKE を使っていました。この 機能は POSIX への互換性のために削除されました。内部変数 MAKE は .MAKE と 同じ値が代入されます ; この機能は将来削除されるかもしれません。 ここに書かれている以上の make の奥義のほとんどは、より多くの互換性を保つ ために使用を避けるべきです。 |
環境変数
make ユーティリティは、存在する場合、次の環境変数の値を用います: MACHINE, MAKE, MAKEFLAGS, MAKEOBJDIR, MAKEOBJDIRPREFIX |
関連ファイル
.depend
依存関係リスト 使用例 |
インクルードされた 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 のような断片は動きません。 |
関連項目
PMake - A Tutorial. /usr/share/doc/psd/12.make にあります。
歴史
make は PWB UNIX ではじめて現れました。 FreeBSD 10.0 August 4, 2004 FreeBSD 10.0 |