名 前
makedepend − Makefile に お け る 依 存 関 係 を 生 成 す る
書 式
makedepend [ −Dname=def ] [ −Dname ] [ −Iincludedir ] [ −Yincludedir ] [ −a ] [ −fmakefile ] [ −oobjsuffix ] [ −pobjprefix ] [ −sstring ] [ −wwidth ] [ −v ] [ −m ] [ −− otheroptions −− ] sourcefile ...
説 明
makedepend プ ロ グ ラ ム は sourcefile の そ れ ぞ れ を 順 に 読 み 込 み 、 C の プ リ プ ロ セ ッ サ と 同 様 に 解 析 す る 。 こ の 際 に は 、 #include デ ィ レ ク テ ィ ブ が コ ン パ イ ル 時 に ど の よ う に 使 わ れ る か を 正 し く 知 る た め 、 #include, #define, #undef, #ifdef, #ifndef, #endif, #if, #elif #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 の 末 尾 ま で は 全 て 削 除 さ れ 、 こ こ か ら makedepend の 出 力 が 行 わ れ る 。 見 つ か ら な か っ た 場 合 に は 、 プ ロ グ ラ ム は make フ ァ イ ル の 末 尾 に こ の 文 字 列 が 追 加 さ れ 、 出 力 は そ れ 以 降 に 行 わ れ る 。 コ マ ン ド 行 で 指 定 さ れ た sourcefile の そ れ ぞ れ に 対 し 、 makedepend は
sourcefile.o: dfile .. の 形 式 の 行 を makefile に 書 き 込 む 。 こ こ で 、 sourcefile.o は コ マ ン ド 行 で 与 え ら れ た 名 前 の サ フ ィ ッ ク ス を ’’.o’’ に 置 き 換 え た も の で あ り 、 dfile は sourcefile を 解 析 し て い る 時 に #include デ ィ レ ク テ ィ ブ 内 で 発 見 さ れ た 依 存 関 係 、 つ ま り そ の フ ァ イ ル が イ ン ク ル ー ド し て い る フ ァ イ ル で あ る 。
例
’’make
depend’’ と 打 ち 込
め ば makefile の 依 存
関 係 を 最 新 の
状 態 に で き る
よ う に す る た
め 、 通 常 は
makedepend は makefile 中 の
タ ー ゲ ッ ト と
し て 使 わ れ る
。 こ の 例 を 示
す :
SRCS = file1.c file2.c ...
CFLAGS = −O −DHACK −I../foobar −xyz
depend:
makedepend −− $(CFLAGS) −−
$(SRCS)
オ プ シ ョ ン
ユ ー ザ が cc(1) と 同 じ オ プ シ ョ ン を 使 え る よ う に す る た め 、 こ の プ ロ グ ラ ム は 処 理 で き な い オ プ シ ョ ン は 全 て 無 視 す る 。
−Dname=def
ま た は −Dname
定 義 を 行 う 。
こ の オ プ シ ョ
ン を 指 定 す る
と makedepend の シ ン
ボ ル テ ー ブ ル
内 に name に 対 す
る 定 義 が 作 ら
れ る 。 =def を 指
定 し な か っ た
場 合 に は 、 シ
ン ボ ル は
’’1’’ と 定 義
さ れ る 。
−Iincludedir イ ン ク
ル ー ド デ ィ レ
ク ト リ を 指 定
。 こ の オ プ シ
ョ ン を 指 定 す
る と 、 makedepend は
#include デ ィ レ ク テ
ィ ブ を 処 理 す
る と き に 検 索
す る デ ィ レ ク
ト リ の リ ス ト
を includedir の 最 後
に 追 加 す る 。
デ フ ォ ル ト で
は makedepend は 標 準
の イ ン ク ル ー
ド デ ィ レ ク ト
リ (普 通 は /usr/include だ
が 、 コ ン パ イ
ラ 固 有 の デ ィ
レ ク ト リ も 含
ま れ る こ と が
あ る )だ け を 検
索 す る 。
−Yincludedir 全 て の
標 準 イ ン ク ル
ー ド デ ィ レ ク
ト リ を 、 指 定
し た 1つ の イ ン
ク ル ー ド デ ィ
レ ク ト リ に 置
き 換 え る 。 単
に 標 準 の イ ン
ク ル ー ド デ ィ
レ ク ト リ の 検
索 を さ せ た く
な い 場 合 に は
、 includedir を 省 略
す る こ と が で
き る 。
−a 依 存 関 係 部 分 の 置 き 換 え は 行 わ な い で 、 フ ァ イ ル の 末 尾 に 追 加 す る よ う に す る 。 |
−fmakefile
フ ァ イ ル 名 を
指 定 す る 。 こ
の オ プ シ ョ ン
に よ り 、 makedepend
の 出 力 先 に 別
の makefile を 指 定 す
る こ と が で き
る 。 ’’−’’
を フ ァ イ ル 名
に 指 定 す る こ
と (つ ま り
−f−)に よ り 、
既 存 の フ ァ イ
ル を 修 正 す る
の で は な く 、
標 準 出 力 に 出
力 を 行 う こ と
が で き る 。
−oobjsuffix オ ブ ジ
ェ ク ト フ ァ イ
ル の サ フ ィ ッ
ク ス 。 シ ス テ
ム に よ っ て は
、 オ ブ ジ ェ ク
ト フ ァ イ ル の
サ フ ィ ッ ク ス
が ’’.o’’ で な
い か も し れ な
い 。 こ の オ プ
シ ョ ン を 使 っ
て 別 の サ フ ィ
ッ ク ス を 指 定
す る こ と が で
き る 。 例 え ば
、 −o.b に よ っ
て サ フ ィ ッ ク
ス ’’.b’’ を す
る こ と や 、
−o:obj に よ っ て
’’:obj’’ を 指 定
す る こ と が で
き る 。
−pobjprefix オ ブ ジ
ェ ク ト フ ァ イ
ル の プ レ フ ィ
ッ ク ス を 指 定
す る 。 プ レ フ
ィ ッ ク ス が オ
ブ ジ ェ ク ト フ
ァ イ ル の 名 前
の 最 初 に 追 加
さ れ る 。 こ の
オ プ シ ョ ン は
通 常 、 他 の デ
ィ レ ク ト リ に
あ る オ ブ ジ ェ
ク ト フ ァ イ ル
を 指 定 す る と
き に 使 う 。 デ
フ ォ ル ト で は
プ レ フ ィ ッ ク
ス は 空 文 字 列
で あ る 。
−sstring 区 切 り
文 字 列 を 開 始
す る 。 こ の オ
プ シ ョ ン を 使
う と 、 makedepend が
makefile 内 で 別 の 区
切 り 文 字 列 を
探 す よ う に 指
定 で き る 。
−wwidth 行 の 幅 を
指 定 。 可 読 性
の た め 、 通 常
makedepend は 出 力 す
る 全 て の 行 が
78文 字 を 越 え な
い こ と を 保 証
し て い る 。 こ
の オ プ シ ョ ン
を 使 う と こ の
幅 を 変 え る こ
と が で き る 。
−v 詳 し い 表 示 を 行 う 。 こ の オ プ シ ョ ン を 指 定 す る と 、 |
makedepend は そ れ |
ぞ れ の フ ァ イ ル が イ ン ク ル ー ド し た フ ァ イ ル の リ ス ト を 標 準 出 力 に 出 力 す る 。
−m 複 数 回 の イ ン ク ル ー ド に 対 し て 警 告 表 示 を 行 う 。 こ の オ プ シ ョ ン を 指 定 す る と 、 あ る フ ァ イ ル が 他 の フ ァ イ ル を 複 数 回 イ ン ク ル ー ド し た 際 に は |
makedepend が
警 告 を 出 す 。
以 前 の バ ー ジ
ョ ン の makedepend で
は こ れ は デ フ
ォ ル ト の 動 作
で あ っ た 。 複
数 回 の イ ン ク
ル ー ド を エ ラ
ー と み な さ な
い よ う な C コ ン
パ イ ラ の 動 作
に も う ま く 適
合 で き る よ う
に 、 こ の デ フ
ォ ル ト 動 作 は
変 更 さ れ た 。
こ の オ プ シ ョ
ン は 以 前 と の
互 換 性 の た め
に 残 さ れ て お
り 、 複 数 回 の
イ ン ク ル ー ド
に 関 連 す る 問
題 の デ バ ッ グ
に 利 用 で き る
。
−− options −−
引 き 数 リ ス ト
内 に "−−" が
あ る 場 合 、 そ
の 後 に 続 く
makedepend が 認 識 で
き な い 引 き 数
は 無 視 さ れ る
(関 連 す る メ ッ
セ ー ジ も 表 示
さ れ な い )。 こ
の 特 別 な 扱 い
は 、 再 び
"−−" が 現 れ
る ま で 続 く 。
こ の よ う に し
て makedepend は 、 通
常 は make の マ ク
ロ の CFLAGS に 現 れ る
よ う な 難 解 な
コ ン パ イ ラ の
引 き 数 を う ま
く 回 避 す る こ
と が で き る (前
述 の 例 の セ ク
シ ョ ン を 参 照
)。 "−−" に 挟
ま れ て い て も
、 makedepend が 認 識
す る こ と が で
き る オ プ シ ョ
ン は 全 て 通 常
通 り 扱 わ れ る
。
ア ル ゴ リ ズ ム
こ の プ ロ グ ラ ム で 使 わ れ て い る 方 法 は 、 筆 者 が 知 っ て い る ど ん な 「 依 存 関 係 生 成 プ ロ グ ラ ム 」 よ り も 圧 倒 的 に 速 い 動 作 を 可 能 に し て い る 。 こ の 高 性 能 の ポ イ ン ト は 2つ の 仮 定 を 置 く こ と で あ る 。 第 一 点 は 、 同 じ makefile で コ ン パ イ ル さ れ る 全 て の フ ァ イ ル の ほ と ん ど に 対 し て は 、 同 じ −I オ プ シ ョ ン と −D オ プ シ ョ ン が 使 わ れ る こ と で あ る 。 第 二 点 は 同 じ デ ィ レ ク ト リ に あ る ほ と ん ど の フ ァ イ ル は 、 だ い た い 同 じ フ ァ イ ル を イ ン ク ル ー ド す る こ と で あ る 。 こ れ ら の 仮 定 を 与 え る と 、 makedepend が そ れ ぞ れ の makefile に 対 し て 1度 だ け 呼 ば れ 、 同 時 に こ の makefile が 管 理 す る 全 て の ソ ー ス フ ァ イ ル は makedepend を 呼 び 出 す 際 の コ マ ン ド 行 に 現 れ る こ と を 期 待 で き る 。 makedepend は ソ ー ス フ ァ イ ル と イ ン ク ル ー ド フ ァ イ ル を そ れ ぞ れ 1度 だ け 解 析 し 、 ソ ー ス フ ァ イ ル と イ ン ク ル ー ド フ ァ イ ル に 対 す る 内 部 シ ン ボ ル テ ー ブ ル を 1つ 管 理 す る 。 こ う す る と 、 コ マ ン ド 行 で の 最 初 の フ ァ イ ル の 解 析 に は 、 通 常 の C の プ リ プ ロ セ ッ サ の 処 理 時 間 に 比 例 す る 時 間 が か か る 。 し か し 、 そ れ 以 降 の フ ァ イ ル に つ い て は 、 一 度 解 析 し た イ ン ク ル ー ド フ ァ イ ル が 再 び 解 析 さ れ る こ と は な い 。 例 え ば 、 file1.c と file2.c, の 2つ の フ ァ イ ル を コ ン パ イ ル す る こ と を 考 え る 。 こ の 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 で あ る こ と を 決 定 す る 。 し か し 、 makedepend が file2.c を 解 析 し 、 こ の フ ァ イ ル も header.h を イ ン ク ル ー ド す る こ と を 発 見 し た と き に は 、 こ の フ ァ イ ル の 解 析 は 行 わ れ な い 。 こ の 場 合 は 、 file2.o の 依 存 関 係 の リ ス ト に 対 し て header.h, def1.h, def2.h が 単 純 に 追 加 さ れ る 。
関 連 項 目
バ グ
makedepend は SVR4 の #predicate(token-list) と い う プ リ プ ロ セ ッ サ 式 の 解 析 は 行 う が 、 評 価 は 行 わ な い 。 こ の よ う な 式 は 単 純 に 真 と 仮 定 さ れ る 。 そ の た め 、 正 し く な い #include デ ィ レ ク テ ィ ブ が 評 価 さ れ る こ と が あ る 。
2つ の フ ァ イ ル file1.c と file2.c を 解 析 す る こ と を 考 え る 。 両 方 の フ ァ イ ル と も def.h を イ ン ク ル ー ド す る も の と す る 。 実 際 に は file1.c か ら イ ン ク ル ー ド さ れ た 場 合 と file2.c か ら イ ン ク ル ー ド さ れ た 場 合 で は 、 def.h が イ ン ク ル ー ド す る フ ァ イ ル の リ ス ト は 変 化 す る か も し れ な い 。 し か し 、 makedepend は 一 度 あ る フ ァ イ ル に 対 す る 依 存 関 係 を 見 つ け る と 、 こ れ を 固 定 の も の と し て 扱 う 。
著 者
Todd Brunhoff, Tektronix, Inc. and MIT Project Athena