GNU Global

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 で処理する例を説明する。

  1. まずはソースコードの抽出。もともとの AOT ソースの場所を $RML/Source,Global のデータを作成するディレクトリを ~/src/aot とする。
  2. % cd $RML/Source
    % find . -name "*.c" -or -name "*.cpp" -or -name "*.h" |\
      xargs tar cf - | ( cd ~/src/aot ; tar xvf - )

  3. gtags コマンドを発行してタグ・データベースを作成する。GPATH, GRTAGS, GSYMS, GTAGS の 4 ファイルが生成される。
  4. % cd ~/src/aot
    % gtags -v

  5. htags コマンドで HTML データを作成する。

    • ここでは,Global 生成 HTML を http://web-server-host/aot/HTML で,検索用の CGI プログラムを http://web-server-host/aot/HTML/cgi-bin/global.cgi で,ブラウザからアクセスできるようにしよう。http://web-server-host/ は Web サーバのドキュメントルート URI の例である。実際の URI で読み替える必要がある。

    • cgi-bin/global.cgiaot/HTML ディレクトリ下において実行可能とするためには,Global 添付 .htaccess ファイル(HTML ディレクトリ直下に生成される)の指定内容でオーバーライド可能になるよう,Apache22 設定を以下のとおりに変更する(AllowOverrideOptionsFileInfo を追加する)必要がある。httpd.conf を変更したら,apachectl -t で構成チェックを行ってから Apache22 を再起動する。
    • <Directory "/usr/local/www/apache22/data">
        Options Includes FollowSymLinks ...
        AllowOverride Options FileInfo
        ...

    • 以下のオペレーションに示した htags 指定オプションは -a: アルファベット・インデックス,-f: 検索フォーム,-n: 行番号表示,-F: フレーム表示,-I: アイコンリンク使用,-s: シンボルにもアンカー付与,-x: XHTML,-t: タイトルである。さらに,--table-flist=1 で,ファイルリスト <table> 一覧のカラムを 1 に設定する(デフォルトは 5 で,フレーム表示だと広過ぎて見づらいため)。

    • オプションに --suggest を指定すると,初心者用のお勧めとして開発者が設定したオプション・セットが選択される。これも十分満足できるものと思う。ただし,5.7 未満の古いバージョンではサポートされていないようである。

    • 生成された HTML は charset の指定がなく,ソースコードに漢字等が含まれると文字化けしてしまう。ソースコードが UTF-8 の場合,以下のようなシェルスクリプト(chgcharset.sh)を作成して HTML に charset を挿入する。
    • #!/bin/sh
      sed -e 's/<\/head>/<meta http-equiv="Content-Type" \
      content="text\/html; charset=UTF-8" \/>\
      <\/head>"/' $i > $i.new
      mv $i.new $i
      

    • HTML を生成したら,gtags で作成したタグ・データベースとともに公開用 Web ディレクトリにコピーする。一応,ファイルのオーナを www に変更しておく。上記オペレーションは以下のようなものとなるはずである。あとは,好みに応じて,style.css を調整するとよい。
    • % cd ~/src/aot
      % htags -afnFIsx --table-flist=1 -t 'AOT Source Tour' .
      % cd HTML
      % foreach i (`find . -name "*.html"`)
      foreach? ../chgcharset.sh $i
      foreach? end
      % su -m
      # mkdir -p /usr/local/www/apache22/data/aot
      # tar cf - ./G[P-T]* ./HTML |\
       ( cd /usr/local/www/apache22/data/aot; tar xvf - )
      # chown -R www:www /usr/local/www/apache22/data/aot
  6. 生成された HTML データは,運用都合で別ディレクトリに移動すると,gtags で作成したデータベースを参照できず検索 CGI が動作しなくなるので注意しよう。もし Web サーバを外部公開している場合は,.htaccess の認証機能などで閲覧制限を設ける,検索エンジンからの収集を抑止するよう robots.txt に Global データ・ディレクトリを登録する,などセキュリティ上の工夫をしておくことをお勧めする(これは割愛)。

これで,ブラウザから http://web-server-host/aot/HTML/ にアクセスすると,ソースコード探索ができるはずである。index.html は main 関数を有するプログラムの一覧,アルファベット索引,ソースコードのディレクトリを提示する。ここから,目的とするコードを探索する。

スナップショットを以下に示す。ソースコード中の関数やデータ構造にリンクが設定され渡り歩くことができ,検索ボックスにキーワードを入力して必要な部分を探すことができる。

gloal_ss.png