2013年8月30日金曜日

GNU Globalで対応してない言語のコードを解析する.


はじめに




前回の記事 で紹介したGNU Globalを使ってブラウザでコードを読む方法は非常に便利.

しかし,このGNU Global,対応言語はC, C++, Yacc, Java, PHP4しかない

そう言われても,他の言語で書かれたソースコードもブラウザで読みたい時はでてくる.

というわけで,GNU GlobalでGNU Globalで対応していない言語もブラウザで読めるようにする方法をここに書いておく.




概要を一文で書いてしまうと,GNU Globalよりも多くの言語に対応し(そのかわりに機能が少ない)Ctagsを用い,TAGSファイルを生成し,これをhtagsにかける.






注意点




Ctagsを用いるので,Globalを用いて解析したのと同じように,とはいかない.

具体的には,ある関数や変数が参照されている場所の情報(Reference)は表示できない.

なぜなら,CtagsはGlobalと違い,Referenceを探す機能が存在しないからである.

また,htagsの結果表示されるhtmlも,関数や変数の定義にリンクは貼られいない.

結局,htmlで表示しても,Syntax highlightもリンクもないソースコードが表示されるだけである.




しかし,grepやdefinitionの検索には引っかかるようになるため,何も使わないよりは読みやすくなる.

対応言語の解析に比べれば,機能は多少劣るものの,同じ環境でより多くの言語のソースコードを表示できる,という点では便利である.






方法





  1. ctagsをインストール

    Linux MintやUbuntuなら以下のコマンドでインストール.




    sudo apt-get install ctags



  2. gtagsの設定ファイルのテンプレをコピー

    apt-get でGNU Globalをインストールした人は /usr/share/doc/global/examples/gtags.conf を適当なファイルにコピー.

    これを編集して,gtagsコマンドを実行するときにオプションで指定する.


  3. 設定ファイルを編集.

    ここでは,pythonのソースコードをctagsで解析するように編集.




    ctags-exuberant|Exuberant Ctags|ctags by Darren Hiebert:\
    :tc=common:\
    :suffixes=s,a,sa,asm,C,H,cpp,cxx,hxx,hpp,cc,c,h,y:\
    :extractmethod:\
    :GTAGS=/usr/local/bin/ctags-exuberant -xu %s | perl -ne '\
    if (/^operator \\S+\\s+function\\s/) { s/^operator //; }\
    ($name, $type, $no, $path, $line) = split(/[ \\t]+/, $_, 5);\
    printf(STDOUT "%-16s %4d %-16s %s", $name, $no, $path, $line);':


    のように書かれている箇所のうち,2箇所を変更する.


    1. :suffixes の右辺に py を追加.

      ここに,他の拡張子を設定すれば,その拡張子に対応する言語のソースコードも解析してくれる(はず).





    2. :GTAGS の右辺でctagsの実行ファイルのパスを指定する部分を変更.

      apt-get でインストールすると,デフォルトで書かれているパスとは異なるところにインストールされる.

      which ctags コマンドで実行ファイルのパスを確認し,指定する.








  4. gtagsの実行

    以下のようにオプションを指定し,gtagsを実行する.




    $ gtags --gtagsconf=<編集した設定ファイルのパス> --gtagslabel=ctags-exuberant


    --gtagsconf には先程編集した設定ファイルを指定する.







あとは,前回の記事 と同様にhtagsを実行して,htmlファイルを生成すればよい.









おわりに




とりあえず,非対応言語のソースコードもgtags, htagsを用いてhtmlページで表示することが可能になった.

しかし,やはり非対応言語の解析は貧弱であることは否めまい.

非対応言語が主なソースツリーを読む場合は,無理してGNU Global を使うよりも IDEを使ったほうがいいだろう.




この方法が有用なのは,主にCやJavaで書かれたソースツリーの中に少し多言語も混じってる,という場合だと思う.







--
My Emacs Files At GitHub