Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ makedepend(1) — NEWS-os 4.2.1R

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

cc(1)

make(1)

MAKEDEPEND(1)  —  NEWS-OS Programmer’s Manual

名称

makedepend − makefile 内で依存関係を作成する

形式

makedepend [ −Dname=def ] [ −Dname ] [ −Iincludedir ] [ −a ] [ −fmakefile ] [ −oobjsuffix ] [ −pobjprefix ] [ −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 depends on it. あるいは、依存関係の出力に対する区切り文字として、 −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または−Dname
定義します。 これは、 makedepend のシンボルテーブル内に name に対する定義を置きます。 =def がないと、シンボルは "1" と定義されます。

−Iincludedir
インクルードディレクトリ。 このオプションは、 makedepend に、それが #include 指示語を見つけた場合に検索すべきディレクトリのリストに includedir をプリペンドするように伝えます。 デフォルトで、 makedepend は、/usr/include を検索するだけです。

−a 依存関係を、置き換える代わりに、 ファイルの終わりに追加する。

−fmakefile
ファイル名。 これにより、 makedepend がその出力を置くことのできる別の makefile を指定することができます。

−oobjsuffix
オブジェクトファイルのサフィックス。 システムの中には、サフィックスが ".o" 以外の何かである オブジェクトファイルをもっているものもあります。 このオプションで、 −o.b の ".b" や、 −o:obj の ":obj" などのような別のサフィックスを指定することができます。

−pobjprefix
オブジェクトファイルのプリフィックス。 プリフィックスは、オブジェクトファイル名として使用されます。 これは、通常、オブジェクトファイルに異なるディレクトリを指定するのに 使用されます。 デフォルトは、空の文字列です。

−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 を単に付加します。

関連事項

cc(1), make(1)

バグ

cpp (Berkeley の 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 4.2.1R

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026