Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ make(1) — NEWS-os 4.1C

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

sh(1)

touch(1)

f77(1)

pc(1)

MAKE(1)  —  NEWS-OS Programmer’s Manual

名称

make − プログラムの保守/更新

形式

/bin/make [ −f makefile ] [ option ] ...  name ... 
/usr/old/bin/make [ −f makefile ] [ option ] ...  name ... 

解説

make は makefile (メイクファイル)内に記述されたコマンドを実行して、 name で指定される一つあるいは複数のターゲットを更新します。 name は一般にプログラム名です。 −f オプションを指定しないと makefile と Makefile をこの順に探します。 makefile が ‘−’ の時は標準入力が用いられます。 −f オプションは複数指定することができます。

/bin/make では、 ターゲットが存在しなかったり、 ターゲットが依存しているファイルの修正時刻が ターゲットの最終修正時刻に等しい または新しい場合にターゲットを更新します。

/usr/old/bin/make では、 ターゲットが存在しなかったり、ターゲットが依存しているファイルが ターゲットの最終修正時刻よりも後に修正されている場合、 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 のようなオプションを指定したりすることにより メイクファイルに階層構造を持たせることができます。

−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

注意事項

ファイル更新時刻が 1 秒単位でしか得る事ができないため、安全の ために /bin/make では同一時刻の場合、更新を行う用に変更されています。 以前と同様に、同一時刻の場合更新して欲しくない場合は /usr/old/bin/make を使用して下さい。

バグ

コマンドの中には、正常に終了してもゼロ以外のステータスを返すものがあります。 このような場合は、 −i オプションを使用してください。
cd(1) の様に直接、シェルに実行されるコマンドは、 make の際、コマンド行が異なると効果がなくなります。
‘VPATH’ は System V の ‘VPATH’ のような動作をしますが、 まったく同じ機能である保証はありません。
make は 1 秒以内の更新時刻の違いをしることはできません。

NEWS-OSRelease 4.1C

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026