makedepend コマンド

目的

MAKE ファイル内で依存関係を作成します

構文

makedepend [ -DName=Def] [ -DName] [ -IIncludeDir ] [ -YIncludeDir ] [ -a ] [ -fMakeFile ] [ -oObjSuffix ] [ -pObjPrefix ] [ -sString ] [ -wWidth ] [ -v] [ -m ] [ Options] SourceFile ...

説明

makedepend コマンドは、各 SourceFile を順番に読み取り、C プリプロセッサーと同様に解析します。 また、ディレクティブ #include、#define、#undef、#ifdef、#ifndef、#endif、#if、#else をすべて処理して、どの #include ディレクティブをコンパイルに使用する必要があるかを判別します。 #include ディレクティブは、他の #include ディレクティブのあるファイルを参照し、これらのファイルも解析できます。

SourceFile 内に直接または間接的に含まれるすべてのファイルは、makedepend から「依存関係」と呼ばれるファイルです。これらの依存関係は、依存関係が変化したときに make コマンドがどのオブジェクト・ファイルを再コンパイルしなければならないかを判別できるように、MAKE ファイルに書き込まれます。

デフォルトでは、makedepend はファイル makefile が存在すると、 このファイルに出力を入れ、それ以外の場合は Makefile に入れます。 -f フラグを使用すると、 代替 MAKE ファイルを指定できます。 makedepend は、使用可能な MAKE ファイル内で、最初に次の行を検索します。


# DO NOT DELETE THIS LINE - make depend depends on it.

または、依存関係の出力の区切り文字として、-s フラグで指定した行を検索します。行が見つかると、MAKE ファイルの終わりまでの後続行をすべて削除し、その行の後に出力を入れます。makedepend で行が見つからなければ、MAKE ファイルの終わりに区切られた文字列を追加し、その文字列の直後に出力を入れます。

コマンド・ラインに SourceFile が現れるたびに、makedepend は MAKE ファイルに次の形式の行を入れます。

SourceFile.o: dfile ...

SourceFile.o はコマンド・ラインからの名前 (接尾部が .o に置換)、dfileSourceFile の解析中、またはインクルードされたファイルの 1 つの解析中に、#include ディレクティブ内で検出された依存関係です。

このコマンドで使用するアルゴリズムでは、単一の MAKE ファイルでコンパイルされるすべてのファイルが、ほぼ同じ -I および -D フラグでコンパイルされること、および単一のディレクトリー内のほとんどのファイルにほぼ同じファイルが含まれることを想定します。

これらの想定に基づいて、makedepend は MAKE ファイルごとに一度ずつ呼び出されるものと予測して、MAKE ファイルで保守されるすべてのソース・ファイルをコマンド・ラインに表示します。また、各ソース・ファイルとインクルード・ファイルを一度だけ解析し、それぞれの内部記号テーブルを保守します。その結果、コマンド・ラインの最初のファイルの処理には、通常の C プリプロセッサーに比例した時間がかかります。後続のファイルの場合は、既に解析済みのインクルード・ファイルが見つかると、再度解析しません。

例えば、2 つのファイル (file1.c file2.c) をコンパイルする場合に、 各ファイルがヘッダー・ファイル header.h をインクルードするものと仮定します。 header.h ファイルは、 ファイル def1.h および def2.h をインクルードします。 次のコマンドを実行すると、

makedepend file1.c file2.c

makedepend は最初に file1.c を解析してから、 header.hdef1.hdef2.h の順に解析します。 次に、この最初のファイルの依存関係を次のように決定します。

file1.o: header.h def1.h def2.h

ただし、プログラムが第 2 のファイル file2.c を解析し、このファイルも header.h をインクルードすることが判明すると、このファイルを解析せず、header.hdef1.hdef2.hfile2.o の依存関係リストに追加するだけです。

注: cpp (バークレー C プリプロセッサー) のソースがない場合、makedepend は、すべての #if ディレクティブがその実際の値に関係なく False に評価されるようにコンパイルします。 これにより、間違った #include ディレクティブが評価されることになります。 このような場合は、#if 式向けに新しい解析プログラムを作成するようにお勧めします。次の例は、新しい解析プログラムの必要性を示しています。

2 つのファイル (file1.cfile2.c) を解析する場合に 各ファイルがファイル def.h をインクルードするものと仮定します。 def.h にインクルードされるファイルのリストは、 def.hfile1.c にインクルードされるときと、 file2.c にインクルードされるときとでは、まったく異なるものになります。 しかし、makedepend がファイルの依存関係のリストに到達すると、 それはしっかり固定されます。

フラグ

注: makedepend コマンドは、認識できないフラグを無視します。 フラグの使用方法は、cc コマンドの場合と同じです。

項目 説明
-DName=Def または -DName Name 変数の定義を makedepend コマンドの記号テーブルに入れます。 =Def 指定子を付けなければ、記号は 1 として定義されます。
-IIncludeDir IncludeDir 変数を、makedepend コマンドが #include ディレクティブを検出したときに検索するディレクトリーのリストの先頭に付加します。 デフォルトでは、makedepend/usr/include ディレクトリーのみを検索します
-YIncludeDir 標準 include ディレクトリーすべてを単一指定 include ディレクトリーに置換します。IncludeDir を省略して、標準 include ディレクトリーを検索しないようにすることができます。
-a 依存関係を置き換える代わりにファイルの終わりに追加します。
-fMakeFile コマンド出力を入れる代替 MAKE ファイルを指定できるようにします。
-oObjSuffix オブジェクト接尾部を指定します。例えば、システムによっては .o 以外の接尾部が付いているオブジェクト・ファイルを使用するものがあります。このフラグを使用すると、-o.b の「.b」、-o.obj の「:obj」など、別の接尾部を指定することができます。
-pObjPrefix オブジェクト・ファイル名にオブジェクト・ファイル接頭部を追加します。このフラグは、オブジェクト・ファイル用に別のディレクトリーを指定するために使用します。デフォルトは空ストリングです。
-sString 先頭の文字列区切り文字を指定します。このフラグを使用すると、別の文字列を指定して makedepend で MAKE ファイル内で検索することができます。
-wWidth 出力行の最大幅を変更します。デフォルトの最大幅は 78 文字です。
-v makedepend に標準入力に関して各入力ファイルで組み込まれたファイルのリストを表示させます。
-m いずれかの入力ファイルに別のファイルが 2 回以上インクルードされている場合に、makedepend に警告メッセージを表示させます。 makedepend の前のバージョンでは、これがデフォルト動作となっていました。 このフラグは、後方の互換性を持たせ、複数のインクルードに関連したデバッグの問題を支援するために提供されています。
Options 二重ハイフンで囲まれた認識されない引数を無視します。 makedepend が引数リスト内で二重ハイフン (—) を検出すると、 その後に続く認識されない引数は無視されます (警告などは出されません)。 2 つ目の二重ハイフンは、この扱いを終了させます。 二重ハイフンにより、makedepend は一般に CFLAGS make コマンド・マクロ (例のセクションを参照) 内で見つかる難解なコンパイラー引数を安全に無視することができます。makedepend が認識するフラグは、二重ハイフンに囲まれた範囲にあっても、すべて正常に処理されます。

一般に makedepend は、「makedepend」と入力すると MAKE ファイルの依存関係が更新されるように、MAKE ファイルのターゲット内で使用します。

SRCS=file1.c file2.c ...
CFLAGS=-O -DHACK -I../foobar -xyz
depend:
      makedepend -- $(CFLAGS) -- $(SRCS)