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 個なければなりません。

make コマンドを通じてコマンドを実行すると、そのコマンドは make の実行環境を使用します。これには、コマンド・ラインから make コマンドまでのマクロと、MAKEFLAGS 変数で指定した環境変数が含まれます。make コマンドの環境変数により、既存の環境内の同じ名前の変数が上書きされます。
注: make コマンドは、include という語で始まっていて、その後に Make ファイルの名前である別の語が続いている行 (例えば、include depend) を検出すると、make コマンドはそのファイルを開き、その内容を、include 行の発生場所に表示されているかのように処理しようとします。この動作は、make コマンドで読み取られる最初の MAKE ファイル内の最初のコメントなし行が .POSIX ターゲットでない場合にのみ発生します。そうでなければ、構文エラーが発生します。

コメント: コメントは、シェル・コマンド・ライン以外の行で、先頭の # 文字から 始まり、行末まで続きます。

環境: 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 が (SIGHUPSIGTERMSIGINT または 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 となります。新しいマクロ定義により、同じ名前の既存のマクロが上書きされます。マクロの割り当ては、次の順序で取り出すことができます。

  1. デフォルトの推論規則
  2. 環境の内容
  3. MAKE ファイル
  4. コマンド・ライン
    注: -e フラグを指定すると、環境変数によって、MAKE ファイル内で定義されている環境変数がオーバーライドされます。
SHELL マクロは特殊マクロです。SHELL は、make コマンドによって shell コマンド・インタープリターのパス名 (/usr/bin/sh) に設定されます。ただし、MAKE ファイル内またはコマンド・ラインで再定義されると、このデフォルト設定がオーバーライドされます。
注: SHELL マクロと SHELL 環境変数は、相互に影響を与えません。

シェル・コマンド

各ターゲットには、通常はターゲットの作成に使用する一連のシェル・コマンドを関連付けることができます。このスクリプト内の各コマンドには、先行タブを付けなければなりません。 ターゲットは従属行に使用できますが、:: 演算子を使用しなければ、これらの従属行の 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 ファイル内で定義した変数
コマンド・ライン コマンド・ラインの一部として定義した変数
ローカル 一定のターゲットに固有のものとして定義した変数。ローカル変数は次のとおりです。
$<
ターゲットを古くした前提条件の完全名 (推論規則)、またはターゲットの完全名 (.DEFAULT 規則) を表します。
$*
ターゲットを古くした前提条件のファイル名 (推論規則内) を表します。接尾部は付いていません。
$@
現行ターゲットの完全ターゲット名、またはライブラリー・アーカイブ・ターゲットのアーカイブ・ファイル名部分を表します。
$%
ターゲットがアーカイブ・ライブラリーのメンバーである場合に、ターゲット規則内のライブラリー・メンバーを表します。

また、D または F を追加してこれらのローカル変数を使用することもできます。

D
ローカル変数が名前のディレクトリー部分に適用されることを示します。これは、 後続 / (スラッシュ) が付いていないパス名接尾部です。 現行ディレクトリーの場合、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 変数では複数のディレクトリーをコロンで区切って指定することができます。例:

VPATH=src:/usr/local/src

この変数は make コマンドに対して、次のディレクトリーを順序どおりに検索するように命令します。

  • 現行ディレクトリー (VPATH が付いていなくても検索されます)
  • src (現行ディレクトリー内のサブディレクトリー)
  • /usr/local/src

フラグ

項目 説明
-DVariable Variable の値を 1 に設定します。
-dOption make が検査するファイルと回数に関する詳細情報を表示します (デバッグ・モード)。オプションを付けないか、または A オプションを付けて -d フラグを指定すると、使用可能なデバッグ情報がすべて表示されます。個別に選択可能なデバッグ・オプションは次のとおりです。
A
考えられるすべてのデバッグ情報が表示されます。
a
アーカイブの検索とキャッシュに関するデバッグ情報が表示されます。
d
ディレクトリーの検索に関するデバッグ情報が表示されます。
g1
他の処理を実行する前に入力グラフに関するデバッグ情報が表示されます。
g2
他の処理を実行した後で、またはエラーが発生して終了する前に、入力グラフに関するデバッグ情報が表示されます。
m
変更日など、ターゲットの作成に関するデバッグ情報が表示されます。
s
接尾部の検索に関するデバッグ情報が表示されます。
v
変数割り当てに関するデバッグ情報が表示されます。
-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 エラーが発生しました。

  1. MAKE ファイル内で検出された最初のターゲットを作成するには、次のように入力します。
    
    make
  2. make コマンドがファイルを作成するために使用するコマンドを実行しないで表示するには、 次のように入力します。
    make  -n search.o
    こうすることによって、新しい記述ファイルを使用する前に、そのファイルが正しいかどうかを検査できます。
  3. pgm が 2 つのファイル (a.ob.o) に従属することと、 これらのファイルが対応する前提条件ファイル (a.cb.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
  4. .c ファイルから、 最適化された .o ファイルを作成するには、次のように入力します。
    .c.o:
              c89 -c -o $*.c
    or:
    .c.o:
              c89 -c -o $<
  5. 組み込み規則の内容を表示するには、次のように入力します。
    make  -p  -f /dev/null 2>/dev/null
  6. 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 コマンドのデフォルトの規則が入っています。