MAKE(1) — UNIX Programmer’s Manual
名称
make − プログラムの保守/更新
形式
make [ −f makefile ] [ option ] ... name ...
解説
make は makefile (メイクファイル)内に記述されたコマンドを実行して、 name で指定される一つあるいは複数のターゲットを更新します。 name は一般にプログラム名です。 −f オプションを指定しないと makefile と Makefile をこの順に探します。 makefile が ‘−’ の時は標準入力が用いられます。 −f オプションは複数指定することができます。
ターゲットが存在しなかったり、ターゲットが依存しているファイルが ターゲットの最終修正時刻よりも後に修正されている場合、 make はターゲットを更新します。
makefile には依存関係を表す一連のエントリが記述されます。 エントリの最初の行は、「空白で区切られたターゲットのリスト」、 「コロン(:)」、「依存ファイルのリスト」から成ります。 セミコロン(;)に続くテキストと、 エントリ行以降のタブで始まる行は ターゲットを更新するために実行されるシェルコマンドです。 ターゲットが複数の「一つのコロン(:)を含む行」に記述されていると、 ターゲットはこれらの行のすべての「依存ファイル」に 依存していることになりますが、 シェルコマンドは一ヶ所でしか指定できません。 ターゲットが複数の「ダブルコロン(::)を含む行」に記述されていると、 シェルコマンドはそのすべての行で指定できますが、 ターゲットが「依存ファイル」より古い行の シェルコマンドのみが実行されます。 この場合、他のダブルコロンの行の依存ファイルの影響は受けません。
name には 2 つの特殊な形式があります。 a(b) はアーカイブファイル a 内のファイル名 b を表します。 a((b)) はアーカイブファイル a 内の エントリポイント b を表します。
# (シャープ)で始まる行はコメント行になります。
以下に示したメイクファイルでは、 ‘pgm’ が ‘a.o’ と ‘b.o’ の2つのファイルに依存し、 さらにそれらが ‘a.c’ (b.c) ファイルと ‘incl’ という 共通ファイルに依存していることを表わしています。
pgm: a.o b.o
cc a.o b.o −lm −o pgm
a.o: incl a.c
cc −c a.c
b.o: incl b.c
cc −c b.c
次のような形の makefile エントリはマクロ定義です。
string1 = string2
この行以後では $( string1 ) または ${string1} が現われると、それらは string2 に置換されます。 string1 が 1 文字の場合、中かっこ { } または小かっこ ( ) は省略可能です。
make は、 makefile にシェルコマンドが記述されていなくてもファイルの生成規則を推論します。 例えば、‘.c’ ファイルは ‘.o’ ファイルのソースファイルであり、 それがコンパイルされて、‘.o’ ファイルが生成されると推論します。 従って、上の例は以下のように記述することができます。
pgm: a.o b.o
cc a.o b.o −lm −O pgm
a.o b.o: incl
推論規則は ‘.SUFFIXES’ という特殊なエントリ行で記述され、 この行のリストの順に推論されます。 複数のリストは累積されていきます。 空のリストはそれ以前のリストをクリアします。 ファイルと生成規則のうち、最初にその名前が表れたものを 推論に用いるので ‘.SUFFIXES’ のリストの順序は重要です。 デフォルトのリストは次のとおりです。
.SUFFIXES: .out .o .c .e .r .f .y .l .s .p
サフィックス s2 を持つファイルが、サフィックスが s1 のファイルに依存している場合、その生成規則はターゲット名が s1s2 のエントリ行として記述されます。 このようなエントリ行の中では以下の特殊マクロが使用できます。
$∗ サフィックスを削除したターゲット名を表わします。
$@ 完全なターゲット名を表わします。
$< 依存ファイルの完全なリストを表わします。
$? ターゲットより古い依存ファイルのリストを表わします。
例えば、‘.c’ ファイルからオプティマイズした ‘.o’ ファイルを
生成する規則は以下のようになります。
.c.o:; cc −c −O −o $@ $∗.c
マクロの中にはデフォルトの推論規則によって使用されるコンパイラの 引数として伝えられるものがあります。 ‘CFLAGS’、‘FFLAGS’、‘PFLAGS’、‘LFLAGS’、‘YFLAGS’ はそれぞれ、 cc(1)、 f77(1)、 pc(1)、 lex(1)、 yacc(1) のオプションとして使用されます。 また、‘MFLAGS’ マクロには make を呼び出したコマンド行のオプション値が代入されます。 これを用いて、サブディレクトリに対して make を実行したり、 −k のようなオプションを指定したりすることにより メイクファイルに階層構造を持たせることができます。
コロンで区切られたディレクトリリストを設定する、 ‘VPATH’ という特別なマクロがあります。 make は「カレントディレクトリ」、「‘VPATH’ に記述された各ディレクトリ」の順に ファイルの依存関係を検索します。 ファイルを発見すると単なるファイル名ではなく、実際のパスが使用されます。 ‘VPATH’ が定義されていない場合にはカレントディレクトリだけが検索されます。
‘VPATH’ の使用方法として、同じソースから複数のターゲットプログラムを 作成することが考えられます。 この場合、ソースはひとつのディレクトリに保存し、 オブジェクトファイルをメイクファイルと一緒に 個々のサブディレクトリに置くようにします。 この場合、‘VPATH’ マクロはソースファイルが置かれている ディレクトリを指す様にします。
コマンド行は 1 行ごとに 1 つのシェル上で実行されます。 通常、各コマンド行が実行されるときその内容が表示されますが、 特殊ターゲット ‘.SILENT’ が makefile 中にあったり、 コマンド行が ‘@’ で始まっていると表示されません。
コマンドがゼロ以外のステータスを返すと (intro(1) 参照)、 make は終了します。 特殊ターゲット ‘.IGNORE’ が makefile にあるか、コマンド行が <タブ><ハイフン> で始まっているとエラーは無視されます。
ターゲットがディレクトリであったり、 特殊ターゲット ‘.PRECIOUS’ と依存関係にある場合を除いて、 割り込みや終了シグナルを受けるとターゲットは削除されます。
その他のオプションは次のとおりです。
−i 特殊エントリ ‘.IGNORE:’ と等価です。
−k コマンドがゼロ以外のステータスを返すと 現在のエントリに関する処理は放棄しますが、 そのエントリに依存しない他のエントリに関する処理は続行します。
−n コマンドを実行せずに、トレースの結果を出力をします。
−t 何もコマンドを実行せず、ターゲットをタッチ(更新)します。
−r リストなしの特殊エントリ ‘.SUFFIXES:’ と等価です。
−s 特殊エントリ ‘.SILENT:’ と等価です。
ファイル
makefile, Makefile
関連事項
sh(1), touch(1), f77(1), pc(1)
S.I. Feldman Make − A Program for Maintaining Computer Programs
バグ
コマンドの中には、正常に終了してもゼロ以外のステータスを返すものがあります。 このような場合は、 −i オプションを使用してください。
cd(1) の様に直接、シェルに実行されるコマンドは、 make の際、コマンド行が異なると効果がなくなります。
‘VPATH’ は System V の ‘VPATH’ のような動作をしますが、 まったく同じ機能である保証はありません。
NEWS-OSRelease 3.3