harry’s memorandum

おれおれメモ

LXR Cross Referencer を試してみた

クロスリファレンスやソースコード検索エンジンは便利なのでインストールしてみた備忘録。

LXRって?

MozillaApacheのソースみるときお世話になってるやつ。

こんなやつです。
f:id:dharry:20120508024754p:image

インストールガイド

ここみればいいや、という話でもある。
でも lxr-0.11.1.tgz でインストール試したらすげー嵌った。sourcefogeのCVSのHEADから取ってきたもので試したらすんなり。0.11.1版はどこで嵌ったかも記憶が曖昧なので気のせいかもしれない。

LXRインストール前に

  • Centos5.8(i386)で試しました。
  • 作業はrootで行いました。手抜きです。
  • perlは5.8以上であれば問題ないようです。
  • デフォルトだとブツがないのでrpmforgeリポジトリは必須。
  • swish-eかglimpseどちらでも使えるけどここではglimpseにしました。

LXRで必要なものをインストール

rpmforgeを使えるようにする。

$ wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
$ rpm -ivh rpmforge-release-0.5.2-2.el5.rf.i386.rpm

必要なものインストール。ちょっと余計に入れているかもしれない。

$ yum -y install cvs rcs ctags httpd mod_perl mysql-server mysql 
$ yum -y --enablerepo=rpmforge install perl-File-MMagic-XS perl-File-MMagic.noarch  libdbi libdbi-dbd-mysql libdbi-drivers perl-Digest-SHA1 swish-e swish-e-devel perl-String-Approx perl-Apache-DBI.noarch

glimpse か swish-e のどちらかが使えればいいようだけど、気分で切り替えられるようにどっちも使えるようにする。swish-eはyumでインストール。glimpseはコンパイルしてインストール。
ソースコードはここからダウンロード。

$ tar xvzf glimpse-latest.tar.gz
$ cd glimpse-4.18.6/
$ ./configure ; make; make install

LXRのソースコードをダウンロード

ソースはここでダウンロード。

展開して構成チェック

$ tar xvzf /root/lxr-lxr.tar.gz
$ cd lxr/
$ ./genxref --checkonly
No URL specified - Continuing in checking mode
Checking Perl version ... 5.8.8  OK
Parameter 'ectagsbin' not defined - trying to find ctags
'ectagsbin' temporarily adjusted to /usr/bin/ctags
Manually update lxr.conf for permanent setting
Checking ctags version ... 5.6  OK
Parameter 'glimpsebin' not defined - trying to find glimpse
'glimpsebin' temporarily adjusted to /usr/local/bin/glimpse
Manually update lxr.conf for permanent setting
Checking glimpse version ... 4.18.5
Parameter 'glimpseindex' not defined - trying to find glimpseindex
'glimpseindex' temporarily adjusted to /usr/local/bin/glimpseindex
Manually update lxr.conf for permanent setting
Checking glimpseindex version ... 4.18.5
Parameter 'swishbin' not defined - trying to find swish-e
'swishbin' temporarily adjusted to /usr/bin/swish-e
Manually update lxr.conf for permanent setting
Checking swishe version ... 2.4.7
No matching configuration at ./genxref line 275.

いろいろ警告っぽいのがでます。インストールガイドにあるように、まだ設定していないので警告がでます。あとで設定するので無視します。

Since LXR is not yet configured, you get various Parameter xxx not defined warnings. Ignore them.

http://lxr.sourceforge.net/en/0-11-InstallSteps/0-11-install2LXR.shtml?

初期設定スクリプト実行

ここは試しでマルチプルツリーにします。マルチプルツリーの場合はvirtrootでパスやdbなどを複数設定できるみたい。

$ ./scripts/initial-config.sh
*** Initial phase configurator for LXR ($Revision: 1.8 $) ***

Configure for single/multiple trees? [S/m] m

Your LXR root directory is: /var/www/html/lxr

templates directory now protected read-only
File .htaccess written in your LXR root directory
--- List its content with 'more .htaccess'
File apache2-require.pl written in lxrconf.d directory
File apache-lxrserver.conf written in lxrconf.d directory
File lighttpd-lxrserver.conf written in lxrconf.d directory
You need to manually configure lighttpd-lxrserver.conf for multiple trees operation
***Error: both glimpse and swish-e installed!
*** Manually edit lxr.conf to comment out one of them ***
Prototype lxr.conf written in lxrconf.d directory

*** Configuration directory lxrconf.d now contains: ***
合計 44
drwxrwxr-x 2 apache apache  4096  5月  8 02:20 .
drwxr-xr-x 9 apache apache  4096  5月  8 02:19 ..
-rwxr-xr-x 1 root   root    2394  5月  8 02:20 apache-lxrserver.conf
-rwxr-xr-x 1 root   root     149  5月  8 02:20 apache2-require.pl
-rwxr-xr-x 1 root   root   11937  5月  8 02:20 lighttp-lxrserver.conf
-rwxr-xr-x 1 root   root   14635  5月  8 02:20 lxr.conf

ここでもエラーっぽいのがでます。glimpse と swish-e は同時に指定できないのでどちらかにしないといけないようです。あとで設定するのでここも無視。

The name of your LXR root directory is set in all these files, as well as the location of ctags, glimpse, glimpseindex and swish-e. If something goes wrong, an error message is printed:

http://lxr.sourceforge.net/en/0-11-InstallSteps/0-11-install3preconf.shtml?

DBの設定

mysql, postgres, oracle など色々使えるようですが、私はmysqlにしました。

$ mysql -u root -p
mysql> create user 'lxr'@'localhost' identified by 'lxr';
Query OK, 0 rows affected (0.00 sec)
mysql> exit

passwordはガイドと同じにしていますが環境にあわせて適切に変更してください。

$ ./scripts/initdb-config.sh
*** initdb script configurator for LXR ($Revision: 1.6 $) ***

      In case you make a mistake, you can cancel the
      whole process by typing ctl-C.

Which is your database engine? [MYSQL/oracle/postgres]
Which is your database name? [lxr]
Which table prefix will you use? [lxr_]
Under which user name will you connect to the database? [lxr]
Output script name? [lxrconf.d/initdb-mysql-custom.sql]

     Your database engine is      mysql
     Your database is             lxr
     The tables are prefixed with lxr_
     You connect as               lxr
     Configuration script in      lxrconf.d/initdb-mysql-custom.sql

Is this correct? [YES|no]

Init script saved in lxrconf.d/initdb-mysql-custom.sql
$ mysql -u root -p < lxrconf.d/initdb-mysql-custom.sql

ソースを展開する場所とglimpseの作業ディレクトリを作成

$ mkdir -p /opt/lxr/indexed-src
$ mkdir -p /opt/lxr/glimpse/databases

サンプルソースとしてbcコマンドのソースを下記ディレクトリに展開します。

$ cd /opt/lxr/indexed-src
$ wget http://ftp.riken.jp/GNU/gnu/bc/bc-1.03.tar.gz
$ wget http://ftp.riken.jp/GNU/gnu/bc/bc-1.04.tar.gz
$ wget http://ftp.riken.jp/GNU/gnu/bc/bc-1.05a.tar.gz
$ wget http://ftp.riken.jp/GNU/gnu/bc/bc-1.06.tar.gz
$ for i in *.gz; do tar xvzf $i; done
$ ls
bc-1.03         bc-1.04         bc-1.05          bc-1.06
bc-1.03.tar.gz  bc-1.04.tar.gz  bc-1.05a.tar.gz  bc-1.06.tar.gz

apacheが参照するのでオーナをapacheユーザに変更しておきます。

$ chown -R apache.apache /opt/lxr/

設定ファイル

lxrconf.d/以下から、ひな形になるlxr.confをlxrのrootにコピーして修正します。

  • 修正した箇所は以下。
    • swishbinをコメント
    • host_namesを修正
    • sourcerootを/opt/lxr/indexed-srcに変更
    • glimpsedirを/opt/lxr/glimpse/databasesに変更
    • variables => v => range を修正
    • variables => a => range を修正
    • encoding をISO-2022-JPに変更
    • dbuserを適切なユーザに変更
    • dbpassを適切なパスワードに変更
    • stylesheetのパスの先頭にスラッシュが入っているので修正

注意点は host_names を直さないと表示すらできないというところですね。名前解決が間違っているとそれだけでアウトです。

$ cd /var/www/html/lxr
$ cp -p lxrconf.d/lxr.conf .
$ cat lxr.conf
(
        {
          'tmpdir' => '/tmp'
        , 'glimpsebin'   => '/usr/local/bin/glimpse'
        , 'glimpseindex' => '/usr/local/bin/glimpseindex'
        , 'swishconf' => '/var/www/html/lxr/templates/swish-e.conf'
        , 'ectagsbin' => '/usr/bin/ctags'
        , 'ectagsconf' => '/var/www/html/lxr/templates/ectags.conf'
        , 'cvspath' => '/bin:/usr/local/bin:/usr/bin:/usr/sbin'
        , 'host_names' =>       [ '//localhost'
                                                , 'http://192.168.0.170'
                                                , 'http://rainy:80'
                                                ]
        , 'htmlfatal'           => 'templates/html/html-fatal.html'
        , 'htmlhead'            => 'templates/html/html-head.html'
        , 'htmltail'            => 'templates/html/html-tail.html'
        , 'htmldir'                     => 'templates/html/html-dir.html'
        , 'htmlident'           => 'templates/html/html-ident.html'
        , 'htmlsearch'          => 'templates/html/html-search-glimpse.html'
        , 'htmlconfig'          => 'templates/html/html-config.html'
#       , 'sourcehead'          => 'templates/html/html-head.html'
#       , 'sourcedirhead'       => 'templates/html/html-head.html'
        , 'showconfighead'              => 'templates/html/config-head-btn-smaller.html'
        , 'diffleftwidth'       => 50
        , 'stylesheet'          => 'templates/lxr.css'
#       , 'alternate_stylesheet' => [ 'lxrconf.d/another.css' ]
#       , 'encoding'    => 'iso-8859-1'
        , 'encoding'    => 'ISO-2022-JP'
        , 'graphicfile' =>
                'bitmap|bmp|gif|icon?|jp2|jpe?g|pjpe?g|png|svg|tiff?|xbm|xpm'
        , 'filetypeconf' => '/var/www/html/lxr/templates/filetype.conf'
        , 'genericconf' => '/var/www/html/lxr/lib/LXR/Lang/generic.conf'
        , 'treeextract' => '([^/]*)/[^/]*$'
        , 'dbpass'              => 'lxr'
        , 'dbuser'              => 'lxr'
#       , 'dbprefix'    => 'lxr_'
        }
,       {
          'virtroot'    => '/lxr/example'   # The bit after the / above
       , 'caption' => 'My tree displayed by LXR'
       , 'shortcaption' => 'My tree'
#       , 'encoding'    => 'iso-8859-1'
        , 'encoding'    => 'ISO-2022-JP'
#       , 'cvswebprefix' => 'http://cvs.myhost.com/cgi-bin/cvsweb.cgi'
#       , 'cvswebpostfix' => '?cvsroot=rootname'
#       , 'cvswebprefix' => 'http://cvs.myhost.com/cgi-bin/viewcvs.cgi/myroot'
#       , 'cvswebpostfix' => ''
        , 'sourceroot' => '/opt/lxr/indexed-src'
#       , 'sourceroot'  => 'cvs:/home/karsk/a/CVSROOT/linux'
#       , 'sourceroot' => 'git:/some/repository/.git'
        , 'sourcerootname' => 'Example'
#       , 'sourcerootname' => '$v'
        , 'variables' =>
                { 'v' =>
                        { 'name' => 'Version'
                        , 'range' => [qw(bc-1.03 bc-1.04 bc-1.05 bc-1.06)]
                        }
                , 'a' =>
                        { 'name'  => 'Architecture'
                        , 'range' => [qw(i386)]
                        }
                }

        , 'ignoredirs' => ['CVSROOT', '.git']
        , 'incprefix' => [ '/include', '/include/linux' ]
        , 'dbname' => 'dbi:mysql:dbname=lxr'
        , 'glimpsedir' => '/opt/lxr/glimpse/databases'
        , 'swishdir' => '/a/directory/here/'
        }
)

apacheのconfigをコピー

$ cp lxrconf.d/apache-lxrserver.conf /etc/httpd/conf.d

templatesのhtmlのイメージファイルのパスが間違っているので修正

cd /var/www/html/lxr/templates/html
$ for i in *.html
> do
> sed -i -e "s@/LXRimages@./LXRimages@g" $i
> done

indexの作成

./genxref --url=http://localhost/lxr/example

apacheが参照するのでオーナをapacheユーザに変更しておきます。

$ chown -R apache.apache /opt/lxr/

apacheを再起動。

$ /etc/init.d/httpd restart

あとは URLにアクセスして完了。
デフォルトのcssだと寂しいので、MozillaやApacheのlxrからパクって少しだけ見た目を変更しました。

 http://{ipaddress}/lxr/source