Linux Cross Reference setup on ubuntu

Linux Cross Reference(以下LXR)とは、LinuxソースコードWebブラウザ経由で見られるようにするために開発された素敵なツールである。LXRには0.3.x系列と0.9.x系列があり、0.3.x系列はFXR(=FreeBSD Cross Reference)、0.9.x系列は本家LXRなどに導入されている。本文では、Ubuntu上で Linux Cross Reference (LXR) の 0.9.x を導入する手順について説明する。

Screenshot

まず、こんな辺境のブログを見てくれる方が時間を無駄にしないように、本文で述べる設定に従うとどういった動作になるのか、スクリーンショットを以下に示しておく。特徴は以下の通り。
1.リッチな検索機能

[

2.クロスリファレンス機能(青くなっている部分をクリックすると、定義場所へジャンプすることが可能。)
[

3.複数種のソースコードを管理可能

長くなってしまったので、本日のエントリでは1、2が使用できるところまで説明する。3を行う方法は次回エントリで述べる。

Assumption

便宜上、以下のような仮定をする。

意味 変数
インストールしようとしているユーザの名前 lxr-admin
インストール先ディレクト /usr/share
ソースコードツリーのルートディレクト /usr/src
ソースコードの入っているプロジェクト名前 project1、project2、、、


Install related packages

それでは、具体的なインストール手順の説明に入る。まず、LXRが使用するソフトウェアをaptitudeを使用してインストールする。

sudo aptitude install git-core
sudo aptitude install postgresql 
sudo aptitude install postgresql-client
sudo aptitude install libxapian15
sudo aptitude install libsearch-xapian-perl
sudo aptitude install apache2 libapache2-mod-perl2
sudo aptitude install libcgi-simple-perl libcgi-ajax-perl libhtml-parser-perl libtemplate-perl
sudo aptitude install libterm-progressbar-perl libdevel-size-perl
sudo aptitude install exuberant-ctags
sudo aptitude install texlive
sudo aptitude install inkscape 

Install LXR

次に、gitレポジトリ経由でLXR本体を落として、インストールを行う。(なお、Ubuntuにはlxrlxr-cvsというパッケージがあるが、lxrは0.3.x系列のパッケージであり、lxr-cvsは0.9.x系列ではあるが、ややバージョンが古いので、今回はこれらは使用しないこととする。)LXRをgit経由でダウンロードするには、以下のコマンドを実行すれば良い:

cd /usr/share
sudo git-clone git://lxr.linux.no/git/lxrng.git
sudo chown -R lxr-admin /usr/share/lxrng

これで、カレントディレクトリにLXRがインストールされる。

Setting for LXR

ここからLXRの設定を行っていく。大まかにわけると、以下の手順に分割できる。

  1. PostgreSQLの初期設定
  2. 検索用インデックスの生成
  3. LXR本体の設定
  4. Apacheの設定

Initializing PostgreSQL

まず、PosgreSQLの初期設定(ユーザの作成、DBの作成)を行う。

su postgres                              # postgresのパスワードは予め設定しておくこと
createdb lxrng                         # lxrng が検索などに作成するDB
createuser lxr-admin               # 必ずソースファイルへの権限を持っているユーザとと同じ名前にすること
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
createuser www-data             # apacheがDBに対してアクセスできるようにする
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n

createuser すると、

Shall the new role be a superuser? (y/n) 
Shall the new role be allowed to create databases? (y/n) 
Shall the new role be allowed to create more new roles? (y/n) 

とプロンプトが出る。全て n としても動作に支障はないので、ここの返答はどちらでも良い。
これでPostgresSQLの設定は終了。

Tips

DBの更新を誤ってしてしまい、再度最初から作成したい場合は、

su postgres
sudo dropdb lxrng

とした後、再度

sudo createdb lxrng

とすればよい。ユーザは消えないので、再作成する必要はない。

Prepatration for cotaining the source codes

ソースコードを入れるディレクトリの準備をする。ソースコードを入れるディレクトリの所有者は、lxr-adminである必要であることに注意。

sudo mkdir /usr/src/lxr
sudo chown lxr-admin /usr/src/lxr
mv ~lxr-admin/source/project1 /usr/src/lxr # ソースファイルを/usr/src/lxrに移動
mv ~lxr-admin/source/project2 /usr/src/lxr
mv ~lxr-admin/source/project3 /usr/src/lxr
...

さらに、xapianがテキスト検索をを行うためのディレクトリの設定を行っておく。

sudo mkdir -p /var/lib/lxrng/text-db
sudo chown -R lxr-admin /var/lib/lxrng/text-db
mkdir /usr/share/lxrng/text-db
mkdir /usr/share/lxrng/text-db/project1

xapianのキャッシュディレクトリの作成、設定を行う。

sudo mkdir -p /var/lib/lxrng/cache
sudo chmod -R a+rw /var/lib/lxrng

Linuxペンギンの画像ファイル(png)を生成する。

make -C /home/guest/lxrng/webroot/.static/gfx
make: Entering directory `/home/guest/lxrng/webroot/.static/gfx'
make: Nothing to be done for `all'.
make: Leaving directory `/home/guest/lxrng/webroot/.static/gfx'

Setup LXR

ようやくLXR本体の設定を行う。lxrng.confの設定をいじる。これはサンプルを用意しておいたので以下を参照。

# -*- mode: perl -*-
# Configuration file
#
#
use LXRng::Index::PgBatch;
use LXRng::Repo::Git;
use LXRng::Search::Xapian;
use LXRng::Repo::Plain;

#ソースコードが入っているディレクトリを指定する
my $repo_project1 = LXRng::Repo::Plain->
                     new('/usr/src/lxr/project1'); 

my $index   = LXRng::Index::PgBatch->new(db_spec => 'dbname=lxrng;port=5432',
                                         db_user => "", db_pass => "",
                                         # table_prefix => 'lxr'
                                         );

#検索インデックスが入っているディレクトリを指定する
my $search_project1 = LXRng::Search::Xapian->new('/var/lib/lxrng/text-db/project1');

return {
    'project1' => {
        'repository'  => $repo_project1,   #上記で指定した名前と対応
        'index'       => $index,
        'search'      => $search_project1, #上記で指定した名前と対応
        
        #ベースURL-この場合だと/lxr/project1というurlになる
        #当然 @@YourIPAddress@@ はあなたのマシンのIPアドレス。
        'base_url'    => 'http://@@YourIPAddress@@/lxr', 
        # Must be writable by httpd user:
        'cache'       => '/var/lib/lxrng/cache',      #キャッシュディレクトリの指定

        'fs_charset'  => 'iso-8859-1',
        'content_charset' => 'iso-8859-1',

        'languages'   => ['C'],               #言語の指定。Java、C、C++から選べるはず
        
        #バージョンの指定。この名前に対応するディレクトリは必ず存在している必要がある。
        #以下の例の場合、
        # /usr/src/lxr/project1/1.0
        # /usr/src/lxr/project1/1.1
        # /usr/src/lxr/project1/1.2
        #は全て存在している必要がある。
        #存在していない場合、ブラウザで参照したときに対応するバージョンのURLが
        #Not Foundになってしまう。
        'ver_list'    => ['1.0','1.1','1.2'], 

        'ver_default' => '1.2', #デフォルトで表示するディレクトリ。

        'include_maps' =>      #謎。
            [
             [qr|^arch/(.*?)/|, qr|^asm/(.*)|,
              sub { "include/asm-$_[0]/$_[1]" }],
             [qr|^include/asm-(.*?)/|, qr|^asm/(.*)|,
              sub { "include/asm-$_[0]/$_[1]" }],
             [qr|^|, qr|^asm/(.*)|,
              sub { map { "include/asm-$_/$_[0]" }
                    qw(i386 alpha arm ia64 m68k mips mips64),
             [qr|^|, qr|(.*)|,
              sub { "include/$_[0]" }],
             ],
    },
};

(注:筆者はperlが全然わからないので、なんとなく書いている。すごく効率の悪いコードを書いているかもしれないので、適当に直して頂けるとありがたい。とりあえず、上記コードで動作することは確認した。)

Generating Search Indices


次に、ソースコード検索を行うためのインデックス生成を行う。インデックスの生成には、インストールディレクトリに存在するPerlスクリプトlxr-genxrefを使用する。

/usr/share/lxrng/lxr-db-admin project1 --init #Project1用のDBの作成?
/usr/share/lxrng/lxr-genrefx project1      
./lxr-genrefx project1

Setup Apache

さて、いよいよ大詰め。Apacheの設定である。LXRにはPerlスクリプトを介して動かす設定と、CGIを介して動かす設定があるようだが、今回はCGIを使用する設定を行う。これに関するテンプレートは、/usr/share/lxrng/apache2-site.conf-dist-cgiである。このファイルを適宜変更し、apacheに読み込ませればよい。以下は、今回指定した前提に基づいた指定例である。

簡単のため、今回は /etc/apache2/apache2.conf の末端に以下の設定を付け加えたとする。

Alias /lxr/favicon.ico "/usr/share/lxrng/webroot/favicon.ico"
Alias /lxr/robots.txt  "/usr/share/lxrng/webroot/robots.txt"
Alias /lxr/.static     "/usr/share/lxrng/webroot/.static"

# For LXRng installed directly in the web site root, use
#   ScriptAlias /@@LXRURL@@  "@@LXRROOT@@/webroot/lxr.cgi"をもじる
ScriptAlias /lxr            "/usr/share/lxrng/webroot/lxr.cgi/"

<Directory "/usr/share/lxrng/webroot/">
  Options ExecCGI
  AllowOverride None
  Order deny,allow
  Allow from all
</Directory>

設定ファイルを読み込ませるため、apacheを再起動する。

 /etc/init.d/apache2 restart # CentOSとかだとhttpd restart になるかも。

Let's Browsing the file!

動作確認を行う。
http://@@YourIPAddress@@/lxr
にアクセスして、以下のような画面が出ればOK。

Let's use LXR more!

「せっかくなので、もっとLXRを使い倒してみる。」を書こうとしたが、かなり長くなってしまったので次回に回す。


参考文献1:http://lxr.linux.no/.static/contrib/lxr-notes-ubuntu.txt
参考文献2:http://darwish-07.blogspot.com/2008/02/howto-lxrng-on-ubuntu-710.html
参考文献3:http://lxr.linux.no/