MAKE(1) — NEWS-OS 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.h という共通ファイルに依存していることを表わしています。
pgm: a.o b.o
cc a.o b.o −lm −o pgm
a.o: incl.h a.c
cc −c a.c
b.o: incl.h 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.h
推論規則の依存ファイルは、 特殊ターゲット名 .SUFFIXES の依存部としてリストされたサフィックスに従ってその順に推論されます。 複数のリストは累積されていきます。 空のリストはそれ以前のリストをクリアします。 ファイルと生成規則の両方が存在する最初の名前が推論に用いられるので、 リストの順序は重要です。 デフォルトのリストは次のとおりです。
.SUFFIXES: .out .o .c .e .r .f .y .l .s .p
サフィックス s2 を持つファイルが、サフィックスが s1 のファイルに依存している場合、その生成規則はターゲット名が s1s2 のエントリ行として記述されます。
エントリ行の中では以下の特殊マクロが使用できます。
$∗ 推論規則において、 対象となるファイル名からサフィックスを削除したものを表わします。
$@ 完全なターゲット名を表わします。
$< 推論規則において、依存ファイル名を表わします。
$? ターゲットより古い依存ファイルのリストを表わします。
例えば、 .c ファイルからオプティマイズした .o ファイルを 生成する規則は以下のようになります。
.c.o:; cc −c −O $∗.c
マクロの中にはデフォルトの推論規則によって使用されるコンパイラの 引数として伝えられるものがあります。 CFLAGS、 FFLAGS、 PFLAGS、 LFLAGS、 YFLAGS はそれぞれ cc(1)、 f77(1)、 pc(1)、 lex(1)、 yacc(1) のオプションとして使用されます。 また、 MFLAGS マクロには make を呼び出したコマンド行のオプション値が代入されます。 これを用いて、サブディレクトリに対して make を実行したり、 −k のようなオプションを指定したりすることにより メイクファイルに階層構造を持たせることができます。
−E オプションが指定されない場合、 make は環境を読み込みます。 すべての変数はマクロ定義とみなされ、同様に処理されます。 内部ルール、 環境変数、メイクファイルの順に処理されます。 よって、メイクファイル内のマクロ代入は環境変数に優先します。 −e オプションを指定すると環境がマクロ代入に優先します。 コマンドラインのマクロ代入は常に環境変数に優先します。
コロンで区切られたディレクトリリストを設定する VPATH という特別なマクロがあります。 make は「カレントディレクトリ」、「 VPATH に記述された各ディレクトリ」の順に ファイルの依存関係を検索します。 ファイルを発見すると単なるファイル名ではなく、実際のパスが使用されます。 VPATH が定義されていない場合にはカレントディレクトリだけが検索されます。
VPATH の使用方法として、同じソースから複数のターゲットプログラムを 作成することが考えられます。 この場合、ソースはひとつのディレクトリに保存し、 オブジェクトファイルをメイクファイルと一緒に 個々のサブディレクトリに置くようにします。 この場合、 VPATH マクロはソースファイルが置かれている ディレクトリを指す様にします。
コマンド行は 1 行ごとに 1 つのシェル上で実行されます。 通常、各コマンド行が実行されるときその内容が表示されますが、 特殊ターゲット .SILENT が makefile 中にあったり、 コマンド行が @ で始まっていると表示されません。
コマンドがゼロ以外のステータスを返すと (intro(1) 参照)、 make は終了します。 特殊ターゲット .IGNORE が makefile にあるか、 コマンド行が <タブ><ハイフン> で始まっているとエラーは無視されます。
ターゲットがディレクトリであったり、 特殊ターゲット .PRECIOUS と依存関係にある場合を除いて、 割り込みや終了シグナルを受けるとターゲットは削除されます。
その他のオプションは次のとおりです。
−d デバッッグモード。変更されたファイルと時間についての詳細を出力します。
−e 環境変数がメイクファイル内のマクロ代入に優先します。
−E 環境の読み込みを禁止します。
−i 特殊エントリ .IGNORE: と等価です。
−k コマンドがゼロ以外のステータスを返すと 現在のエントリに関する処理は放棄しますが、 そのエントリに依存しない他のエントリに関する処理は続行します。
−n コマンドを実行せずに、トレースの結果を出力します。
−p デフォルトのマクロ定義と生成規則を出力します。
−q make コマンドは、目的のファイルが変更中かどうかによって 0 または 0 以外のステータスコードを出力します。
−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 4.2.1R