MAKE(1V) — NEWS-OS Programmer’s Manual
名称
make −プログラム群の保持、更新、または再生成
形式
/usr/5bin/make [ −f makefile ] [ −p ] [ −i ] [ −k ] [ −s ] [ −r ] [ −n ] [ −b ] [ −e ] [ −u ] [ −t ] [ −d ] [ −q ] [ names ]
解説
make によってプログラマは数々の プログラム群を保持、 更新、再生成することができます。 オプションの内容と特殊名称を、 以下に示します。
−f makefile
記述ファイル名。 makefile を記述ファイルの名称とします。
−p マクロ定義およびターゲットに関する 記述を出力する。
−i コマンドが返した エラーコードを無視する。 擬似 (仮想) ターゲット名 .IGNORE が 記述ファイル内に現われた場合、 この状態になります。
−k プログラムの実行に失敗した場合、 カレントエントリ上の動作を放棄する。 ただし、 そのエントリに 依存しない他のブランチは実行します。
−s サイレントモード。 実行前にコマンド行を出力しない。 擬似ターゲット名 .SILENT が記述ファイル内に現われた場合、 この状態になります。
−r 内蔵のルールを使用しない。
−n 非実行モード。 コマンドを出力しますが、 実行は行いません。@ マークが付いた行だけが出力される。
−b 旧 makefile コマンドとの互換性を保持。
−e 環境変数が makefile 内の割り当てを無効にする。
−u 強制的に更新を行わせる。
−t ターゲットファイルをタッチし (ファイルを更新する)、 通常のコマンドを発行しない。
−d デバッグモード。ファイルの情報と実行された時刻を表示する。
−q 問い合わせ。 make はターゲットファイルが最新かどうかによって、 ゼロまたはゼロ以外のステータス を返す。
.DEFAULT
ファイルを作成する必要があるが、 適当なコマンドや同様の内蔵ルールがない場合、 ターゲット名 .DEFAULT で指定した コマンドが使用されます。
.PRECIOUS
割り込みや終了シグナル が発生しても、 このターゲットに関連するものは取り除かれません。
.SILENT
−s オプションと同様。
.IGNORE
−i オプションと同様。
make は makefile 内のコマンドを実行して、 1 つまたは複数のターゲット name を更新します。 name は通常、 プログラム名が指定されます。 −f オプションを指定しない場合、 makefile、Makefile、 そして Source Code Control System (SCCS) files である s.makefile、s.Makefile を順番に実行しようと試みます。 makefile に − を指定した場合、標準入力が適用されます。 引数 makefile に一つ以上の − (ハイフン) を指定することもできます。
make は対応するものがターゲットよりも 新しく生成されたものであれば、 そのターゲットを更新します ( −u オプションを指定して、 強制的に更新する場合を除く)。 ターゲットに必要なものは全て、 ターゲットのリストに再帰的に加えられます。 ファイルがない場合、 もっとも古いものとされます。
makefile は、依存関係を示す エントリの列です。 エントリの先頭の行は、 空白で区切られた 1 つ以上 のターゲットのリスト、 そして :、 0 個以上のファイル、または、 依存するもののリストです。 この後に続く ; に続く テキストと タブで始まる次行以降の全行は、 ターゲットを更新するために 実行される shell コマンドです。 次のタブまたは # では始まらない空行でない行は、 新たな依存関係、 またはマクロ定義を始めます。 シェルコマンドがバックスラッシュ、 ニューラインをともなって 複数行に続くこともあります。 make によって出力される全てのもの (イニシャルタブを除く) は そのままシェルに渡されます。 以下のようにすると、
echo a\
b
は実際、シェルと同様に
ab
を生成します。
コメントは # (シャープ) で始まり 改行で終わります。
次の makefile は pgm が 2 つのファイル a.o および b.o に依存することを示し、 それぞれがさらに対応する ソースファイル (a.c および b.c) およびコモンファイル incl.h に 従属することを示します。
pgm: a.o b.o
cc a.o b.o −o pgm
a.o: incl.h a.c
cc −c a.c
b.o: incl.h b.c
cc −c b.c
コマンド行のコマンドはシェルによって、 一度に一行ごとに実行されます。 SHELL の環境変数は、 make コマンドがどのシェルを使用するかどうか を決定するために使用されます。 デフォルトは /bin/sh です。 各コマンドの最初の 1 文字、 または 2 文字は −、@、 −@ または @\fP- とすることもできます。 @ を指定すると、 コマンドの出力を禁止されます。 − を指定すると、 make はエラーを無視します。 −s オプションを指定した場合、 またはエントリ =.SILENT: が makefile に ある場合、または最初の文字が @ の場合以外では、 コマンドが実行されれば、出力されます。 −n オプションはコマンド実行にかかわらず、 出力を指定します。 ただし、コマンドに $(MAKE) が含まれる場合、 その行は常に実行されます (環境変数の MAKEFLAGS の記述参照)。 −t オプション (touch) はコマンドの実行とは無関係に そのファイルの変更日付を更新します。
コマンドが 0 以外のステータスを返すと、 make は終了します。 −i オプションを指定、または エントリ .IGNORE: が makefile 内にある場合、 またはコマンドの最初の文字に "−" が含まれる場合、 エラーが無視されます。 −k オプションを指定すると、 カレントのエントリでの 実行はできなくなり、 そのエントリに依存しない 他のブランチについては続行します。
−b オプションを指定すると、 従来の makefile ( make の旧バージョン向け に記述) をエラー無しで実行させることが できます。
インタラプトや Quit の場合 precious で指定した ターゲットを除いて 削除されます。
環境
環境設定は make によって読み込まれます。 全ての変数はマクロ定義とみなされ、 そのまま処理されます。 環境変数はどの makefile よりも前に、 また内部ルールの後に処理されます。makefile 内のマクロ割り当ては、 環境変数を無効にします。 −e オプションを指定すると、 環境設定が makefile 内の マクロ割り当てを無効にさせることもできます。 サフィクスまたは対応する makefile 内のルールは、内蔵のルール内の同様のサフィックス を無効にします。
MAKEFLAGS 環境変数は make によって処理され、 各コマンド行に定義された 入力オプション ( −f および −p を除く) 保持します。 また、 make はその変数が環境設定にないとしても 生成し、 カレントオプションを それに設定し、 コマンド呼び出しに渡すこともできます。 MAKEFLAG は常にカレントの入力オプション を保持しています。 これは、 super-makes にとっても非常に 有効です。 −n オプションを指定すると、 コマンド $(MAKE) は常に実行されます。 make −n を全ての ソフトウェアシステムで 再帰的に実行することで、 何を実行すべきかがわかります。 −n が MAKEFLAGS に渡され、 さらに $(MAKE) に渡されるためです。 実際に何も実行することなく、 あるソフトウェアに対する makefile のデバッグを 行う方法の 1 つです。
インクルードファイル
makefile の最初の 7 文字が include の場合、 またその後に空白またはタブ がある場合、 その行の残りの部分はファイル名とみなされ、 マクロの展開の後に 読み込まれます。
マクロ
string1 = string2 というエントリ はマクロ定義となります。 string2 はコメントまたは エスケープされない改行 までの全ての文字として 定義されます。 $(string1 [: subst1=[ subst2]]) の一部は string2 によって置き換えられます。 1 文字のマクロ名称が 使われ、他に同様のものが なければ、 括弧の指定はオプションです。 オプションの :subst1 = subst2 は置き換え文字列です。 これが指定された場合、 指定マクロ内の subst1 の重複しない全てのものが subst2 に置き換えられます。 文字列 (このタイプの置き換えに使われる) は空白、タブ、 改行文字、または 行の先頭で区切られます。 置き換え文字の使用例をライブラリ に示します。
内部マクロ
ターゲットを構築するための ルールを書くために 有効な 5 つの内部マクロ があります。
$∗ サフィックスを除いたカレント ファイル名です。 これは、推論ルールでのみ、 評価されます。
@ $@ はカレントのターゲットの ターゲット名です。 従属名が明らかな場合にのみ、 評価されます。
$< 推論ルール または .DEFAULT ルールの 場合に評価されます。 これはターゲットが、 古くなった モジュールです。 (例えば、従属ファイル名 manufactured)。.c.o ルールでは、 &< マクロは .c ファイルに対して評価します。 .c ファイル から .o ファイルを 最も効果的に生成するには、
.c.o:
cc −c −O $∗.c
または
.c.o:
cc −c −O $<
とします。
$? makefile からの明示的なルールが 評価される場合、 $? マクロは評価されます。 ターゲットが古くなった 必要なもののリストです。 特に、再構築するようなモジュールの 場合。
$% ターゲットが lib(file.o) の形の アーカイブライブラリのメンバであれば、 $% マクロは評価されます。 その場合、 $@ は libに、$% はライブラリメンバ の file.o に評価されます。
5 つのマクロの内 4 つは、 別表記をすることができます。 大文字 D または F が 4 つのマクロのどれかに付加されると、 その内容は D に関しては directory part、 そして F に関しては “file part” と変更されます。 ディレクトリの部分が無い場合、 ‘./’ が生成されます。 $ ( @D ) は文字列 $@ のディレクトリの一部を 参照します。 この様な形式から外れるのは $? だけです。
サフィックス
ある名称 (例えば、.o で終わるもの) は、.c や .s などの推論時に必要なものです。 そのようなファイルに対しての最新の コマンドが makefile にない場合、 また推論に必要なものが存在する場合、 その必要なもの (prerequisite) はターゲット作成の 為にコンパイルされます。 その場合、 make は他のファイルからファイル を作成できる 推論のルールを持ち、 使用する適切な推論ルールを 決定できます。 カレントのデフォルトの推論ルールは 以下のとおりです。
.c .c~ .f .f~ .sh .sh~
.c.o .c.a .c~.o .c~.c .c~.a
.f.o .f.a .f~.o .f~.f .f~.a
.h~.h .s.o .s~.o .s~.s .s~.a .sh~.sh
.l.o .l.c .l~.o .l~.l .l~.c
.y.o .y.c .y~.o .y~.y .y~.c
make に関する内部ルールは、 make プログラムのソースファイル rules.c に保持されています。 そのルールは一部変更することもできます。 リコンパイルに適切な 形式で、 どのマシンでも使用できる make にコンパイルされたルール を出力するためには、 以下のように指定します。
make −fp − 2> /dev/null < /dev/null
上記のルール内のチルダでは SCCS ファイルを参照します ( sccsfile(4) 参照)。 このように、 ルール “.c~.o” は SCCS C ソースファイルを オブジェクトファイル (.o) に転送します。 SCCS ファイルの "s." がプレフィックなので、 make のサフィックスいう点では 互換性がありません。 チルダはファイルリファレンスを SCCS の ファイルリファレンスに変更する方法の一つです。
一つのサフィックス (“.c:” など) だけのルールの場合、 x.c. からどのように x を構築するかを定義します。 そのためには、 他のサフィックスはナルとなります。 一つだけのソースファイルからターゲットを構築 するのに有効です (シェルの手順、シンプル C プログラム)。
追加のサフィックスは .SUFFIXES に対応する従属のリストとして 与えられます。 順番が重要な要素で、 ファイルおよびルール が存在する最初の name は、 必要なものとして 推論されます。 デフォルトのリストは以下の とおりです。
.SUFFIXES: .o .c .c~ .y .y~ .l . l~ . s . s~ . sh . sh~ .h . h~ .f
また、 内部ルールを出力させるための上記の コマンドは、 カレントのマシン上に用意されたサフィックスの リストを出力します。 マルチサフィックスリストは集積されます。 依存関係を伴わない .SUFFIXES は、 サフィックスリストをクリアします。
推論
最初の例はさらに簡単に実行することができます。
pgm: a.o b.o
cc a.o b.o −o pgm
a.o b.o: incl.h
これは、make が構築するファイルに関する、 内部ルールを持つ為です。 ユーザは makefile に設定するだけで、 ルールをリストに加えることができます。
あるマクロでは、 オプションの要素を結果として、 どのコマンドにもインクルードすること を許すデフォルトの推論によって使用されます。 例えば、 CFLAGS、 LFLAGS、 そして YFLAGS は、それぞれコンパイラオプションの CC(1)、 lex(1)、 そして yacc(1) に対応して 使用されます。 また、カレントのルールをテストするには 前に述べた方法をお薦めします。
必要なものへの推論はコントロール することができます。 サフィックス .c のあるファイル からサフィックス .o のある ファイルを生成するルール は、ターゲットとしての .c.o: を持つ エントリとして 指定され、 従属するものはありません。 ターゲットに関連するシェルコマンドは ある .c ファイルから ある .o ファイルを作成するルール を定義します。 スラッシュを含まず、 ドットで始まるターゲットは ルールとして定義され、 真のターゲットとはなりません。
ライブラリ
ターゲットまたは従属 (dependency) の名称に括弧が含まれる場合、 アーカイブライブラリとみなされ、 括弧内の文字列はライブラリ内のメンバを参照します。 このように、 lib (file.o) および $(LIB) (file.o) は、 file.o を含むアーカイブライブラリを 参照します。 (LIB マクロがすでに定義されているとします。) $ (LIB) (file1.o file2.o) というような表現は 認められません。 アーカイブライブラリに 属するルールは、 アーカイブメンバが作成される サフィックスが XX であるフォーム .XX を持ちます。 カレントの遂行状態からの副産物は、 アーカブメンバのサフィックスと異なる XX を要求します。 このように、 file.o に依存した lib (file.o) を持つことは不可能です。 アーカイブインタフェース の最も一般的な使用を以下に示します。 ここでは、 ソースファイルを全て C タイプのソース として扱います。
lib: lib (file1.o) lib (file2.o) lib (file3.o)
@echo lib is now up-to-date
.c.a:
$(CC) −c $(CFLAGS) $<
$(AR) $(ARFLAGS) $@ $∗.o
rm −f $∗.o
実際に、 上記の .c.a ルールは make に内蔵され、この例では不要となっています。 さらにまた、 アーカイブライブラリ のメンテナンスの構造を以下に示します。
lib: lib(file1.o) lib(file2.o) lib(file3.o)
$(CC) −c $(CFLAGS) $(?:.o=.c)
$(AR) $(ARFLAGS) lib $?
rm $?
@echo lib is now up-to-date
.c.a:;
マクロの拡張機能の代入モードが使用されます。 リストは C のソースファイル が時代遅れになっているオブジェクトファイル 名 (lib の内部) のセットに定義されます。 代入モードでは .o を .c に解釈します。 (残念ながら、まだ .c~ に変更できませんが、 将来には実現致します。) .c.a: ルールの禁止によって、 オブジェクトファイル をひとつずつ生成します。 この特別の構造によって、 アーカイブライブラリのメンテナンス が驚くほどスピードアップ しました。 アーカイブライブラリ がアセンブリプログラムや C プログラムを持っている場合、 このタイプの構造はとてもやっかい なものとなります。
関連ファイル
[Mm]akefile および s.[Mm]akefile
/bin/sh
関連事項
cc(1), lex(1), yacc(1), printf(3S), sccsfile(4). cd(1), sh(1).
注意事項
いくつかのコマンドで間違ってゼロ以外のステータス を返す場合には、 −i オプションを使用して下さい。
バグ
ファイル名に文字 =、:、@ を指定すると、 そのファイルは実行されません。 シェルによって直接実行されるコマンド、 特に cd(1) は make 内のニューラインに対して 何も影響を与えません。 シンタックス (lib (file1.o file2.o file3.o) は認められません。 また、file.o から lib (file.o) を生成することはできません。 マクロの $ (a:.o =.c~) は実行されません。 名前付パイプの使用はあまりお薦めできません。
NEWS-OSRelease 4.2.1R