MAKEDEPEND(1) — UNIX Programmer’s Manual
名称
makedepend − makefile 内で従属物を作成する
形式
makedepend [ −Dname=def ] [ −Dname ] [ −Iincludedir ] [ −fmakefile ] [ −oobjsuffix ] [ −sstring ] [ −wwidth ] [ − − otheroptions − − ] sourcefile ...
解説
makedepend は、各 sourcefile を順番に読み取り、それを C プリプロセッサのようにパーズし、どの #include 指示語をコンパイル時に使用するかを正しく伝えられるように、すべての #include 、 #define 、 #undef 、 #ifdef 、 #ifndef 、 #endif 、 #if および #else 指示語を処理します。 あらゆる #include 指示語は、他の #include 指示語をもったファイルを参照でき、それらのファイル内でもパーズを 行います。
直接あるいは間接的に sourcefile に含まれるすべてのファイルは、 makedepend が "従属物" と呼ぶものです。 これらの従属物は、次に従属物が変更されたときに、 make(1) がどのオブジェクトファイルを再コンパイルしなければならないかを 知ることができるようなやり方で makefile に書き込まれます。
デフォルトによって、 makedepend は出力を、 makefile と命名されたファイルが存在する場合はその中に置き、また、存在しない場合は Makefile 内に置きます。 -f オプションを使用して別の makefile を指定することもできます。 makedepend はまず次の行に対する makefile を検索します。 # DO NOT DELETE THIS LINE -- make depend はそれに依存します。 あるいは、従属物の出力に対する区切り文字として、 -s オプションを備えた行を検索します。 それが見つかった場合は、それ以降 makefile の終わりまでをすべて削除し その行の後に出力を行います。 それが見つからなかった場合は、プログラムは文字列を makefile の終わりに 付加し、出力をその後に行います。 コマンド行上に現れる各 sourcefile に対し、 makedepend は、下記の形式の makefile 内に行を置きます。 sourcefile.o: dfile ... ここで "sourcefile.o" は、サフィックス ".o" に置き換えられた コマンド行からの名前で、"dfile" は、 sourcefile またはそれに含まれているファイルの1つをパーズしているときに #include 指示語内で発見された従属物です。
例
通常、 makedepend は、"make depend" と入力することにより、makefile の従属物を最新のものにすることができるように makefile ターゲット内で使用されます。 たとえば、
SRCS = file1.c file2.c ...
CFLAGS = -O -DHACK -I../foobar -xyz
depend:
makedepend -- $(CFLAGS) -- $(SRCS)
オプション
makedepend は、 cc(1) に対するものと同じ引数を使用できるよう、それが理解しないオプションは すべて無視します。
−Dname=def or −Dname
定義します。 これは、 makedepend のシンボルテーブル内に name に対する定義を置きます。 =def がないと、シンボルは "1" と定義されます。
−Iincludedir
インクルードディレクトリ。 このオプションは、 makedepend に、それが #include 指示語を見つけた場合に検索すべきディレクトリのリストに includedir をプリペンドするように伝えます。 デフォルトで、 makedepend は、/usr/include を検索するだけです。
−fmakefile
ファイル名。 これにより、 makedepend がその出力を置くことのできる別の makefile を指定することができます。
−oobjsuffix
オブジェクトファイルのサフィックス。 システムの中には、サフィックスが ".o" 以外の何かである オブジェクトファイルをもっているものもあります。 このオプションで、 -o.b の ".b" や、 -o:obj の ":obj" などのような別のサフィックスを指定することができます。
−sstring
開始の文字列デリミッタ。 このオプションで、 makedepend が makefile 内で捜すための別の文字列を指定することができます。
−wwidth
行の幅。 通常、 makedepend は、それが書き込むあらゆる出力行が、読みやすさのために 78 文字より 長くならないことを確かめます。 このオプションで、その長さを変更することができます。
− − options − −
makedepend が引数のリスト内で2重ハイフン (− −) に出会った場合は、 それに続くあらゆる認識されていない引数はメッセージなしに無視されます。 次の2重ハイフンに出会った場合、この特別処置は終了します。 このようにして、 makedepend は CFLAGS make マクロ (上記の 例 を参照) 内で見つかる難解なコンパイラ引数を安全に無視することができます。 makedepend が認識している、かつ2重ハイフンと2重ハイフンの間に現れるあらゆる オプションは、通常どおりに処理されます。
アルゴリズム
本プログラムで使用されているアプローチ法で、今までのいかなる "従属物 ジェネレータ" よりも速い順序でプログラムを実行することができます。 この性能の主となるのは、次の2つの仮定です。 1つは、単一の makefile によってコンパイルされるあらゆるファイルは、 ほぼ同じ -I および -D オプションでコンパイルされます。 もう1つは、単一のディレクトリ内の大半のファイルには、ほぼ同じファイルが 含まれます。
上記の仮定が与えられた場合、 makedepend は各 makefile に対し一度だけ呼び出されることが予想され、 makefile が保持しているあらゆるソースファイルは、コマンド行に現れます。 makedepend は、各ソースおよびインクルードファイルを正確に1度でパーズし、 それぞれの内部シンボルテーブルを維持します。 よって、コマンド行上の最初のファイルは、通常の C プリプロセッサが 要する時間に比例した時間を要します。 ただし、それ以降のファイルでは、makedepend がすでにパーズされている インクルードファイルに出会った場合は、再度そのファイルをパーズ することはしません。
たとえば、 file1.c および file2.c という2つのファイルをコンパイルする場合を想定します。 それらにはそれぞれヘッダファイルの header.h が含まれ、ファイル header.h には順番にファイル def1.h と def2.h が含まれます。 次のコマンドを実行する場合、 makedepend file1.c file2.c makedepend は、 file1.c をパーズし、次に header.h 、そして次に def1.h と def2.h をパーズします。 makedepend はそれからそのファイルに対する従属物は以下のとおりであると 決定します。 file1.o: header.h def1.h def2.h ただし、プログラムが file2.c をパーズして、そのファイルにも header.h が含まれていることを発見した場合は、ファイルをパーズしないで、 file2.o に対する従属物のリストに header.h、 def1.h および def2.h を単に付加します。
関連事項
バグ
cpp (Berkeley Unix の C プリプロセッサ) の ソースをもっていない場合は、すべての #if 指示語が実際の値に関係なく "真" と評価されるような方法で makedepend はコンパイルされます。 このことは、間違った #include 指示語が評価される原因になることもあります。 makedepend は、 #if 式用に書かれたパーザをもっていなければなりません。
たとえば、 file1.c と file2.c, という2つのファイル(それぞれにはファイル def.h が含まれているとします) をパーズしていると仮定します。 def.h が含むファイルのリストは、 def.h が file1.c に含まれている場合と、 file2.c に含まれている場合とでは実際に異なることがあります。 しかし、いったん makedepend がファイルに対する従属物のリストに到達すると、それは具体的にキャスト されます。
著者
Todd Brunhoff, Tektronix, Inc. and MIT Project Athena
NEWS-OSRelease 3.3