Ubuntu上でのLXR 0.9.xの用意のしかた
Ubuntu上でのLXR 0.9.xのインストールと使い方は幾つか見つかるが、自分用のドキュメントを揃えておく。ターンアラウンド的なところがあるが(苦笑)。
必須パッケージのインストール
apt-getかaptitudeで次のパッケージをインストールする:
- git-core
- postgresql postgresql-client
- libxapian15 libsearch-xapian-perl
- apache2 libapache2-mod-perl2 libdbd-pg-perl
- libcgi-simple-perl libcgi-ajax-perl libhtml-parser-perl libtemplate-perl libterm-progressbar-perl libdevel-size-perl
- exuberant-ctags
- texlive
- inkscape
上記の他にも必要なものがあるかもしれないが、臨機応変、適宜パッケージをインストールすればよい。
LXRをgitリポジトリからインストール
他のドキュメント同様に/usr/shareにインストールしたい場合は次のように行う:
$ cd /usr/share $ sudo git-clone git://lxr.linux.no/git/lxrng.git $ sudo chown -R ソースツリーのオーナー /usr/share/lxrng
/usr/share/lxrngにLXRがインストールされる。ソースツリーのオーナーは適切なオーナーにする。デスクトップで自分ひとりでしかつかわないのであれば、ログインしているユーザーで構わないだろう。オーナーにしなくてもアクセス権限があればよいが、それは自分のシステム・環境に合わせて構築すればよい。
データベースの用意
データベースを作成したのち、ソースファイルツリーのオーナーとUbuntuのapache2ユーザー(www-data)をデータベース上に設ける。Ubuntuの場合はPostgreSQLパッケージをインストールするとpostgresユーザが用意されているので、postgresユーザで作成する。
$ su postgres $ createdb lxrng $ createuser ソースファイルツリーのオーナー $ createuser www-data
各種の権限を与えるかどうかの質問がされるが、とりあえずは必要ないので、すべてnで答えてよい。
因みにデータベースをまるごと削除して作り直す時は、
$ sudo -u postgres dropdb lxrng && sudo -u postgres createdb lxrng
とすればよい。一応lxr-db-adminというコマンドが用意されていて、
$ ./lxr-db-admin --drop && ./lxr-db-admin --init
を実行しても同じである。但し、後述するLXRのコンフィギュレーションファイルでユーザとパスワードの設定、そしてそのユーザにデータベースを削除できるスーパーユーザーなどの権限が与えられていなければならない。
ソースコードツリーを用意
ダウンロードしてきたソースツリーでも、gitで取得してきたリポジトリでもどちらでも可能。
ダウンロードしてきたソースツリーを利用する場合
ソースツリー置き場は適切に設定できるならばどのディレクトリでもよいが、/usr/src/lxrをソース置き場にする。とりあえず、/usr/src/lxrのオーナーをソースツリーのオーナーとすればよい。今そのオーナーをmatthewとすると、次のようにすればよい。
matthew$ sudo mkdir -p /usr/src/lxr matthew$ sudo chown matthew /usr/src/lxr matthew$ mkdir /usr/src/lxr/linux-2.6 matthew$ cp -a linux-2.6.x1.y1 /usr/src/lxr/linux-2.6/v2.6.x1.y1
ソースツリーのトップディレクトリをv2.6.x1.y1のように先頭に小文字のvを付け、その後にバージョン番号をつけておくと何かと都合がよいので、そうしておくべきである(本家LXRの使い方がそうであるから)。
複数のソースの場合は、上記の場合、/usr/src/lxr/linux-2.6にv2.6.x2.y2としてどんどん置いておけばよいだけである。
$ ls /usr/src/lxr/linux-2.6
v2.6.28.3 v2.6.28.4 v2.6.28.5
gitリポジトリの場合
例えば、/var/lib/lxrng/repos以下にソースツリーを置きたい場合は、gitでソースツリーとってくるだけである。
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6
James Morrisのセキュリティ関連リポジトリの場合:
$ git clone git://git2.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git security-testing-2.6
"git clone git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6"でいいかもしれない。
/var/lib/lxrng/reposを例として使っているのはLXRが配っているコンフィギュレーションファイルのデフォルト値だからである。
*** security-testing-2.6のTOMOYO Linuxのソースが見たい場合
jmorris/security-testing-2.6.gitを取得後、次を実行:
$ git checkout --track -b my-next origin/next
(でも、LXRでどうなるか、まだためしてません(汗))
キャッシュディレクトリの用意
レスポンスを欲するためのキャッシュだろうか(要確認)。キャッシュディレクトリを用意しておく。システムや環境に合わせてパーミッションを設定すればよいが、ソースツリーオーナーとwww-data(LXRのCGI/Perlモジュールを動かすときのユーザー、apache2の実行ユーザー)が読み書き出きるようにしておけばよいだろう。
$ sudo mkdir -p /var/lib/lxrng/cache $ sudo chmod -R a+rw /var/lib/lxrng
これもLXRのコンフィギュレーションファイルのデフォルトが/var/lib/lxrng/cacheなので、そうしているまでである。
ペンギン画像の用意
makeを実行すればよい。
$ make -C /usr/share/lxrng/webroot/.static/gfx
これを作るのに、inkscapeなどがインストールされているのだ。
コンフィギュレーションファイルを編集
lxrng.conf-distというファイルをlxrng.confという名前のファイルでコピーして、システム・環境に応じて編集する。
因みに、ユーザーとパスワードは指定しなくてもLXRを構築し運用できるが、厳純に管理したい場合は設定すればよい。
gitではなくダウンロードしてきたソースツリーを使う場合
コメント「#変更*」がある行だけを変更すればよいが、ソースディレクトリやキャッシュディレクトリを変更した場合は適宜変更すること。変更した箇所をまとめると
- GitからPlainへ
- ベースとなるURL
- デフォルトで表示するバージョン
を指定すればよいだけである。
# -*- mode: perl -*- # Configuration file # # use LXRng::Index::PgBatch; use LXRng::Repo::Plain; #変更:GitからPlainへ use LXRng::Search::Xapian; my $gitrepo = LXRng::Repo::Plain-> new('/usr/src/lxr/linux-2.6'); #変更:GitからPlainへ my $index = LXRng::Index::PgBatch->new(db_spec => 'dbname=lxrng;port=5432', db_user => "", db_pass => "", # table_prefix => 'lxr' ); my $search = LXRng::Search::Xapian->new('/var/lib/lxrng/text-db/linux-2.6'); return { 'linux' => { 'repository' => $gitrepo, 'index' => $index, 'search' => $search, 'base_url' => 'http://localhost/lxr', #変更 # Must be writable by httpd user: 'cache' => '/var/lib/lxrng/cache', 'fs_charset' => 'iso-8859-1', 'content_charset' => 'iso-8859-1', 'languages' => ['C'], 'ver_list' => [$gitrepo->allversions], 'ver_default' => 'v2.6.28.4', #変更:デフォルトを指定 '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), qw(ppc s390 sh sparc sparc64 x86_64) }], [qr|^|, qr|(.*)|, sub { "include/$_[0]" }], ], }, };
gitを使っている場合
配られているコンフィギュレーションファイルはgit利用をデフォルトとしているので、変更する箇所はベースURLとデフォルト表示バージョンだけである。
# -*- mode: perl -*- # Configuration file # # use LXRng::Index::PgBatch; use LXRng::Repo::Git; use LXRng::Search::Xapian; my $gitrepo = LXRng::Repo::Git ->new('/var/lib/lxrng/repos/linux-2.6/.git', release_re => qr/^v[^-]*$/, author_timestamp => 0); my $index = LXRng::Index::PgBatch->new(db_spec => 'dbname=lxrng;port=5432', db_user => "", db_pass => "", # table_prefix => 'lxr' ); my $search = LXRng::Search::Xapian->new('/var/lib/lxrng/text-db/linux-2.6'); return { 'linux' => { 'repository' => $gitrepo, 'index' => $index, 'search' => $search, 'base_url' => 'http://localhost/lxr', #変更 # Must be writable by httpd user: 'cache' => '/var/lib/lxrng/cache', 'fs_charset' => 'iso-8859-1', 'content_charset' => 'iso-8859-1', 'languages' => ['C'], 'ver_list' => [$gitrepo->allversions], 'ver_default' => 'v2.6.28.4', #変更:デフォルトを指定 '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), qw(ppc s390 sh sparc sparc64 x86_64) }], [qr|^|, qr|(.*)|, sub { "include/$_[0]" }], ], }, };
インデックス作成
データベースに初めてインデックスを作成するときだけ、データベースにテーブルを作成するため、次を実行しておく。
$ ./lxr-db-admin コンフィギュレーションファイルで設定したプロジェクト --init
「コンフィギュレーションファイルで設定したプロジェクト」とあるのは、コンフィギュレーションファイルのreturnの次の行にある"linux"のことである。実際には次のように指定する。
$ ./lxr-db-admin linux --init
次に、ソースコードツリーすべてに対してインデックスを作成する。
$ ./lxr-genxref linux
結構時間がかかるが、待つ。初めて行う場合は1時間以上かかるかも。
Apacheの用意
筆者の場合はmod_perlを利用するようにしているので、その設定を例として挙げる。システムや環境にあわせて適切に設定すればよい。
apache2-site.conf-dist-mod_perlが配布されているので、これを利用する。このファイル中の次の文字列を変更するだけでよい。
- @@LXRROOT@@ を lxrをインストールしたディレクトリに置き換える(例:/usr/share/lxrng)
- @@LXRURL@@ を コンフィギュレーションファイルのベースディレクトリに合わせて、ディレクトリ部分を指定する(例:/lxr)
PerlInitHandler Apache2::Reload PerlOptions +GlobalRequest PerlRequire /usr/share/lxrng/lxrng_mod_perl.pl PerlModule LXRng::ModPerl Alias /lxr "/usr/share/lxrng/webroot/" <Directory "/usr/share/lxrng/webroot/"> Options ExecCGI AllowOverride None Order deny,allow Allow from all <Files *> SetHandler perl-script PerlResponseHandler LXRng::ModPerl </Files> <Files favicon.ico> SetHandler send-as-is </Files> <Files robots.txt> SetHandler send-as-is </Files> </Directory> <Directory "/usr/share/lxrng/webroot/.static/"> <Files *> SetHandler send-as-is </Files> </Directory>
編集後、apache2のサイト設定ディレクトリにコピーし、使えるようにしておく。
$ sudo cp apache2-site.conf-dist-mod_perl /etc/apache2/sites-available/lxrng $ sudo a2ensite lxrng
あとは、apache2をreloadするなりrestartするなりすれば、ベースURLで指定したURLにアクセスするだけである。
更新
ダウンロードしたソースツリーを増やす場合
例えば、次のようにパッチをあてて、ソースツリーを増やし、インデックスを作成するコマンドを実行するだけである。
前のバージョンのソースツリーをコピーしておく
$ cp -a v2.6.28.4 v2.6.28.5
パッチを用意
$ cd v2.6.28.5 $ bzip2 -d /home/matthew/downloads/patch-2.6.28.4-5.bz2 -c > patch $ patch -p1 <patch $ rm patch
lxrng.confのデフォルトバージョンを変更しておく。この値はブラウザでLXRが参照されるとき、常に読み込まれる値であるので、好きな時に変更すればよい。
'ver_default' => 'v2.6.28.4',
最後に
$ ./lxr-genxref linux
などとしてインデックス作成すればよい。
gitの場合
gitのディレクトリでリポジトリの更新を行い、インデックスを作成すればよい(未確認)。おそらくタグごとに作成されるだろう。
$ cd .gitのあるところ
$ git checkout master
$ git pull
最後に
$ ./lxr-genxref linux
apache稼働中にデータベースを作り直す場合
もっと良い方法があると思うけど(あとから調査)、apache2-postgresql間の接続を停止させてから行う。面倒くさくて、ひとりで使っている場合はapache2を止めて、drop/createを行ってもよいだろう。
インデックス作成中のエラー
インデックス作成中に
Use of uninitialized value in numeric gt (>) at ./lxr-genxref line 233.
というメッセージがでるときがある。いまのところきにしないでおく(笑)。
応用
複数のLXRを簡単に管理したい
ソースの置き場所は異なるのは必然として、コンフィギュレーションファイルの「ハッシュ」内容を増やせばいくつも管理できそうな感じだが、lib/LXRng/Context.pm中で読み込んだコンフィギュレーションファイルのハッシュのうち最初の([0])しか読まないので、改造が必要であるが、それをするぐらいなら、LXR自体をgitで複数インストールしたほうが良いだろう。LinusとJames Morrisの二つ用意したいとかいろいろできるはずだ。
参考: