Lemmatizer ライブラリのソースコードの解析のために GNU Global を使っている。このツールは,ソースコードの関数や変数がどこで定義されているか,どのファイルで利用されているかを縦横に渡り歩いてブラウズする手段を提供する。grep で必死こいて探すのに比べるとその利便性は天と地ほどの差がある。C, C++, Yacc, Java と PHP4 のプログラミング言語をサポートしている。
Global はコマンドラインのみならず,GNU Emacs,Vim のほか,HTML 変換機能により,ブラウザによってハイパーリンクでソースコード探索できるインタフェースをサポートしている。今日は,FreeBSD で GNU Global 5.7.1 をインストールし,HTML ベースで利用する方法をメモしておく。
FreeBSD には Global の ports が用意されており,導入は簡単である。"cd /usr/ports/devel/global && make install clean" 一発でインストールできる。
ここでは AOT の Source 配下にある .c, .cpp と .h を抽出し,Global で処理する例を説明する。
- まずはソースコードの抽出。もともとの AOT ソースの場所を $RML/Source,Global のデータを作成するディレクトリを ~/src/aot とする。
- gtags コマンドを発行してタグ・データベースを作成する。GPATH, GRTAGS, GSYMS, GTAGS の 4 ファイルが生成される。
- htags コマンドで HTML データを作成する。
- ここでは,検索用の CGI プログラムを http://web-server-host/cgi-bin/global.cgi で,ブラウザからアクセスできるようにしよう。http://web-server-host/ は Web サーバのドキュメントルート URI の例である。実際の URI で読み替える必要がある。同様に,以下のコマンドラインで指定している cgi-bin,HTML 出力のディレクトリについても,運用で決めた場所で読み替えていただきたい。
- 以下の指定オプションは -a: アルファベット・インデックス,-f: 検索フォーム,-n: 行番号表示,-F: フレーム表示,-I: アイコンリンク使用,-s: シンボルにもアンカー付与,-x: XHTML,-T: ファイルリストを <table> タグ付,-t: タイトルである。
- オプションに --suggest を指定すると,初心者用のお勧めとして開発者が設定したオプション・セットが選択される。これも十分満足できるものと思う。ただし,5.7 未満の古いバージョンではサポートされていないようである。
- HTML を生成したら,gtags で作成したタグ・データベースをそのディレクトリ直下にコピーしておく。CGI 検索用である。
- 生成された HTML データは,運用都合で別ディレクトリに移動すると,gtags で作成したデータベースを参照できず検索 CGI が動作しなくなるので注意しよう。もし Web サーバを外部公開している場合は,.htaccess の認証機能などで閲覧制限を設ける,検索エンジンからの収集を抑止するよう robots.txt に Global データ・ディレクトリを登録する,などセキュリティ上の工夫をしておくことをお勧めする(これは割愛)。
% cd $RML/Source % find . -name "*.c" -or -name "*.cpp" -or -name "*.h" > list % tar cf - `cat list` | ( cd ~/src/aot ; tar xvf - )
% cd ~/src/aot % gtags -v
% cd ~/src/aot % su -m # mkdir -p /usr/local/www/apache22/data/aot # htags -afnFIsxT -S /usr/local/www/apache22/cgi-bin \ -t 'AOT Source Tour' /usr/local/www/apache22/data/aot # cp G[P-T]* /usr/local/www/apache22/data/aot
これで,ブラウザから "http://web-server-host/aot/HTML/" にアクセスすると,ソースコード探索ができるはずである。index.html は main 関数を有するプログラムの一覧,アルファベット索引,ソースコードのディレクトリを提示する。ここから,目的とするコードを探索する。
スナップショットを以下に示す。ソースコード中の関数やデータ構造にリンクが設定され渡り歩くことができ,検索ボックスにキーワードを入力して必要な部分を探すことができる。


Comments