More than 1 year has passed since last update.

OpenGrokを用いてC/Python/JavaScriptのソースコード検索とクロスリファレンスを構築するまでの手順。

OpenGrokとは

{OpenGrok by OpenGrok

OpenGrok is a fast and usable source code search and cross reference engine.

公式GitHub repository: https://github.com/OpenGrok/OpenGrok

対応言語

公式ページより抜粋

本記事ではC/Python/JavaScriptについて試す。

環境

  • debian 8.4/8.6 (jessie)

参考資料

前準備

OpenGrokバイナリ取得

https://github.com/OpenGrok/OpenGrok/releases

現時点での最新stable(0.12.1.6)のバイナリをダウンロードする。

  • opengrok-0.12.1.6.tar.gz

OpenGrok 0.12.1.6

Requirements

README
2. Requirements
---------------

    * Latest Java (At least 1.8)
      http://www.oracle.com/technetwork/java/
    * A servlet container like Tomcat (8.x or later)
      supporting Servlet 2.5 and JSP 2.1
      http://tomcat.apache.org/
    * Exuberant Ctags or Universal Ctags
      http://ctags.sourceforge.net/
      http://github.io/uctags
    * Source Code Management installation
      depending on type of repositories indexed
    * If you want to build OpenGrok:
      - Ant (1.9.4 and later)
        http://ant.apache.org/
      - JFlex
        http://www.jflex.de/
      - Netbeans (optional, at least 8.0, will need Ant 1.9.4)
        http://netbeans.org/

Supported Deployment Engines

bin/OpenGrok
# Supported Deployment Engines:
#   - Tomcat 7
#   - Tomcat 6
#   - Glassfish

Supported Operating Systems

bin/OpenGrok
# Supported Operating Systems:
#   - Solaris 11  (SunOS 5.11)
#   - Solaris 12  (SunOS 5.12)
#   - Debian      (Linux)

Requirementsパッケージインストール

install-java
$ sudo aptitude install openjdk-7-jre
(略)
$ java -version
java version "1.7.0_111"
install-ctags
$ sudo aptitude install ctags
install-web-server
$ sudo aptitude install tomcat7 tomcat7-admin

tomcat準備

起動
$ sudo service tomcat7 start
$ sudo service tomcat7 status
● tomcat7.service - LSB: Start Tomcat.
   Loaded: loaded (/etc/init.d/tomcat7)
   Active: active (exited) since 火 2016-01-05 09:52:23 JST; 11s ago
  Process: 46899 ExecStart=/etc/init.d/tomcat7 start (code=exited, status=0/SUCCESS)

 1月 05 09:52:23 debian8 tomcat7[46899]: Starting Tomcat servlet engine: tomcat7.
$

server.xml を修正して使用ポート番号を2424(OpenGrokのデフォルトポート番号)に変更する。

server.xml
@@ -69,7 +69,7 @@
          APR (HTTP/AJP) Connector: /docs/apr.html
          Define a non-SSL HTTP/1.1 Connector on port 8080
     -->
-    <Connector port="8080" protocol="HTTP/1.1"
+    <Connector port="2424" protocol="HTTP/1.1"
                connectionTimeout="20000"
                URIEncoding="UTF-8"
                redirectPort="8443" />

tomcatを再起動する。

$ sudo service tomcat7 restart
$

インストール手順

OpenGrokバイナリからインストールする手順を示す。

OpenGrokインストール

untar
$ tar xvf opengrok-0.12.1.6.tar.gz
opengrok-0.12.1.6/doc/CHANGES.txt
opengrok-0.12.1.6/doc/LICENSE.txt
opengrok-0.12.1.6/doc/NOTICE.txt
opengrok-0.12.1.6/doc/README.txt
opengrok-0.12.1.6/doc/logging.properties
opengrok-0.12.1.6/doc/paths.tsv
opengrok-0.12.1.6/bin/OpenGrok
opengrok-0.12.1.6/doc/EXAMPLE.txt
opengrok-0.12.1.6/lib/lib/ant.jar
opengrok-0.12.1.6/lib/lib/bcel-5.2.jar
opengrok-0.12.1.6/lib/lib/jrcs.jar
opengrok-0.12.1.6/lib/lib/lucene-analyzers-common-4.7.1.jar
opengrok-0.12.1.6/lib/lib/lucene-core-4.7.1.jar
opengrok-0.12.1.6/lib/lib/lucene-queryparser-4.7.1.jar
opengrok-0.12.1.6/lib/lib/lucene-suggest-4.7.1.jar
opengrok-0.12.1.6/lib/lib/swing-layout-0.9.jar
opengrok-0.12.1.6/lib/opengrok.jar
opengrok-0.12.1.6/lib/source.war
opengrok-0.12.1.6/man/man1/opengrok.1
$
パスを通す
OPENGROK_PATH=<path to OpenGrok install dir>/opengrok-0.12.1.6
export PATH=$PATH:$OPENGROK_PATH/bin
deploy
$ sudo OpenGrok deploy
Loading the default instance configuration ...
Installing /opt/opengrok-0.12.1.6/bin/../lib/source.war to /var/lib/tomcat7/webapps ...

Start your application server (Tomcat),  if it is not already
running, or wait until it loads the just installed web  application.

OpenGrok should be available on <HOST>:<PORT>/source
  where HOST and PORT are configured in Tomcat.

ソースコード取り込み

まずはLinux 3.16.1のソースを入れてみる。
デフォルトでは/var/opengrok/srcがソース格納パスとなる。

source配置
$ sudo mkdir -p /var/opengrok/src

$ tar xvf linux-3.16.1.tar.gz
(中略)
$
$ sudo mv linux-3.16.1 /var/opengrok/src

OpenGrok indexを実行するとソースコードのインデックスが作成される。

opengrok-0.12.1/bin$ sudo ./OpenGrok index
Loading the default instance configuration ...
WARNING: OpenGrok generated data path /var/opengrok/data doesn't exist
  Attempting to create generated data directory ...
WARNING: OpenGrok generated etc path /var/opengrok/etc  doesn't exist
  Attempting to create generated etc directory ...
  Creating default /var/opengrok/logging.properties ...
opengrok-0.12.1/bin$

アクセス確認

http://<OpenGrok server IP address>:2424/source/ にWebブラウザからアクセスする。

top.png

検索画面が表示された。
インデックスが正しく作成されていないとIn Project(s)が表示されず、
検索するとエラーメッセージが表示される。

機能

OpenGrokの簡単な機能紹介。
言語を問わず共通した機能が使用できる。。

検索機能

全文検索/定義/シンボル等で検索可能。

TypeCにしてforkで検索してみると、ファイルを横断しての検索結果が表示される。
ディレクトリ毎にファイルがグループ分けされて、検索該当行が表示される。
個人的にはLXRより見やすい。

result.png

クロスリファレンス機能

変数や関数をクリックすると、その定義について検索する。

search_01.png

ナビゲート機能

ファイルを開いて、画面上部メニューからNavigateを選択すると、
ファイル内の変数と関数の定義一覧が表示される。
クリックすると該当箇所にジャンプできる。

navigate.png

search_02.png

ソースコード追加

新たなソースコードを追加するには、以下の手順を実施する。

  1. /var/opengrok/src以下にソースディレクトリを追加
    • ソース格納ディレクトリでgit cloneを実行でOK
  2. OpenGrok updateを実行する
  3. tomcatを再起動

例として、sysstatを追加してみる。

$ git clone https://github.com/sysstat/sysstat.git
...
/var/opengrok/src$ ls
linux-3.16.1  sysstat
opengrok-0.12.1/bin$ sudo ./OpenGrok update
opengrok-0.12.1/bin$ sudo service tomcat7 restart
opengrok-0.12.1/bin$ 

add.png

In Project(s)sysstatが追加された。

出力例

PythonとJavaScriptを追加した結果例。

Python

PythonソースもC言語ソースの追加と同じ方法で追加できる。
例として、psutilモジュールのソースを追加する。

ソース追加

/var/opengrok/src# git clone https://github.com/giampaolo/psutil.git
...
/var/opengrok/src# ls
linux-3.16.1  psutil
opengrok-0.12.1/bin$ sudo ./OpenGrok update
opengrok-0.12.1/bin$ sudo service tomcat7 restart
opengrok-0.12.1/bin$ 

画面出力

psutilが追加されている。TypePythonが選択できる。
検索結果はC言語での検索と同じ形式で出力される。

python_01.png

Navigateも機能し、ファイル内の変数と関数の定義が表示できる。

python_02.png

JavaScript

JavaScriptソースも同様に追加できる。
例として、jQueryを追加してみる。

ソース追加

/var/opengrok/src$ sudo git clone https://github.com/jquery/jquery.git
...
/var/opengrok/src$ ls
jquery  linux-3.16.1  psutil
$
opengrok-0.12.1/bin$ sudo ./OpenGrok update
opengrok-0.12.1/bin$ sudo service tomcat7 restart
opengrok-0.12.1/bin$ 

画面出力

TypeJavaScriptが選択できる。
検索結果はC言語での検索と同じ形式で出力される。

jquery_01.png

JavaScriptではNavigateはうまく働かないようだ。
表示が空白となっている。

jquery_02.png

Troubleshooting

インデックス作成(OpenGrok index)で失敗

OpenGrok indexを実行するとソースコードのインデックスが作成される。

インデックス作成失敗
opengrok-0.12.1/bin$ sudo ./OpenGrok index
Loading the default instance configuration ...
WARNING: OpenGrok generated data path /var/opengrok/data doesn't exist
  Attempting to create generated data directory ...
WARNING: OpenGrok generated etc path /var/opengrok/etc  doesn't exist
  Attempting to create generated etc directory ...
  Creating default /var/opengrok/logging.properties ...
10:16:54 SEVERE: Failed to send configuration to localhost:2424 (is web application server running with opengrok deployed?)
java.net.ConnectException: 接続を拒否されました
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at java.net.Socket.connect(Socket.java:528)
        at java.net.Socket.<init>(Socket.java:425)
        at java.net.Socket.<init>(Socket.java:241)
        at org.opensolaris.opengrok.configuration.RuntimeEnvironment.writeConfiguration(RuntimeEnvironment.java:928)
        at org.opensolaris.opengrok.index.Indexer.sendToConfigHost(Indexer.java:852)
        at org.opensolaris.opengrok.index.Indexer.main(Indexer.java:563)
opengrok-0.12.1/bin$

失敗した。verboseを有効にしてやってみると、
インデックスの作成までは成功して、Webサーバに通信するところで失敗している。

インデックス作成失敗_w/_verbose
$ sudo OPENGROK_VERBOSE=true  ./OpenGrok index
Loading the default instance configuration ...
Logging filehandler pattern: /var/opengrok/log/opengrok%g.%u.log
10:47:34 INFO: Scanning for repositories...
10:47:35 INFO: Done scanning for repositories (0s)
10:47:35 INFO: Writing configuration to /var/opengrok/etc/configuration.xml
10:47:35 INFO: Done...
10:47:35 INFO: Generating history cache for all repositories ...
10:47:35 INFO: Creating historycache for 0 repositories
10:47:35 INFO: Done historycache for all repositories (took 2 ms)
10:47:35 INFO: Done...
10:47:35 INFO: Starting indexing
10:47:37 INFO: Done indexing data of all repositories (took 1.984 seconds)
10:47:37 INFO: Send configuration to: localhost:2424
10:47:37 SEVERE: Failed to send configuration to localhost:2424 (is web application server running with opengrok deployed?)
java.net.ConnectException: 接続を拒否されました
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at java.net.Socket.connect(Socket.java:528)
        at java.net.Socket.<init>(Socket.java:425)
        at java.net.Socket.<init>(Socket.java:241)
        at org.opensolaris.opengrok.configuration.RuntimeEnvironment.writeConfiguration(RuntimeEnvironment.java:928)
        at org.opensolaris.opengrok.index.Indexer.sendToConfigHost(Indexer.java:852)
        at org.opensolaris.opengrok.index.Indexer.main(Indexer.java:563)
10:47:37 INFO: Configuration update routine done, check log output for errors.
10:47:37 INFO: Total time: 2.738 seconds
10:47:37 INFO: Final Memory: 2M/12M
Errorメッセージ抽出
SEVERE: Failed to send configuration to localhost:2424 (is web application server running with opengrok deployed?)

tomcatは動いているが、

$ netstat -an | grep 2424
$

ポート設定がデフォルトのままだった。
前述の手順で使用ポートを8080 -> 2424に変更し、./OpenGrok updateを実行すると成功した。

opengrok-0.12.1/bin$ sudo ./OpenGrok update
Loading the default instance configuration ...
toor@debian8:/home/tmp/opengrok-0.12.1/bin$

Once above command finishes without errors(e.g. SEVERE: Failed to send configuration to localhost:2424 ),

公式インストール手順にこういう記述がある。
ここではまる人が多いのかもしれない。

類似ツールとの比較

他の類似ツールではen/LXR Projectが有名。
LXR linux等、Linuxカーネルで使われることが多い。
LXR Cross Referencer を試してみた - harry’s memorandum

公式の類似ツールとの比較。
Comparison with Similar Tools · OpenGrok/OpenGrok Wiki

これによると、OpenGrokは以下のような特徴がある。

  • 優位
    • History Search
    • query syntax like AND, OR, field
    • Integration with Eclipse
  • 弱点
    • Integration with emacs/vim

Eclipse plugin

GrokClipseというEclipseとの連携プラグインが公開されている。
GrokClipse | Eclipse Plugins, Bundles and Products - Eclipse Marketplace

インストールを試みたが、失敗した。
ネット上でも情報がほとんどない。