大規模なソースコードを読むのは骨が折れる。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
がいつ使われるのかはよく分からない。