make コマンド
目的
プログラムのグループを保守、更新、および再生成します。
構文
make [ -DVariable ] [ -d Option ] [ -e ] [ -i ] [ -j[Jobs]] [ -k ] [ -n ] [ -p ] [ -q ] [ -r ] [ -S ] [ -s ] [ -t ] [ -f MakeFile ... ] [ Target ... ]
説明
make コマンドを使用すると、プログラムのセットを保守しやすくなります。make コマンドには、ファイルの依存関係を指定するリストを入力します。
MAKE ファイルには、ファイル従属指定、シェル・コマンド、変数割り当て、コメントという 4 種類の行が入っています。一般に、行の最後に ¥ (円記号) を付けると、行を次行に継続させることができます。後続の改行文字と次行の先頭の空白文字は、シングル・スペースに圧縮されます。
ファイルの従属指定
従属行は 1 つ以上のターゲット、単一の演算子およびゼロ個以上の前提条件 (ソース) で構成されています。ここで作成される関係とは、ターゲットが前提条件に依存し、通常は前提条件から作成されるという関係です。 ターゲットと前提条件との正確な関係は、両者を区切る演算子によって決定されます。演算子は次のとおりです。
項目 | 説明 |
---|---|
: | 変更時刻が前提条件の時刻よりも前であれば、そのターゲットは古いものであると見なされます。 この演算子を使用すると、ターゲットの前提条件は各従属行にまたがって累積されます。ターゲットに .PRECIOUS 属性がなければ、make コマンドが割り込まれると、ターゲットは除去されます。 |
:: | 前提条件を指定しなければ、ターゲットは常に作成し直されます。それ以外の場合、前提条件のいずれかがターゲットよりも最近に変更されていると、ターゲットは古いものであると見なされます。 この演算子を使用すると、ターゲットの前提条件は各従属行にまたがって累積されません。 make コマンドが割り込まれても、ターゲットは除去されません。 |
ファイル従属指定には、推論とターゲットという 2 種類の規則があります。推論規則は、ターゲットの更新方法を指定します。推論規則には、/ (スラッシュ) なしで最低 1 個の . (ピリオド) が 付いているターゲットが 1 つあります。 ターゲット規則は、ターゲットの構築方法を指定します。ターゲット規則は、複数のターゲットを指定できます。
MAKE ファイルの実行
make コマンドは、MAKE ファイル内のコマンドを 1 行ずつ実行します。make は、各コマンドを実行すると、そのコマンドを標準出力に書き出します (-s フラグなどを使用して特に指示しない場合)。MAKE ファイルには、各行のコマンドの前にタブが 1 個なければなりません。
コメント: コメントは、シェル・コマンド・ライン以外の行で、先頭の # 文字から 始まり、行末まで続きます。
環境: MAKEFLAGS 環境変数が存在する場合には、make コマンドはこの環境変数を使用します。
ターゲット規則
ターゲット規則の形式は次のとおりです。
target[target...] : [prerequisite...] [;command]
<Tab>command
特殊ターゲット
特殊ターゲットを他のターゲットに組み込むことはできません。つまり、特殊ターゲットは、唯一のターゲットとして指定しなければなりません。これらのターゲットは、make コマンドの動作を制御します。特殊ターゲットは次のとおりです。
項目 | 説明 |
---|---|
.DEFAULT | このターゲットは、make コマンドでは他の作成方法を示すことができないターゲット (前提条件としてのみ使用されたターゲット) の規則として使用されます。シェル・スクリプトのみが使用されます。.DEFAULT のコマンドを継承するターゲットの < (小なり記号) 変数は、ターゲット自身の名前に設定されます。 |
.IGNORE | このターゲットの前提条件は、ターゲットそのものです。これにより、ターゲットに関するコマンドのエラーは無視されます。前提条件を指定しなければ、これは -i フラグを指定することと同じです。 |
.POSIX | make コマンドは、別のデフォルト規則ファイルを使用します。ファイル /usr/ccs/lib/posix.mk には、POSIX 規則で指定されたデフォルトの規則が入っています。 |
.PRECIOUS | このターゲットの前提条件は、ターゲットそのものです。.PRECIOUS は、ターゲットが除去されないようにします。前提条件を指定しなければ、.PRECIOUS 属性はファイル内のすべてのターゲットに適用されます。一般に、make が (SIGHUP、SIGTERM、SIGINT または SIGQUIT などにより) 割り込まれると、部分的に作成されたターゲットを除去します。-n、-p、-q フラグを指定して make を呼び出すと、ターゲットは .PRECIOUS 属性を持つものと見なされます。 |
.SCCS_GET | この特殊ターゲットは、前提条件なしで指定する必要があります。 この特殊ターゲットが Make ファイルに組み込まれている場合、 現行ディレクトリーにないすべての SCCS ファイルを取得するために、 この特殊ターゲットに関連したコマンドが使用されます。 SCCS からソース・ファイルをリトリーブするために使用されるデフォルトのコマンドは、 この特殊ターゲットに関連したコマンドで置き換えられます。 ソース・ファイルが依存関係リストの中で指定されていると、make は、これらのファイルを、 その他のターゲットと同じように取り扱います。 ターゲットに依存関係はないが、 ディレクトリーの中に入っている場合、make は、ファイルが最新であると想定します。 ただし、ターゲット source_file 用に SCCS/s.source_file という名前の SCCS ファイルがある場合は、 make はさらに検査を行いターゲットが最新であることを確認します。 ターゲットが欠落している場合、あるいは、SCCS ファイルがより新しい場合は、 make は .SCCS_GET 特殊ターゲット用に指定されたコマンドを自動的に実行し、 最新のバージョンをリトリーブします。 ただし、 ターゲットがだれによっても書き込み可能である場合、make が新しいバージョンをリトリーブすることはありません。 |
.SILENT | このターゲットの前提条件は、ターゲットそのものです。これにより、ターゲットに関連するコマンドは、実行前には標準出力に書き出されません。前提条件を指定しなければ、.SILENT 属性はファイル内のすべてのコマンドに適用されます。 |
.SUFFIXES | この名前を使用すると、make で認識されるファイル接尾部のリストにさらに接尾部を追加することができます。このターゲットの前提条件は、既存の接尾部のリストに追加されます。接尾部を指定しなければ、以前に指定した接尾部が削除されます。これらの接尾部は、推論規則に使用されます。接尾部の順序を変更するには、空の .SUFFIXES エントリーを指定してから、.SUFFIXES エントリーの新しいリストを指定する必要があります。MAKE ファイルに .SUFFIXES が付いたコマンドを関連付けることはできません。 |
推論規則
make コマンドには、デフォルトの推論規則のセットがあり、MAKE ファイル内の他の推論規則定義を使用して補足または上書きできます。デフォルトの規則は、外部ファイル /usr/ccs/lib/aix.mk に保管されています。コマンド・ラインから MAKERULES 変数を独自のファイル名に設定すると、独自の規則ファイルを代用できます。次の行は、コマンド・ラインから規則ファイルを変更する方法を示しています。
make MAKERULES=/pathname/filename
推論規則は、ターゲットの接尾部とコマンドで構成されています。make コマンドは、接尾部から前提条件を判別し、接尾部とその前提条件の両方から make コマンドはターゲットを更新する方法を判別します。 推論規則の形式は次のとおりです。
rule:
<Tab>command
...
rule の形式は次のいずれかです。
項目 | 説明 |
---|---|
.s1 | 単一の接尾部のいずれかと共に追加されるターゲットの構築方法を記述する単一の接尾部推論規則。 |
.s1.s2 | 接頭部 .s1 の付いた前提条件と接頭部 .s2 が付いたターゲットの作成方法を規定する二重接尾部推論規則。 |
.s1 および .s2 接尾部は、特殊ターゲット .SUFFIXES の前提条件として定義されます。接尾部 .s1 および .s2 は、推論規則が MAKE ファイルに出現した時点で既知の接尾部でなければなりません。推論規則は、.SUFFIXES で指定された順序で接尾部を使用します。新しい行の始めに <Tab> 文字または # 文字がなければ、新しい推論規則が開始されます。
例えば、rule が空であると仮定します。
rule: ;
上の行を実行しても処理は何もありません。make コマンドは接尾部が存在することを認識しますが、ターゲットが古くなると何の処置も実行しません。
上記の規則の ~ (波形記号) は、SCCS ファイルを指します。したがって、規則 .c~.o は、SCCS C 言語前提条件ファイルをオブジェクト・ファイル (.o) に変形します。SCCS ファイルの s. は接頭部なので、make コマンドによる接尾部の解釈は適用されません。~ (波形記号) は、任意のファイルの参照を SCCS ファイルの参照に変更する方法です。
ライブラリー
アーカイブ・ライブラリーのメンバーもターゲットや前提条件にすることができます。名前に小括弧が含まれている場合、ライブラリー・メンバーと見なされます。例えば、library (name) は、name がアーカイブ・ライブラリー library のメンバーであることを示します。特定のファイルからライブラリーのメンバーを更新するには、形式 .s1.a を使用できます。 接尾辞 .s1 が付いたファイルは、アーカイブ・ライブラリーのメンバーを更新するために使用されます。 .a はアーカイブ・ライブラリーを指します。
マクロの使用法
MAKE ファイル内で、マクロ定義は次の形式で定義されます。
variable=value
マクロは、MAKE ファイル全体で次のように表すことができます。
- マクロがターゲット行に表示されている場合は、そのターゲット行の読み取り時に評価されます。
- マクロがコマンド・ラインに表示されている場合は、そのコマンドの実行時に評価されます。
- マクロがマクロ定義行に表示されている場合は、 規則またはコマンド内で新しいマクロが表示されたときに評価されます。
マクロ定義がなければ、デフォルトで NULL となります。新しいマクロ定義により、同じ名前の既存のマクロが上書きされます。マクロの割り当ては、次の順序で取り出すことができます。
- デフォルトの推論規則
- 環境の内容
- MAKE ファイル
- コマンド・ライン 注: -e フラグを指定すると、環境変数によって、MAKE ファイル内で定義されている環境変数がオーバーライドされます。
シェル・コマンド
各ターゲットには、通常はターゲットの作成に使用する一連のシェル・コマンドを関連付けることができます。このスクリプト内の各コマンドには、先行タブを付けなければなりません。 ターゲットは従属行に使用できますが、:: 演算子を使用しなければ、これらの従属行の 1 つにしか後続の作成スクリプトを使用することができません。
コマンド・ラインの最初の文字または最初の 2 文字が @ (アットマーク)、 - (ハイフン)、+ (正符号) のいずれか、またはすべてであれば、コマンドは次のように特殊処理されます。
項目 | 説明 |
---|---|
@ | コマンドは実行前にエコーされません。 |
- | コマンド・ラインのゼロ以外の終了状況は無視されます。 |
+ | -n、-q、-t が指定されていても、コマンド・ラインが実行されます。 |
メタキャラクターが付いていないコマンドは、make コマンドによって直接実行されます。 例えば、次の例の最初のコマンドには > (「より大」符号) シェル・メタキャラクターが含まれているので、 make コマンドはこのコマンドをシェルに引き渡します。 次の例の第 2 のコマンドにはシェル・メタキャラクターが含まれていないので、make コマンドはこのコマンドを直接実行します。
target: dependency
cat dependency > target
chmod a+x target
シェルをバイパスすると時間を節約できますが、問題が発生することがあります。例えば、SHELL マクロを /bin/csh に設定して MAKE ファイルから C シェル・スクリプトの試みる場合、 コマンド・ラインにも少なくとも 1 つのシェル・メタキャラクターが含まれていなければ機能しません。
SHELL=/bin/csh
target: dependency
my_csh_script
make コマンドは my_csh_script を C シェルに引き渡す代わりに実行しようとするので、この MAKE ファイルは失敗します。
変数割り当て
make コマンド内の変数は、シェル内の変数に似ており、すべて大文字で構成されています。= 演算子は値を変数に代入します。これにより、以前の変数がオーバーライドされます。 割り当てられた値の前の空白文字はすべて除去されます。
macro += word ...
macro += macro1
+= 演算子は、= の代わりに使用された場合、新しい値を追加します。 このとき、変数の前の内容と、追加した値の間にシングル・スペースが挿入されます。
変数は、変数名を { } (中括弧) または ( ) (小括弧) で囲み、 前に $ (ドル記号) を付けて展開します。 変数名に 1 文字しか含まれなければ、 前後の中括弧または小括弧は不要です。この省略形はお勧めできません。
変数の代入は、変数の使用場所に応じて二度発生します。従属行にある変数は、その行の読み取り時に展開されます。シェル・コマンド内の変数は、shell コマンドの実行時に展開されます。
次の 4 つの変数クラス (昇順) があります。
項目 | 説明 |
---|---|
環境 | make コマンドの環境の一部として定義された変数 |
グローバル | MAKE ファイル内または組み込み MAKE ファイル内で定義した変数 |
コマンド・ライン | コマンド・ラインの一部として定義した変数 |
ローカル | 一定のターゲットに固有のものとして定義した変数。ローカル変数は次のとおりです。
また、D または F を追加してこれらのローカル変数を使用することもできます。
また、make コマンドは次の変数を設定または認識します。 |
$ | 単一の $ (ドル記号)。つまり、$$ は単一のドル記号に展開されます。 |
LANG | LC_ALL とそれに対応する環境変数 (LC_ で始まる環境変数) がロケールを指定しないときに、ロケール・カテゴリーに使用されるロケールを決定します。 |
LC_ALL | LANG または他の LC_ 環境変数の設定によって指定されたロケール・カテゴリーの値をオーバーライドするために使用されるロケールを決定します。 |
LC_CTYPE | 引数内の単一バイト文字とマルチバイト文字など、テキスト・データのバイトのシーケンスを文字として解釈するためのロケールを決定します。 |
LC_MESSAGES | メッセージを書き込む場合の言語を決定します。 |
MAKEFLAGS | 環境変数 MAKEFLAGS には、make のコマンド・ラインで指定できる任意の値を入れることができます。make コマンド・ラインで指定した値は、MAKEFLAGS 変数に追加されてから、make が実行するすべてのプログラム向けの環境に入力されます。MAKEFLAGS 変数内では、-f および -p フラグの動作は未定義なので注意してください。この変数内では、コマンド・ライン・フラグは -f および -p フラグよりも優先されます。 |
VPATH | 前提条件を検索するディレクトリーのリストを指定できます。ディレクトリーのリストは、SHELL 内の PATH 変数と同様に機能します。VPATH 変数では複数のディレクトリーをコロンで区切って指定することができます。例:
この変数は make コマンドに対して、次のディレクトリーを順序どおりに検索するように命令します。
|
フラグ
項目 | 説明 |
---|---|
-DVariable | Variable の値を 1 に設定します。 |
-dOption | make が検査するファイルと回数に関する詳細情報を表示します (デバッグ・モード)。オプションを付けないか、または A オプションを付けて -d フラグを指定すると、使用可能なデバッグ情報がすべて表示されます。個別に選択可能なデバッグ・オプションは次のとおりです。
|
-e | MAKE ファイル内で環境変数によってマクロ割り当てをオーバーライドするように指定します。 |
-fMakeFile | デフォルトの MAKE ファイルの代わりに読み取る MAKE ファイルを指定します。MakeFile が - (ハイフン) であれば、 標準入力が読み取られます。 複数の MAKE ファイルを指定し、指定した順に読み取ることができます。 |
-i | MAKE ファイル内で shell コマンドのゼロ以外の終了を無視します。MAKE ファイル内の各コマンド・ラインの前に - (ハイフン) を指定するのと同じです。 |
-j[Jobs] | 並列ジョブ数を指定します。このジョブ数を使用して、make が独立ターゲッ トを作成する必要があります。Jobs パラメーターでは、いずれの正の整数値も受け入れることができます。 Jobs が無指定の場合、make コマンドは、メイン・ターゲット 作成のために並列ジョブ数を制限しません。 |
-k | エラーが発生したあとも、エラーの原因となったターゲットに従属していないターゲット上でのみ処理を継続します。 |
-n | コマンドを実行せず表示します。しかし、+ (正符号) で始まる行は実行されます。 |
-p | コマンドを実行する前に、マクロ定義とターゲット記述の完全セットを表示します。 |
-q | ターゲット・ファイルが最新である場合、状況コード 0 を戻します。ターゲット・ファイルが最新でない場合、状況コード 1 を戻します。このオプションを指定した場合は、ターゲットは更新されません。 しかし、コマンド・ラインが + (正符号) で始まっていれば、その行は実行されます。 |
-r | デフォルトの規則を使いません。 |
-S | エラーが発生すると make コマンドを終了します。これがデフォルトです。-k フラグとは逆に機能します。 |
-s | コマンドの実行時に、そのコマンドを画面に表示しません。 |
-t | ターゲットを作成するか、またはその変更時刻を更新して最新のものとして表示するようにします。+ (正符号) で始まるコマンド・ラインを実行します。 |
Target | Target 形式のターゲット名を指定するか、変数の値を設定します。 |
終了状況
-q フラグを指定した場合、このコマンドは以下の終了値を返します。
項目 | 説明 |
---|---|
0 | 正常終了。 |
1 | ターゲットが最新のものではありませんでした。 |
>1 | エラーが発生しました。 |
それ以外の場合、このコマンドは以下の終了値を返します。
項目 | 説明 |
---|---|
0 | 正常終了。 |
>1 | エラーが発生しました。 |
例
- MAKE ファイル内で検出された最初のターゲットを作成するには、次のように入力します。
make
- make コマンドがファイルを作成するために使用するコマンドを実行しないで表示するには、
次のように入力します。make -n search.oこうすることによって、新しい記述ファイルを使用する前に、そのファイルが正しいかどうかを検査できます。
- pgm が 2 つのファイル (a.o と b.o)
に従属することと、
これらのファイルが対応する前提条件ファイル (a.c と b.c)
および共通ファイル incl.h に従属することを示す MAKE ファイルを作成するには、
次のように入力します。
pgm: a.o b.o c89 a.o b.o -o pgm a.o: incl.h a.c c89 -c a.c b.o: incl.h b.c c89 -c b.c
- .c ファイルから、
最適化された .o ファイルを作成するには、次のように入力します。
.c.o: c89 -c -o $*.c or: .c.o: c89 -c -o $<
- 組み込み規則の内容を表示するには、次のように入力します。
- makefile で指定したターゲット作成用に使
用する最大 10 の並列ジョブを指定して、並列モードで make コマンド
を使用するには、次のように入力します。
make -j10
ファイル
項目 | 説明 |
---|---|
makefile | 依存関係のリストが入っています。 |
Makefile | 依存関係のリストが入っています。 |
s.makefile | 依存関係のリストが入っています。 これは SCCS ファイルです。 |
s.Makefile | 依存関係のリストが入っています。 これは SCCS ファイルです。 |
/usr/ccs/lib/posix.mk | make コマンドのデフォルトの POSIX 規則が入っています。 |
/usr/ccs/lib/aix.mk | make コマンドのデフォルトの規則が入っています。 |