HighSierraにOpenGrok環境を作ってみた(2018/11/4)

# はじめに・・・
最近規模が大きめなソースコード読むことが増えてきたため，自宅のMacbook ProにOpenGrokを入れてみたという記事です．
会社でもガッツリ使っていて、コードリーディングが非常に楽になります．
皆さん、是非使ってみては如何でしょうか？

![fig3.png](https://qiita-image-store.s3.amazonaws.com/0/130155/aa202d64-c346-8db9-ee4a-e4a7f149cc5f.png)

# 開発環境
MacOS High Sierra 10.13.2

OpenGrok 1.1-rc70

Homebrew

Python  3.6.0

JDK 11

Tomcat 8（最新版でも問題ないと思うが，諸事情に8を使用）

Ctags

好きなブラウザ（私はChromeを使用）

# 作業ディレクトリ
今回作業を行うディレクトリは下記の通りです．
```
WORK_DIR=~/Documents/Qiita/OpenGrok
```

# 事前準備
## 環境構築
必要なモノをインストールします．（Homebrewはインストール済みを想定しています．）

```
# Tomcatのインストール
$brew install tomcat@8

# Ctagsのインストール
$brew install --HEAD universal-ctags/universal-ctags/universal-ctags
```

## OpenGrokの準備
https://github.com/oracle/opengrok/releases
上記URLから，今回は1.1-rc70のバイナリターボール（opengrok-1.1-rc70.tar.gz）を取ってきます．
※ソースコードではないのでご注意
取得したopengrok-1.1-rc70.tar.gzを作業ディレクトリに展開します．

```
# ダウンロード先に移動
$cd ${opengrok-1.1-rc70.tar.gzのダウンロードされたディレクトリ}

# WORK_DIRに展開
$tar xfvz opengrok-1.1-rc70.tar.gz -C $WORK_DIR
```

# OpenGrokの設定
## OpenGrok-Toolのビルド
OpenGrokは処理を行うために様々なコマンドを用意しています．
今回はそのコマンドのPythonラッパーを使用します．
具体的な手順は，OpenGrokが用意してくれているドキュメントを参照することをオススメします．
ここでは必要最低限の準備しません．

```
# 上で展開したOpenGrokのディレクトリに入る
$cd $WORK_DIR opengrok-1.1-rc70

# toolsの中に入り，opengrok-tools.tar.gzを展開し，その中に入る
$tar xfvz opengrok-tools.tar.gz
$cd opengrok-tools-1.1rc70

# ここからPythonの処理に入るので，仮想環境を準備
$python3 -m venv env
$. env/bin/activate

# ビルドに必要なものをインストールする．
$python -m pip install -r opengrok_tools.egg-info/requires.txt

# ビルドとインストール
$python setup.py develop
$export PYTHONPATH=`pwd`/src/main/python:$PYTHONPATH
$python setup.py install

# インストールされたか確認
$opengrok-groups
usage: opengrok-groups [-h] [-D] [-j JAVA] [-J JAVA_OPTS] [-e ENVIRONMENT]
                       (-a JAR | -c CLASSPATH)
                       options [options ...]
opengrok-groups: error: the following arguments are required: options
$opengrok-sync                                                                                                                      ✘ 2
usage: opengrok-sync [-h] [-w WORKERS]
                     [-d DIRECTORY | -P [PROJECTS [PROJECTS ...]]] [-I] [-D]
                     [-i [IGNORE_ERRORS [IGNORE_ERRORS ...]]] -c CONFIG
                     [-U URI]
opengrok-sync: error: the following arguments are required: -c/--config

```

これでOpenGrokのツールをインストールできました．

## デプロイ

ビルドが済んだのでTomcatへのデプロイを行います．
tomcatのバージョンによって，ファイルパスが変わるので注意してください．（下記は私の環境の場合です）

```
# Tomcatのwebappに.warファイルをデプロイする．
$opengrok-deploy $WORK_DIR/opengrok-tools-1.1rc70/lib/source.war /usr/local/Cellar/tomcat@8/8.5.34/libexec/webapps

```

## コードリーディングするソースコードの準備
OpenGrokで見るソースコードの準備を行います．
適当なソースコードを今回は準備します．

```
# 適当なソースコードを準備
$ll -R  NMF_for_cpp-master
total 80
-rwxr-xr-x@ 1 t_sumida  staff   3.8K  3  2  2018 Array2D.hpp
-rwxr-xr-x@ 1 t_sumida  staff   214B  3  2  2018 CMakeLists.txt
-rwxr-xr-x@ 1 t_sumida  staff   6.9K  3  2  2018 NMF.hpp
-rwxr-xr-x@ 1 t_sumida  staff   904B  3  2  2018 README.md
-rwxr-xr-x@ 1 t_sumida  staff    12K  3  2  2018 Separator.h
-rwxr-xr-x@ 1 t_sumida  staff   1.1K  3  2  2018 main.cpp

# OpenGrokで使うディレクトリを作成する．
$sudo mkdir /var/opengrok/src
$sudo mkdir /var/opengrok/data
$sudo mkdir /var/opengrok/etc

```
# インデキシング
最後にインデキシングを行い，Tomcatを起動していきます．

```
# ソースコードを/var/opengrok/srcにコピーする
$cp -r NMF_for_cpp-master /var/opengrok/src

# インデキシングを実行（規模によっては時間がかかる）
sudo opengrok-indexer  -a $WORK_DIR/opengrok-1.1-rc70/lib/opengrok.jar -- \
    -s /var/opengrok/src -d /var/opengrok/data -H -P -S -G \
-W /var/opengrok/etc/configuration.xml -U http://localhost:8080

# Tomcatを起動
$catalina start
$catalina run
```

# 使ってみる
Tomcatが起動した後に，
http://localhost:8080/source/
をブラウザで開くと，下のような画面になっている．
![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/130155/e5a4d686-3d9a-1998-6c3f-b13270889cff.png)


使い方に関しては，チートシートなどがその辺に転がってるので参照してください．
「この関数がどこで定義されていて，どこで使われているのか？」
「この定義を色付けしておきたい！」
など様々なことが出来ますよ．

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/130155/47703e9d-4c71-fe0a-61ad-014fef5be3f4.png)
![fig3.png](https://qiita-image-store.s3.amazonaws.com/0/130155/aa202d64-c346-8db9-ee4a-e4a7f149cc5f.png)


# 運用
今後他にも見たいソースコードがあるなら，インデキシングを毎回行ってください．
CやC++，Java, Pythonに対応しているので色々試してみてください．
※インデキシング時のコマンドを少し変える必要があると思いますが・・・


# 最後に・・・
会社で使ってて便利だと思ったので，自宅のMacにもOpenGrokを入れてみました．
研究室の古いソースコードとか，プロジェクト単位で登録すれば色々便利かもしれないです．