パール木本のPerlテックブログ

世界的プロジェクトに携わるPerlプログラマー「パール木本」のテックブログ。書籍「業務に役立つPerl」,ユーチューバー, 木本システム代表取締役社長。

簡易的なC言語/C++ソースファイルの依存関係解決アルゴリズムについて考えている

簡易的なC言語ソースファイルの依存関係解決アルゴリズムについて考えている。

コンパイルを毎回繰り返すのは、コンパイルを待つ時間が辛い。そこで、依存関係があるものだけを、コンパイルするというのがMakefileに書くことだ。

C言語のソースファイルとオブジェクトファイルの対応はシンプルだ。

foo.o が foo.c に対応するだけだ。

これは簡単だ。

ただ、複雑なのは、ヘッダである。

ヘッダは、どこで読み込まれているかがわからない。

ソースコードの中身を解析しないと、ヘッダの依存関係がわからない。

gcc は「-MM」オプションや「-M」オプションで、この情報をくれるが、これは、つまり、gccに依存するということだ。

ソースコードは、C言語だったり、C++だったり、cudaであったりするだろう。

一般的な、依存解決に使えない。

簡易的で、良いお作法で、多くのソースコード配置で想定され、自動化できる、依存解決方法はないだろうか?

考えたのは、以下の方法。

まずヘッダーファイルとソースファイルのディレクトリを分ける


include
src

これで、includeの中に入っているファイルは、ヘッダファイルだと区別する。

次に、includeディレクトリの中を再帰的に、ファイル名を調べる。最終更新時刻を取得する。

そして、拡張子をすべて取り除く。これは「.h」と「.hpp」の区別をなくすためだ。

そして、srcディレクトリの中も再帰的に走査して、拡張子を取り除く。これは、拡張子を取り除いたヘッダファイルと名前を比較するためだ。

一般的な慣習に従えば、ヘッダファイル名とソースコード名は、一致する。ただし、共通に利用するヘッダなどは、一致しないだろう。

そこで、多くの場合においては、ヘッダファイル名とソースコード名は、一致すると想定し、少ない場合には、ヘッダファイル名とソースコード名は、一致しないと想定する。

一致した場合は、そこに依存関係ありとみなす。

一致しなかった場合は、それは、おそらく共通で利用されるヘッダだとみなして、すべてのソースコードに対して、依存関係ありとみなす。

依存関係があった場合で、生成元のファイルの更新時刻が、生成先のファイル更新時刻よりも、新しかった場合に、そのソースファイルをコンパイルする。

このようなアルゴリズムを考えている。とても論理的でしょ(笑)。