本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 1 : ユーザーコマンド (A~M) > m

make(1)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

make ― プログラムグループの保守、アップデート、および再生成

構文

make [-f makefile] [-bBdeiknpPqrsStuw] [macro_name = value] [names]

説明

makefile の構造

makefile には、ターゲット行、シェルコマンド行、マクロ定義、およびインクルード行の 4 種類の行を含めることができます。

ターゲット行
ターゲット行は、ターゲットを空白で区切ったヌルでないリスト、 その後のコロン (:) またはダブルコロン (::) 、その後の dependents という前提条件ファイルのリスト (おそらくヌル) で構成されます。 パターンマッチング表記 ( regexp(5) を参照) が、従属条件としてファイル名を生成するためにサポートされます。

シェルコマンド行
ターゲット行のセミコロン (;) の後のテキストとタブから始まる行はすべて、ターゲットをアップデートするために実行するシェルコマンドです ( シェル については以下の「環境」の項を参照)。先頭が タブまたは # から始まらない行は、ターゲット定義、マクロ定義、またはインクルード行になります。 シェルコマンドは、<backslash><new-line> シーケンスを使うと、複数行にわたって続けることができます。

対応するコマンド行があるターゲット行は rules といいます。

マクロ
形式 string1 = string2 の行はマクロ定義です。 マクロは、makefile の任意位置で定義できますが、 通常は先頭にまとめられます。 string1 はマクロ名であり、 string2 はマクロ値です。 string2 は、コメント文字またはエスケープしていない改行までのすべての文字として定義されます。 = のすぐ左右にあるスペースやタブは無視されます。 以降、makefile の (コメントを除く) 任意の位置に現れる $(string1) は、 string2 に置き換えられます。 1 文字マクロ名が使用されており、置換えシーケンスがなければ、 小かっこはオプションです。 オプションの置換えシーケンス $(string1 [: subst1= [subst2]]) を指定でき、これにより、 string1 値の部分文字列の終わりで、重複しないすべての subst1subst2 に置き換えられます。 マクロ値における部分文字列は、空白、タブ、改行文字、および行の先頭で区切られます。 例えば、

  • OBJS = file1.o file2.o file3.o

ならば、

$(OBJS:.o=.c)

file1.c file2.c file3.c 

の評価値になります。 マクロ値は、他のマクロへの参照を含めることができます ( 「警告」を参照)。

  • ONE =1

  • TWELVE = $(ONE)2

$(TWELVE) の値は $(ONE)2 に設定されますが、これがターゲット、コマンド、インクルード行で使用されると、 12 に拡張されます。makefile またはコマンド行において ONE の値が次にさらに別の定義によって変更されると、 $(TWELVE) への参照はすべてこの変更を反映します。

マクロ定義はコマンド行でも指定でき、これは、makefile の定義より優先します。

(XPG4 専用。 コマンド行のマクロは、 MAKEFLAGS 環境変数に追加されます。 コマンド行マクロを使わずに MAKEFLAGS 環境変数内で定義されたマクロは、環境にマクロを追加して同じ名前の既存環境変数を置き換えます。)

make に対して自動的に定義されるマクロもあります (組込みマクロを参照)。 マクロ定義の処理順序の説明については、「環境」の項を参照してください。

マクロに割り当てる値は、条件マクロ定義で変更できます。 条件マクロ定義の形式は target := string1 = string2 です。 ターゲットに対応するターゲット行を処理しているときは、 条件マクロ定義で指定した値が有効です。 string1 を事前に定義していれば、 string1 の新しい値が前の定義と置き換わります。 string1 の新しい値は、 ターゲットまたはターゲットの従属条件のどれかを処理しているときに有効になります。

インクルード行
文字列 include が makefile で行の最初の 7 字として現れ、 その後に単一または複数のスペースまたはタブ文字が続く場合、 残りの行はファイル名であるものと仮定され、 そのファイルのマクロがすべて展開された後でその内容を 別の makefile として make を呼び出すことによって読み込まれ、処理されます。

ターゲットに明示的に対応付けられたコマンドがなく、 .DEFAULT ターゲットが定義されている場合、 make のデフォルトの動作では .DEFAULT 組込みターゲットを使用します。「組込みターゲット」の項を参照してください。

説明

make は、あらかじめ makefile に入れられたコマンドを実行して、単一または複数のターゲット名をアップデートします。 ターゲット名は通常はプログラム名です。 -f オプションを指定しなければ、ファイル名 makefile, Makefile, s.makefile, SCCS/s.makefile, s.Makefile, および SCCS/s.Makefile を、この順序で調べます。 -f - を指定すると、標準入力が使用されます。 複数の -f オプションを指定できます。 makefile 引き数は、指定した順序で処理されます。 -f とファイル名との間にはスペースを入れなければならず、 複数の makefile 名の前には、それぞれ個別に -f オプションを付けなければなりません。 makefile の内容は、組込みの規則やマクロがもしあればそれらに優先します。

コマンド行でターゲット名を指定しなければ、 make は (最初の)makefile における最初のターゲットをアップデートします。 これは推論規則ではありません。 ターゲットは、2 つの場合にアップデートされます。 ターゲットが、ターゲットよりも新しいファイルに従属する場合と、 ターゲットが、更新時刻がターゲットと同一のファイルに従属する場合です。 ファイルを省略すると、最新でないものとみなされます。 ターゲットの従属条件はすべて、必要ならばターゲットをアップデートする前に 再帰的にアップデートされます。 これは、ターゲットの従属ツリーの深さ優先アップデートに影響を与えます。

ターゲットが、ターゲット行 (explicit dependents) 上のセパレータの後で従属条件を指定していない場合、 そのターゲットが最新でなければ、 そのターゲットと対応するシェルコマンドが実行されます。

ターゲット行には、単一または複数のターゲット名と明示的な従属名との間に シングルコロンまたはダブルコロンのいずれかを入れることができます。 同じターゲット名を、複数のターゲット行に入れることもできますが、 その行はすべて同じ (シングルコロンまたはダブルコロン) 型でなければなりません。 通常のシングルコロンの場合には、対応する明示的なコマンドを入れられるターゲット行は 1 つだけです。 ターゲットが、任意行にある従属条件のいずれかに関して最新でない場合、 明示的なコマンドが指定されるとこれが実行され、 指定されなければ、デフォルト規則を実行できます。 ダブルコロンの場合には、明示的なコマンドを ターゲット名の入った複数のターゲット行と対応付けることができます。 ターゲットが、特定行の従属条件のいずれかに関して最新でない場合、 その行のコマンドが実行されます。 組込み規則も実行できます。

ターゲット行およびその対応シェルコマンド行は rules ともいいます。 makefile の任意位置にハッシュマーク (#) があれば rules 内を除いてそこから改行までの部分がコメントになります。 rules 内のコメントは SHELL マクロの設定に依存しています。

以下の makefile は、 pgm が 2 つのファイル、つまり a.ob.o に従属しており、 a.ob.o は対応するソースファイル (a.cb.c) 、および共通ファイル incl.h とに従属していることを示します。

  • OBJS = a.o b.o

  • pgm: $(OBJS)
    cc $(OBJS) -o pgm

  • a.o: incl.h a.c
    cc -c a.c

  • b.o: incl.h b.c
    cc -c b.c

コマンド行はそれぞれ、独自のシェルによって一度に 1 つずつ実行されます。 各コマンド行には、 -, @, + の中から、単一また複数のプリフィックスが付けられます。 これらのプリフィックスについては以下に説明があります。

ゼロ以外のステータスを戻すコマンドは正常に make を終了します。 -i オプション、または makefile に特殊ターゲット .IGNORE がある場合、 エラーメッセージは標準出力にプリントされますが、 make は、コマンド行で何回エラーが発生しても makefile の実行を続けます。 - がコマンド行の先頭にある場合、 その行によって戻されるエラーはすべて標準出力にプリントされますが、 make は終了しません。 プリフィックス - を使用すると、makefile において選択的にエラーを無視することができます。 -k オプションが指定されており、コマンド行がエラーステータスを戻す場合、 現在のターゲットに対する作業は放棄されますが、 そのターゲットに従属しない他の分岐は続行されます。 -k オプションが MAKEFLAGS 環境変数に存在する場合、 -S オプションを指定することによって処理をデフォルトに戻すことができます。

-n オプションは、コマンド行を実行ではなくプリントすることを指定します。 ただし、コマンド行に文字列 $(MAKE) または ${MAKE}, またはプリフィックスとして + がある場合、行はつねに実行されます (「環境」の MAKEFLAGS マクロの説明を参照)。 -t (タッチ) オプションは、どんなコマンドも実行せずにファイルの変更日時をアップデートします。

コマンド行は通常、実行される前にプリントされますが、 行の先頭に@ がある場合には、 プリントを行わないようにします。 -s オプション、または makefile に特殊ターゲット .SILENT がある場合、すべてのコマンド行のプリントを行わないようにします。 @ を使用すると、プリントを選択的にオフにすることができます。 (初期タブを除いて) make によってプリントされた内容はすべて変更なしにシェルに直接渡されます。 したがって、

  • echo a\
    b

は、シェルが行うように

ab

を生成します。

-b オプションにより、以前の makefile( make の旧バージョン用に作成されたもの) がエラーなしで動作します。 旧バージョンの make は、ターゲットに対応付けられた明示的なコマンドがなければ、 ユーザーがコマンドをヌルにしたと見なし、 .DEFAULT 規則を定義した可能性があっても実行しません。現在のバージョンの make はデフォルトではこのモードで動作します。 ただし、現在のバージョンの make には、 -B オプションがあり、ターゲットに対応付けられた明示的なコマンドがなく、 .DEFAULT 規則が定義されている場合に .DEFAULT 規則が実行されるようにします。 -b および -B オプションには、ターゲットの検索、可能な位置、および適切な推論規則の実行への影響はないことに注意してください。 .DEFAULT 以外の組込みの推論規則の検索はつねに行われます。

シグナル SIGINT, SIGQUIT, SIGHUP, および SIGTERM ( signal(5) を参照) により、ターゲットが特殊名 .PRECIOUS に従属しない限り、ターゲットは削除されます。

オプション

以下に、すべてのオプションといくつかの特殊名について簡潔に説明します。 オプションは、任意の順序で指定できます。 オプションは、別々に指定できます。また、 -f オプション以外は 1 つの - でまとめて指定できます。

-b 

以前の (バージョン 7) makefile に対する互換モード。 このオプションはデフォルトではオンにされます。

-B 

以前の (バージョン 7) makefile への互換モードをオフにします。

-d 

デバッグモード。 検査したファイルや時間に関する詳細をプリントアウトします。 これは非常に詳細に表示し、 make コマンド自体をデバッグするためのものです。

-e 

環境変数を makefile 内の割当てより優先します。

-f makefile 

makefile という記述ファイル名。 - のファイル名は標準入力を表します。 makefile の内容は、組込みの規則やマクロが存在する場合、それらに優先します。 -fmakefile の間にはスペースを入れなければならないことに注意してください。 このオプションは複数指定可能であり ( -f - を除いて)、指定した順序で処理されます。

-i 

呼び出したコマンドによって戻されるエラーコードを無視します。 特殊ターゲット名 .IGNORE が makefile に現れる場合にも、このモードに入ります。

-k 

コマンドがゼロ以外のステータスを戻すと、 現在のエントリーに対する作業を放棄しますが、 そのターゲットに従属しない他の分岐を続行します。 これは -S の反対です。 -k-S を同時に指定すると、後に指定した方が使用されます。

-n 

非実行モード。 コマンドをプリントしますが実行しません。 @ から始まる行であってもプリントされます。 ただし、文字列 $(MAKE) または ${MAKE} を含む行、またはコマンドへのプリフィックスとして + のある行は実行されます。

-p 

マクロ定義およびターゲット記述の完全なセットを標準出力に書き出します。

-P 

同時に複数のターゲットを並列にアップデートします。同時にアップデートされるターゲットの数は、環境変数 PARALLEL および makefile 内に .MUTEX 指令があるかどうかによって決まります。

-q 

質問。 make コマンドは、ターゲットファイルが最新状態であるかどうかに応じて ゼロ、またはゼロ以外のステータスコードを戻します。 このオプションでは、ターゲットはアップデートされません。

-r 

サフィックスリストをクリアし、組込みの規則を使用しません。

-s 

無表示モード。 コマンド行は、実行前に標準出力にプリントされません。 特殊ターゲット名 .SILENT が makefile にある場合にも、このモードに入ります。

-S 

ターゲットを最新状態にするコマンドの実行中にエラーが発生すると終了します。 これはデフォルトであり、 -k の反対です。 -k および -S を同時に指定すると、後に指定した方が使用されます。 これにより、 MAKEFLAGS 環境変数における k フラグは無効になります。

-t 

通常のコマンドを発行するのではなく、 ターゲットファイルにタッチします (それらを最新状態にします)。

-u 

すべてのタイムスタンプを無視して、ターゲットに対して無条件に make を行います。

-w 

警告メッセージの表示を行いません。致命的なメッセージには影響しません。

[macro_name=value]
  

ゼロ個以上のコマンド行マクロ定義を指定できます。 「マクロ」の項を参照してください。

[names] 

makefile に現れるゼロ個以上のターゲット名。 このように指定した各ターゲットは make によってアップデートされます。 名前を指定しなければ、 make は、推論規則でない makefile における最初のターゲットをアップデートします。

並列 Make

make は、-P オプションを付けて呼び出されると、同時に複数のターゲットを並列に作成しようとします (これを行うには、複数のプロセスを同時に実行できる標準的な UNIX のシステムプロセス 装置を使用します)。前の項の例に示した makefile の場合、 a.o および b.o を並列に作成するプロセスを生成します。これらのプロセスが完了した後、 pgm を作成します。

make が並列に作成しようとするターゲットの数は、環境変数 PARALLEL によって決まります。 -P が指定され、 PARALLEL が設定されていない場合、 make が並列に作成しようとするターゲットは 2 つ以下になります。

.MUTEX 指令を使用すると、指定したターゲットのアップデートを順番に実行することができます。これは、lex および yacc で実行されるように、アーカイブにモジュールを挿入する場合、または、同じ名前を持つ中間ファイルを作成する場合などの、2 つ以上のターゲットが共通の出力ファイルを変更する場合に便利です。前の節の makefile に次の形式の .MUTEX 指令が含まれている場合、 make は a.o および b.o を並列に作成しないようにします。

.MUTEX: a.o b.o 

環境

環境 ( environ(5)を参照) で定義される変数はすべて make によって読み込まれ、マクロ定義として扱われ、処理されます。 ただし、 SHELL 環境変数はつねに無視されます。 SHELL 環境変数の値は、マクロとして使用されることはなく、makefile 内またはコマンド行に SHELL マクロを定義することによって変更されることはありません。 定義のない変数または空の文字列定義は make に含まれます。

マクロ定義の可能な 4 つのソース、つまり 内部 (デフォルト)、現在の環境、(単一または複数の)makefile、およびコマンド行があり、 この順序で読み込まれます。 処理のこの順序のために、makefile におけるマクロ割当ては環境変数より優先します。 -e オプションにより、環境は makefile におけるマクロ割当てに優先します。 コマンド行マクロ定義はつねにその他すべての定義に優先します。

MAKEFLAGS 環境変数は、コマンド行に対して定義された何らかの正当な入力オプション ( -f, -p, -d を除く) が含まれているという仮定のもとに、 make によって処理されます。 また、 MAKEFLAGS 変数は makefile で指定することもできます。

(XPG4 専用。 makefile 中の MAKEFLAGS は、 MAKEFLAGS 環境変数を置き換えます。コマンド行オプションは MAKEFLAGS 環境変数に優先します。)

MAKEFLAGS がこれらのいずれの位置でも定義されなければ、 make は自分で変数を構成し、 コマンド行で指定したオプションとデフォルトオプションをすべてそこに入れ、 コマンドの呼び出しに渡します。したがって、 MAKEFLAGS には常に現在の入力オプションがあることになります。 これは、再帰的な makes に非常に便利であることがわかります。 -n オプションが指定されていても、文字列 $(MAKE) または ${MAKE} の入ったコマンド行が実行されます。 したがって、ユーザーは、再帰的にソフトウェアシステム全体に make -n を実行して何が実行されているかを調べることができます。これは、 -nMAKEFLAGS に入れられ、 $(MAKE) または ${MAKE} の再帰呼び出しに渡されるために可能になります。 これは、実際にどのコマンドも実行せずにソフトウェアプロジェクトに対してすべての makefile をデバッグする 1 つの方法です。

規則における各コマンドは実行するシェルに与えられます。 使用するシェルはシェルコマンド インタプリタ ( sh(1) を参照) であるか、または SHELL マクロによって makefile で指定したものです。 makefile が実行されるごとに同じシェルを使用するようにするには以下の行

SHELL=/usr/bin/sh

または適当な同等な行を makefile のマクロ定義セクションに入れる必要があります。

拡張子

ターゲットや従属名には、多くの場合拡張子が付いています。 特定の拡張子についての知識は、 make に構築され、ターゲットをアップデートするのに適用される 適切な推論規則の識別に使用されます (「推論規則」の項を参照)。 拡張子の現在のデフォルトリストは以下のとおりです。

  • .o .c .c~ .C .C~ .cxx .cxx~ .cpp .cpp~ .cc .cc~
    .y .y~ .l .l~ .L .L~ .Y .Y~ .s .s~ .sh .sh~
    .h .h~ .H .H~ .p .p~ .f .f~ .r .r~

これらの拡張子は特殊な組込みのターゲット .SUFFIXES の従属条件として定義されます。 これは make によって自動的に行われます。

追加拡張子は、 .SUFFIXES の従属リストとして makefile で指定できます。 これらの追加値はデフォルト値に追加されます。 複数の拡張子リストは累積されます。 拡張子リストの順序には意味があります (「推論規則」の項を参照)。 ユーザーが拡張子の順序を変更したいときは、ヌル従属リストを使ってまず .SUFFIXES を定義しなければなりません。ヌル従属リストは .SUFFIXES の現在値をクリアします。 次に、必要な順序に拡張子を入れて .SUFFIXES を定義しなければなりません。 すべてのマシン上の make に構築される拡張子のリストは、以下の指定によって表示できます。

make -fp - 2>/dev/null </dev/null 

mymakefile という与えられた makefile に定義を組み込んだ組込み拡張子のリストは、 以下の指定によって表示できます。

make -fp mymakefile 2>/dev/null </dev/null 

推論規則

特定のターゲットまたは従属名 ( .o で終わるものなど) には、 .c および .s などの推論できる従属条件があります。 このような名前に対する update コマンドが makefile に現れず、 推論できる従属ファイルが存在する場合、 その従属ファイルは、ターゲットをアップデートするためにコンパイルされます。 この場合、 make には、拡張子を検査し、使用する適切な推論規則を判定することにより、他のファイルからファイルを構築できる推論規則があります。 デフォルト推論規則は現在以下のように定義されています。

シングル拡張子規則 

    .c .c~ 
    .C .C~ .cxx .cxx~ .cpp .cpp~ .cc .cc~ 
    .sh .sh~ 
    .p .p~ 
    .f .f~ 
    .r .r~ 

ダブル拡張子規則 

    .c.o .c~.o .c~.c .c.a .c~.a 
    .C.o .C~.o .C~.C .C.a .C~.a 
    .cxx.o .cxx~.o .cxx~.cxx .cxx.a .cxx~.a 
    .cpp.o .cpp~.o .cpp~.cpp .cpp.a .cpp~.a 
    .cc.o .cc~.o .cc~.cc .cc.a .cc~.a 
    .s.o .s~.o .s~.a 
    .p.o .p~.o .p~.p .p.a .p~.a 
    .f.o .f~.o .f~.f .f.a .f~.a 
    .r.o .r~.o .r~.r .r.a .r~.a 
    .y.o .y~.o .y.c .y~.c 
    .l.o .l~.o .l.c 
    .h~.h  .H~.H .hxx~.hxx .hpp~.hpp 
    .C.o .C~.o .C.a .C~.a 
    .L.C .L.o .L~.C .L~.L .L~.o 
    .Y.C .Y.o .Y~.C .Y~.Y .Y~.o 

ダブル拡張子推論規則 (.c.o) は、 x.c から x.o を構築する方法を定義します。 シングル拡張子推論規則 (.c) は、 x.c. から x を構築する方法を定義します。 実際、最初の拡張子はヌルです。 シングル拡張子規則は、例えばシェルプロシージャや単純な C プログラムなどの 1 つだけのソースファイルからターゲットを構築するのに便利です。

上記の規則におけるティルドは SCCS ファイル ( sccsfile(4) を参照) を参照します。 したがって、規則 .c~.o は SCCS C ソースファイルをオブジェクトファイル (.o) に変換します。 SCCS ファイルの s. がプレフィックスであるため、これには make の拡張子参照との互換性はありません。 したがって、ティルドは、任意のファイル参照を SCCS ファイル参照に変更する方法です。

拡張子 .c の付いたファイルから拡張子 .o の付いたファイルを作成する規則は、ターゲットとして .c.o があり、従属条件のないエントリーとして指定されます。 ターゲットと対応するシェルコマンドは .c ファイルから .o ファイルを作成のための規則を定義します。 スラッシュのないドットから始まるターゲット名はすべて、ターゲット (explicit) 規則ではなく推論 (implicit) 規則として認識されます。 ドットが 1 つあるターゲットはシングル拡張子推論規則です。 ドットが 2 つあるターゲットはダブル拡張子推論規則です。 ユーザーは、makefile でさらに推論規則を定義でき、デフォルトの推論規則の再定義か取消しができます。

.c ファイルを .o ファイルに変更するためのデフォルト推論規則は以下のようになります。

.c.o:
    $(CC) $(CFLAGS) -c $< 

そして、 yacc ファイルを C オブジェクトファイルに変更するためのデフォルト推論規則は以下のようになります。

.y.o:
    $(YACC) $(YFLAGS) $< 
    $(CC) $(CFLAGS) -c y.tab.c 
    rm y.tab.c 
    mv y.tab.o $@

特定のマクロは、生成される任意のコマンドにおいてオプション事項を含めることができるように、デフォルト推論規則で使用されます。例えば、 CFLAGS, LDFLAGS, YFLAGS は、それぞれ cc(1) lex(1) yacc(1) へのコンパイラオプションに使用します。 LDFLAGS は一般にリンカ/ローダオプションを表すのに使用します。 これらのマクロは make によって自動的に定義されますが、 makefile でユーザーが再定義することもできます。

マクロ LIBS は、規約により、コンパイルのリンクフェーズ時に何らかの特殊ライブラリの包含順序を指定するのに使用します。 特定のライブラリセットの特定の包含順序を指定するには、 .c ファイル用の既存のシングル拡張子規則、

$(CC) $(CFLAGS) $< $(LDFLAGS) -o $@ 

は、makefile で LIBS を定義する場合と同様に

$(CC) $(CFLAGS) $< $(LDFLAGS) -o $@ $(LIBS) 

として再定義できます。

また、いくつかの特殊な組込みマクロも推論規則で使用します ((@, <)。 「組込みマクロ」の項を参照してください。

ターゲットに明示的な従属条件がないか、または従属条件にも対応する明示的な規則によって一致するターゲットがない場合、 make は、ターゲット (従属条件) の拡張子 (ヌルの場合もあります) および規則のもう一方の拡張子に一致するファイルの両方に一致する最初の推論規則を検索します。 これが .SUFFIXES 値のリストを前から後ろに通過することによってこの検索を実施するため、 .SUFFIXES の定義された順序は重要です。

任意のマシン上で make にコンパイルされる規則をプリントアウトするには以下のようにタイプしてください。

make -fp - 2>/dev/null </dev/null 

make が推論規則 .c.o を定義するため、 概要説明の項にある例は以下のようにより簡単に書けます。

OBJS = a.o b.o 
    pgm: $(OBJS) 
        cc $(OBJS) -o pgm 
    $(OBJS): incl.h 

ライブラリ

ターゲットまたは従属名に小かっこが含まれる場合、 それはアーカイブライブラリであるものと仮定され、 小かっこ内の文字列はライブラリ内のメンバーを参照します。 したがって、 lib(file.o) および $(LIB)(file.o) は両方とも file.o の入ったアーカイブライブラリを参照します (これは、 LIB マクロが既に定義されているものと仮定します)。 式 $(LIB)(file1.o file2.o) は無効です。 アーカイブライブラリに関連する規則には、 .xx.a という形式があります。 ただし、 xx は、アーカイブメンバーが作成される拡張子です。 現在のインプリメンテーションの使いづらい副作用は、 xx がアーカイブメンバーの拡張子と異なる必要があることです。 したがって、ユーザーは、 lib(file.o) を明示的に 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 rv $@ $*.o 
    rm -f $*.o 

( <, @ , および * シンボルの説明については、「組込みマクロ」に関する項を参照してください。) 実際、上記の .c.a 規則は、 make に構築されるため、この例では不要です。 この規則は、今度は lib の各従属条件に適用されます。 以下の例では、これをさらに効率よく行います。

lib: lib(file1.o) lib(file2.o) lib(file3.o) 
    $(CC) -c $(CFLAGS) $(?:.o=.c) 
    ar rv lib $? 
    rm $? 
    @echo lib is now up-to-date 
.c.a:; 

ここで、マクロにおける置換えを使用します。 $? リストは、その C ソースファイルが最新状態でない ( lib 内の) オブジェクトファイル名のセットとなるように定義されます。 置換えシーケンスは .o.c に変換します (残念ながら、ユーザーは今のところ .c~ に変換することはできません。 ただし、これは将来できるようになる可能性があります)。 また、各オブジェクトファイルを順々に作成、アーカイブする .c.a 規則をディスエーブルすることにも注意してください。 特にこの構文は、アーカイブライブラリの保守をかなりスピードアップしますが、アーカイブライブラリの内容がアセンブリプログラムと C プログラムの混合である場合には、非常に負荷が高くなります。

シンボルの定義を含むアーカイブメンバーは、シンボル名を二重括弧で囲んで、 lib((entry_name)) のように指定します。 それ以外の場合は、上述したように処理されます。

組込みターゲット

make には、いくつかの特殊ターゲットに関する知識があります。 これは、有効にするには makefile で指定しなければなりません ( .SUFFIXES は除きます。これは make によって自動的に設定されますが、ユーザーが変更できます)。

.DEFAULT 

ファイルを作成しなければならないが、それに対して明示的なコマンドも該当する組込み規則もない場合、 .DEFAULT が makefile で定義されていれば、ターゲット名 .DEFAULT と対応するコマンドが使用されます。 .DEFAULT には明示的な従属条件はありません。

.PRECIOUS 

このターゲットの従属条件は QUIT, INTERRUPT, TERMINATE および HANGUP を受信しても削除されません。

.SILENT 

-s オプションと同じ効果があります。 従属条件または明示的なコマンドを指定する必要はありません。

.IGNORE 

-i オプションと同じ効果があります。 従属条件または明示的なコマンドを指定する必要はありません。

.SUFFIXES 

.SUFFIXES の明示的な従属条件は、既知の拡張子の組込みリストに追加され、 推論規則と併用されます。 .SUFFIXES に従属条件がなければ、 既知の拡張子のリストはクリアされます。 .SUFFIXES と対応するコマンドはありません。

.MUTEX 

指定したターゲットのアップデートを順番に実行します (「『並列』 『Make』 」の項を参照してください)。

組込みマクロ

内部保守されたマクロは 5 個あり、 これはターゲットを構築するための規則を作成するのに便利です。 これらのマクロの意味を明確に定義するために、用語 target および dependent に対する説明が必要になります。 make がターゲットをアップデートする際、実際にはアップデートする一連のターゲットを生成することがあります。何らかの規則 (明示的または暗黙のいずれか) が、それをアップデートするターゲットに適用される前に、 ターゲットの各従属条件に対して再帰が行われます。 再帰時に従属条件はターゲット自体になり、 独自の従属条件を保持または生成することがあります。 今度は、従属条件のないターゲットが見つかるまでその従属条件の再帰が行われ、 この時点で再帰が停止します。 make によって処理されたすべてのターゲットが、makefile において明示的なターゲットとして表示されるとは限りません。 makefile からの明示的な従属条件もあれば、 make がターゲットを再帰的にアップデートするにつれて生成される暗黙の従属条件もあります。 例えば、以下の makefile が実行されると、

pgm: a.o b.o 
    cc a.o b.o -o pgm 

以下の一連のターゲットが生成されます。

--- pgm  

2 つの従属条件と、従わなければならない 1 つの明示的な規則があります。

--- a.o  

(再帰的に) 暗黙の規則 .c.o に一致する暗黙の従属条件 a.c があります。

--- a.c  

(再帰的に) 暗黙の従属条件がなく、暗黙の規則もありません。 これにより、再帰は停止し、単にファイル a.c. の最終修正時刻が戻されます。

--- b.o  

(再帰的に) 暗黙の規則 .c.o に一致する暗黙の従属条件 b.c があります。

--- b.c  

(再帰的に) 暗黙の従属条件がなく、暗黙の規則もありません。 これにより、再帰は停止し、単にファイル b.c. の最終修正時刻が戻されます。

以下の定義では、 target という用語が指すものは、makefile で指定されるターゲット、 make が再帰してターゲットになった makefile で指定される明示的な従属条件、 または make が再帰してターゲットになった暗黙の従属条件 (推論規則を検索した結果、およびターゲットの拡張子に一致するファイルとして生成されます) です。 「従属条件」という用語は、特定のターゲットの makefile で指定される明示的な従属条件、 または適切な推論規則を検索した結果、およびターゲットの拡張子に一致する対応するファイルとして生成された暗黙の従属条件を指します。

ターゲット規則を特定のターゲット名のためのユーザー指定の規則とみなし、 推論規則をターゲット名の特定のクラスのためのユーザーまたは make 指定の規則とみなすと有用です。 また、 make の明示的および暗黙の両方の従属条件に対して再帰すると、ターゲット名の値および対応する従属名が変化し、推論規則は、makefile でターゲット規則が定義されていない暗黙の従属条件または明示的な従属条件だけに適用されることに注意してください。

$@ 

$@ マクロは現在のターゲットの完全なターゲット名、 またはライブラリのアーカイブターゲットのアーカイブファイル名の部分です。 これは、ターゲットおよび推論規則の両方に対して評価されます。

$% 

$% マクロは、現在のターゲットが形式 libname(member.o) または libname((entry)) のアーカイブライブラリメンバーであるときに限って評価されます。 この場合、 $@libname の評価値になり、 $%member.o または、シンボル entry を含むオブジェクトファイルの評価値になります。 $% は、ターゲットおよび推論規則の両方に対して評価されます。

$? 

$? マクロは、現在のターゲットに関して最新状態でない従属条件、つまり本質的に再構築されたモジュールのリストです。 これは、ターゲットおよび推論規則の両方に対して評価されますが、通常はターゲット規則でのみ使用します。 $? は、推論規則では 1 つだけの名前の評価値になりますが、 ターゲット規則では複数の名前の評価値になることがあります。

$< 

推論規則では、 $< は、作成対象のターゲットの拡張子に一致する暗黙の規則に対応するソースファイル名の評価値になります。 つまり、これはターゲットに関して最新状態でないファイルです。 .DEFAULT 規則では、 $< マクロは現在のターゲット名の評価値になります。 $< は推論規則に対してのみ評価されます。 したがって、 .c.o 規則では、 $< マクロは .c ファイルの評価値になります。 .c ファイルから最適化された .o ファイルを作成するための例は以下のようになります。

.c.o:
    cc -c -O $*.c 

もしくは、

.c.o:
    cc -c -O $< 

$* 

マクロ $* は、拡張子を削除した現在のターゲット名です。 これは推論規則に対してのみ評価されます。

これら 5 個のマクロは別の形式をとることができます。 大文字 D または F が 5 個のマクロのいずれかに追加されると、意味は、 D の場合は「ディレクトリ部分」に、また F の場合は「ファイル部分」に変更されます。 したがって、 $(@D) は文字列$@ のディレクトリ部分を参照します。 ディレクトリ部分がなければ、 ./ が生成されます。 $? マクロに複数の従属名がある場合、 $(?D) はディレクトリ名部分のリストに展開され、 $(?F) はファイル名部分のリストに展開されます。

上記の組込みマクロのほかに、 その他の多用されるマクロが make によって定義されます。 これらのマクロはデフォルト推論規則で使用され、 -p オプションを使って表示できます。 これらのマクロは、makefile においてターゲット規則で使用できます。 また、makefile で再定義することもできます。

$$@ 

$$@ マクロには、従属行に限って意味があります。 従属条件が実際に処理されるときにマクロが評価されるため、 この形式のマクロは 動的従属 といいます。 $$@ の評価値は、コマンド行に対する $@ とまったく同じもの、 つまり現在のターゲット名になります。 このマクロは、それぞれが 1 つのソースファイルを持つ多数の実行可能ファイルを構築するのに便利です。 例えば、以下の HP-UX コマンドはすべて、同じ規則で構築することができます。

CMDS = cat echo cmp chown 
$(CMDS) : $$@.c 
    $(CC) -O $? -o $@ 

この makefile が make cat echo cmp chown を付けて呼び出されると、 make は、今度は汎用規則を使うため、 $$@cat の評価値になり、 ターゲットが echo のときに echo に対して cat がターゲットになる、というようにして各ターゲットを構築します。

また、動的な従属マクロは F 形式、$$@ のファイル名部分を表す$$(@F) をとることができます。 これは、ターゲットにパス名がある場合に有効です。 以下に例を示します。

INCDIR = /usr/include 
INCLUDES = $(INCDIR)/stdio.h\ 
        $(INCDIR)/pwd.h   \ 
        $(INCDIR)/dir.h   \ 
        $(INCDIR)/a.out.h 
$(INCLUDES) : $$(@F) 
    cp $? $@ 
    chmod 0444 $@ 

特殊マクロ

VPATH マクロを使用すれば、 make によって、コロンで区切られた従属条件のディレクトリのリストを検索できます。 VPATH= path1:path2 ... という形式の行の場合、 make はまず現在のディレクトリで従属条件を探し、 従属条件が見つからなければ path1 を検索し、 VPATH マクロで指定したディレクトリがなくなるまで検索を続けます。

多言語化対応

環境変数

LANG は、多言語対応変数が未設定かヌルの場合のデフォルト値を指定します。 LANG が未設定かヌルであれば、デフォルト値の "C" ( lang(5) を参照) を使用します。多言語対応変数のいずれかの設定が不適当な場合、 make はすべての多言語対応変数が "C" に設定されているものとして動作します。 environ(5) を参照してください。

LC_ALL 空以外の文字列値に設定されていれば、他の多言語対応変数すべての値と置き換わります。

LC_CTYPE テキストをシングルバイトまたはマルチバイトのいずれの文字で解釈するか、 文字を印字可能として分類するか、また 正規表現の文字クラス式と照合する文字を決定します。

LC_MESSAGES 標準エラーに書き込んだ診断メッセージ、および標準出力に書き込んだ情報メッセージの形式と内容に影響するロケールを決定します。

NLSPATH は、 LC_MESSAGES の処理に使用するメッセージカタログの位置を求めます。

PROJECTDIR 現在のディレクトリで見つからなかった SCCS ファイルの検索に使用するディレクトリを示します。以下に示す場合ではすべて、 SCCS ファイルの検索は、指定したディレクトリ内のディレクトリ SCCS で行われます。 PROJECTDIR の値がスラッシュで始まっていれば絶対パス名とみなし、そうでなければその名前のユーザーのホームディレクトリで src または source というサブディレクトリを探します。 このようなディレクトリが見つかれば、それを使用します。見つからなければ、その値を相対パス名として使用します。

PROJECTDIR が未設定またはその値がヌルの場合、現在のディレクトリが最初に検索され、次に現在のディレクトリの SCCS ディレクトリが検索されます。 PROJECTDIR の設定は、 SCCS という名前の構成要素をもつファイルに関するこのユーティリティの以降の説明で記載されているすべてのファイルに適用されます。

サポートされるコードセット

シングル/マルチバイト文字コードセットがサポートされています。

戻り値

make は、正常終了すると 0、 エラーが発生した場合には 0 よりも大きい値を戻します。 -q オプションを指定すると、 make は、ターゲットが最新状態であった場合には 0、 ターゲットが最新状態でなかった場合には 0 よりも大きい値を戻します。

以下の例では、program.c が現在のディレクトリにある場合に、 makefile のない C ソースコード ファイルから実行可能ファイルを作成します。

make program 

以下の例では、複数の makefile の指定といくつかのコマンド行マクロの定義を示し、 module1 で最初のターゲットをアップデートします。

make -f module1 -f module2 RELEASE=1.0 CFLAGS=-g 

以下の例では、カレントディレクトリにあるデフォルト makefile で 2 つのターゲットをアップデートします。

make clobber prog 

以下の例では、指定した makefile で prog ターゲットをアップデートし、 環境変数は makefile にある共通変数に置き換えます。 また、組込みの拡張子リストをクリアし、 組込み規則を無視し、徹底したデバッギング情報を出力します。

make -erd -f module1 prog 

警告

アクセス、変更、および最終修正時刻を make-ing プロセスによって変更できない任意のファイル (インクルードファイルなど) に注意してください。 例えば、プログラムがあるインクルードファイルに従属し、今度はそれが別のインクルードファイルに従属する場合、 また、これらのファイルの一方または両方が最新状態でない場合、 make は、これらのファイルを実行されるごとにアップデートしようとします。 したがって、インクルードファイルに従属する最新のファイルを re-makeing する必要はありません。 この解決法は、 make を実行する前に touch コマンドを使って、このようなファイルを手作業でアップデートしておくことです ( touch(1) を参照)。

不適当にゼロ以外のステータスを戻すコマンドもあります。この問題は、 -i を使用して解決します。

文字 = : @ $ を含むファイル名は使えません。

cd ( cd(1) を参照) などのシェルによって直接実行される内蔵コマンドは、 make では改行をはさむと無効になります。

構文 (lib(file1.o file2.o file3.o) は不正です。

file.o から lib(file.o) を構築することはできません。

マクロ $(a:.o=.c~) は動作しません。

展開したターゲット行には、終わりの改行を含めて 16384 文字以上を入れることはできません。

makefile が現在のディレクトリにない場合、

make filename 

とタイプすると、 make は、 filename.c から filename を構築しようとします。

make がシェルスクリプトで呼び出されたときに、引用符で囲んだ引き数の 評価値が NULL ($\@ など) になると、 make は異常終了します。

制約

NFS 警告

異なる NFS サーバに位置するファイルの修正時刻を比較する際、 サーバ上のクロックが同期化されていなければ、 make は予期しない動作を行います。

ファイル

[Mm]akefile
s.[Mm]akefile
SCCS/s.[Mm]akefile

参照

cc(1), cd(1), lex(1), mkmf(1), sh(1), yacc(1), environ(5), lang(5), regexp(5)

Steve Talbot 著の A Nutshell Handbook, Managing Projects With Make (Second Edition, O'Reilly & Associates, Inc., 1986)

標準準拠

make: SVID2, SVID3, XPG2, XPG3, XPG4, POSIX.2

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.