スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[探] GNU global

ソースコードを読まないとならない時間が増えた。
pythonとかruby。C/C++もか。

で、やっぱりそのままなんの工夫もなく読んでいると
効率が悪いので、何かいいものないかと探してみる。

あった。GNU Global
こいつなら、LLにも使えるし、よさげ。


■参考URL

GNU GLOBAL(gtags) ソースコードタグシステムの使い方
Go, Ruby, PythonでGNU GLOBAL(gtags)+α
http://www.gnu.org/software/global/
GNU Globalダウンロード元
2015/5/21時点最新版(6.4)
ftpサイト
global-pygments-plugin
exuberant-ctags



■手順
以下、導入手順。
入れる場所はどこでもよかったので、とりあえずvagrantでいれた
ubuntu 14.04 (trusty) 64bitのVMの中に導入してみる。

0.まず、素でglobal入れると何が入るか確認
たぶん古いんですよねえ。。ためしに入れてみる。

pygmentsによる拡張が取り込まれたのはglobal 6.3.2
から先なので、これ未満のバージョンだとダメ。

$ sudo apt-get update
$ sudo apt-get install global
$ sudo dpkg -l global
 → global 5.7.1-2 amd64 Source code search and browse(以下略

はい、アウトですね。ソースコードもってきて入れましょう。

1.関連パッケージのインストール
入れておかないとconfigureおよびLLでの使用がうまくいかない。
一応、pythonが入っていることも確認。なかったらaptでインストール。

$ sudo apt-get install ncurses-dev
$ sudo apt-get install exuberant-ctags
$ which python
/usr/bin/python
$ python --version
Python 2.7.6
$


2.globalのインストール
ソースコードを取得してきて、最新版を入れる。


$ wget http://tamacom.com/global/global-6.4.tar.gz
$ tar zxvf global-6.4.tar.gz
$ cd global-6.4
$ ./configure --help
 → オプション確認。
$ ./configure
$ make
$ sudo make install


3.設定の確認、修正
設定を修正してしまう前に一度バックアップとってから修正するのがよいかと。
gtagsコマンドをあとで実行する際に、コンフィグファイルのパス指定もできるので
とっておいて損はない。というか、とっとけ。


$ ls -l /usr/local/share/gtags/gtags.conf
 → 存在していること
$ grep pygments-parser.la /usr/local/share/gtags/gtags.conf
 → パーサーのパスを確認
$ ls -l /usr/local/lib/gtags/pygments-parser.la
 → 上記で検出されたパスのファイルが存在するか確認する。
 なかったら、findなどで上記pygments-parser.laというファイルの位置を探し、
 コンフィグにあるlaファイルのパスを実在するファイルパスに直す


4.pipのインストール
以下により、pip-6.1.1, seruptools-16.0を入れた。

$ curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python


5.pygmentsのインストール
以下により、pygmentsをバージョン指定でいれる。
最新(2.0.2)でも動くのかもだが、global-pygments-plugin
によるとテストされているのはPygments-1.6だったので揃えた。


$ sudo pip install pygments==1.6
$ which pygmentize
/usr/local/bin/pygmentize
 → コマンドが存在すること


何も考えないで入れた場合、pygments 2.0.2が入る。
pip listなどで確認して、もし以後の作業でpygmentsのバージョンに
依存した問題が仮に発生するのであれば
sudo pip uninstall pygments
で一度アンインストールしてからpygmentsをバージョン指定で
入れなおせばいいと思う。とりあえず1.6入れて先に進んでみる。

6.pygmentsパーサーのpythonパスの確認と修正

$ sudo find / -name pygments_parser.py
/usr/local/share/gtags/script/pygments_parser.py
$ head -1 /usr/local/share/gtags/script/pygments_parser.py
#!/usr/bin/python
$ which python
/usr/bin/python
 → もし違っていたら、pythonインタプリタの正しいパスをいれるか、
    pygments_parser.pyの1行目を/usr/bin/env pythonなどにしてしまう


7.サンプルプログラム

$ cat hello.py
#!/usr/bin/python
# hello.py

def hello(s):
print "Hello, %s." % s

if __name__ == '__main__':
hello("world")

#end

$ python hello.py
Hello, world.


8.gtagsコマンドによる解析、タグづけ、単体動作確認
設定ファイルを指定して、カレントディレクトリのソースファイルの中身を解析。
パースの結果、いくつかファイルができていることを確認する。


$ gtags --gtagsconf=/usr/local/share/gtags/gtags.conf --gtagslabel=pygments --debug .
 → だらだらと出力。このディレクトリ配下のどのファイルは
   何の言語と認識されてどのパーサが適用されたのか云々が
   出力されている
$ ls -l
→ カレントディレクトリ . にあるhello.pyをふくむ全ファイルを解析して
  ソースコードと認識されたファイルにあるタグが生成されたことを確認する
$ global -f hello.py
hello  4 hello.py  def hello(s):
$
 → 動作確認。globalコマンドで結果出力されること。


最後、動作確認のためのglobalコマンドで失敗していた場合
(何も出力されないなど)は、パッケージが足りてないかも。

exuberant-ctagsを入れ忘れた状態でGNU globalのconfigure, makeを
したときは、パース後にglobal -f hello.pyしても何も出力がなかった。。

9.vimからの利用

$ cd
$ mkdir -p .vim/plugin
$ cp /usr/local/share/gtags/gtags.vim .vim/plugin/
$ vi


ちなみにどこかデータ移行先のvimでgtags.vimを使う場合、
gtags.vimの中からglobalコマンドを呼んでGTAGSなどのファイル
をパースしているので、移行先にglobalコマンドもないとダメだし
所定のディレクトリにGTAGS, GRTAGS, GPATHがないと
うまく機能しない。

汎用性考えると、htmlの検索フォームなしで出力するのが
おそらく最強(最近のandroid端末は画面も大きくてそこそこ
ブラウザが使える)なんだが、検索フォームないとブラウザ
の貧弱な検索機能を使うので、やっぱり検索フォームがあると
ないでは読む効率が違うかと思われます。。仕方ないけど。



■おまけ
その他、気になったソースコード読破用ツール

ack
cscope
CodeReadingWiki
cflow
pycco

あと、nexus7とかタブレットでコード読むことを考えると以下も。
rbox




■関連エントリ

[標] 技術系メモの分類(2015/05/24)
関連記事
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

kr2

Author:kr2
ネコと音楽が好き。
CD紹介、技術ネタ
などの雑記帳。

カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
最近の記事
最近のコメント
最近のトラックバック
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。