大規模なソースコードを読むのは骨が折れる。grepや目grepでは限界がある。そこでGNU Globalを使っていい感じにコードを閲覧するページを生成したい。今回使ったディストリビューションはDebian busterである。作業は静的ファイルに関する作業とCGIに関する作業に分かれる。静的ファイルだけでもハイパーリンクによるジャンプは可能なのでそこそこ使える。CGIも使えるようになると検索できてさらに便利になる。
静的ファイル
GNU Globalにはgtags,global,htagsコマンドが含まれる。gtagsコマンドはソースコードをスキャンして識別子などを抽出し、GPATH、GRTAGS、GTAGSといったファイルを生成する。globalコマンドは生成されたそれらのファイルを使って検索を実行する。htagsは良い感じにハイライトとハイパーリンクを付けたHTMLファイル群を生成する。
必要なパッケージ
GNU Globalはパッケージになっているのでapt-getするだけでgtags,htags,globalが使えるようになる。今回はウェブサーバとしてはnginxを使用してみた。Apacheでも何でもいいと思う。
$ apt-get install global nginx
$ service nginx start
nginxの設定
nginxではURL内のパスとファイルシステム上のディレクトリの関係をlocationディレクティブで設定する。初期設定では/etc/nginx/sites-available/defaultで次のようになっている。
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
普通は/var/www/html以下にウェブサービス用のHTMLファイルを置くことが想定されているが、htagsコマンドはデフォルトでHTMLという名前のディレクトリを生成するので、/var/www/HTMLをドキュメントルートにしておく。htagsコマンドが生成するHTMLファイルの場所やディレクトリ名はオプションで変えられるので、各人の好みでいいと思う。
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
root /var/www/HTML/;
}
nginxの設定ファイルを変更した後は忘れずにnginxを再起動する。
$ service nginx restart
閲覧したいソースコードの展開
ブラウザから見たいのはhtagsコマンドが生成したHTMLファイルなので、ソースコード自体をどこに展開するかは自由なのだけど、今回は/var/www/に閲覧したいソースコードを展開し、そこでhtagsコマンドを実行することにする。そうすればデフォルトで/var/www/HTMLが生成されるので手間いらずである。今回は例としてGNU makeのソースコードを展開してみた。
$ cd /var/www
$ cd wget -nd -nH http://alpha.gnu.org/gnu/make/make-4.1.90.tar.gz
$ tar zxvf make-4.1.90.tar.gz
$ ls
html make-4.1.90 make-4.1.90.tar.gz
HTMLファイルの生成
gtagsコマンドによりGTAGSファイルを生成し、htagsコマンドによりHTMLファイルを生成する。
$ cd /var/www
$ gtags
$ htags -aosnFf
$ ls
GPATH GRTAGS GTAGS HTML html make-4.1.90 make-4.1.90.tar.gz
htagsはコマンドラインオプション全部入りにしてみた。これで/var/www/HTML以下にはいい感じにハイライトとハイパーリンクのついたソースコードが生成されているので、ブラウザから見える。ただしCGIの実行ファイルが無いので検索フォームは動かない。

CGI
GNU Globalのパッケージにはhtagsが生成したHTMLファイル群をいい感じに検索してナビゲーションするために必要なCGIであるglobal.cgiとcompletion.cgiがついているので、これを活用するためにnginxでCGIが使えるようにする。
fcgiwrapのインストール
nginxはFastCGIプロトコルに対応しているようなので、global.cgiがFastCGIプロトコルから呼び出せるようにすればいい。そこでfcgiwrapをインストールする。
$ apt-get install fcgiwrap
$ service fcgiwrap start
nginxの設定
nginxの設定ファイルには .cgi で終わるURLが要求されたらFastCGIを使うように教えてやる。
location ~ \.cgi$ {
root /var/www/HTML/;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
CGI実行ファイルのコピー
GNU Globalのパッケージに同梱されているCGIの実行ファイルであるgloba.cgiとcompletion.cgiををhtagsが生成してくれたHTMLのディレクトリにコピーする。これで検索フォームが機能するようになる。
$ cd /var/www/HTML
$ cp /usr/share/global/gtags/global.cgi .
$ cp /usr/share/global/completion.cgi .
$ chmod +x *.cgi
アクセスログを見るとglobal.cgiは呼び出されているようなのだけど、completion.cgiがいつ使われるのかはよく分からない。