GNU GLOBAL(gtags)ソースコードタグシステムの使い方



GNU GLOBAL(gtags)は、ソースコードのタグジャンプです。簡単に複数のソース中から関数や、変数の定義元/参照元を見つけ、その箇所に移動することができます。

ctags、etags(cygwin や Linux に大抵標準で含まれています)と同じ働きをしますが、gtags はさらに強力な機能を持っています。大量の他人の書いたソースを読むプログラマには、必須だと思います。

スポンサードリンク

GNU GLOBAL(gtags) の特徴

gtags は、次のような特徴を持っています。

サイトの DownLoad のページより「global-x.x.x.tar.gz」をダウンロードしてください。

GNU GLOBAL(gtags) のインストール方法

通常のインストールと同様です。cygwin 上でも、最近のものを利用する場合は問題ありません。

% tar zxvf global-x.x.x.tar.gz(もしくは gzip -dc global-x.x.x.tar.gz | tar xv -)
% cd global-x.x.x
% ./configure (--prefix=任意の場所)
% make
% make install

なお、Cygwin の場合は、+Devel から、gcc, make を予めインストールしておいて下さい。

また、Cygwin の /usr/local/bin(例: C:\cygwin\usr\local\bin) にPATHを通しましょう。

「multiple target patterns」というエラーが発生した場合

【日本語】

make  all-recursive
make[1]: ディレクトリ `/home/global-6.5.2' に入ります
Making all in libglibc
make[2]: ディレクトリ `/home/global-6.5.2/libglibc' に入ります
.deps/getopt.Po:1: *** 複数のターゲットパターンです.  中止.
make[2]: ディレクトリ `/home/global-6.5.2/libglibc' から出ます
Makefile:515: recipe for target `all-recursive' failed

【英語】

make  all-recursive
make[1]: Entering directory `/home/global-6.5.2'
Making all in libglibc
make[2]: Entering directory `/home/global-6.5.2/libglibc'
.deps/getopt.Po:1: *** multiple target patterns.  Stop.
make[2]: Leaving directory `/home/global-6.5.2/libglibc'
Makefile:515: recipe for target `all-recursive' failed

上記エラーが出る場合は、gccが生成した依存ファイルに含まれるWindows形式のパスを、UNIX形式のパスに変換する必要があります。

例)c:\users\hoge\desktop\tool → /app/mingw/tdm/lib/gcc/

スクリプトで一括置換する例です。

% find . -name *.Po | xargs sed -i "s/c\\:\\\users\\\hoge\\\desktop\\\tool\\\gnupack_devel-11.00\\\app\\\mingw\\\tdm\\\bin\\\..\\//\\/app\\/mingw\\/tdm\\//g"

「gtags.el」の移動(emacsを利用する場合)

任意のフォルダに global-x.x.x ディレクトリ内にある 「gtags.el」 をコピーしてください。

※ 「.emacs」に以下の一文を追加してください。(下記は「~/lisp」に「gtags.el」をコピーした場合です)

;; load-pathに追加
(setq load-path (cons "~/lisp" load-path))

Meadowを利用する場合は、C:\Meadow\site-lisp ディレクトリに global-x.x.x ディレクトリ内にある 「gtags.el」 をコピーしてください。

「gtags.vim」の移動(vi / vim を利用する場合)

「$HOME/.vim/plugin」フォルダに global-x.x.x ディレクトリ内にある 「gtags.vim」 をコピーしてください。

cp /usr/local/share/gtags/gtags.vim $HOME/.vim/plugin 

使用方法

プログラムソースのあるトップのディレクトリで、次のコマンドを入力します。

gtags -v

ファイル数によっては、かなりの時間を要します。

しばらくすると、「GPATH」「GRTAGS」「GTAGS」のファイルが作成されます。

GTAGS オブジェクト定義のデータベース
GRTAGSオブジェクト参照のデータベース
GPATH パス名のデータベース

実際に利用したファイルサイズは、次のようなものです(ファイル数 152個)。

$ ls -lh
total 4.0M
-rw-r--r--   1 hoge なし  32K May  1 02:07 GPATH
-rw-r--r--   1 hoge なし 2.6M May  1 02:07 GRTAGS
-rw-r--r--   1 hoge なし 736K May  1 02:07 GSYMS
-rw-r--r--   1 hoge なし 552K May  1 02:07 GTAGS
drwxr-xr-x+ 12 hoge なし    0 May  1 01:59 global-4.8.5/

また、HTML化は次のコマンドで可能です。

htags -saF

ただし、非常に大きなファイルとなり、時間もかかります。

スポンサードリンク

emacs/Meadow 上での使用方法

emacs/Meadow を起動して、次のコマンドで gtags モードに変更できます。

M-x gtags-mode

このとき、「.emacs」に以下を追加しておけば、便利になります。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GNU GLOBAL(gtags)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(autoload 'gtags-mode "gtags" "" t)
(setq gtags-mode-hook
      '(lambda ()
         (local-set-key "\M-t" 'gtags-find-tag)
         (local-set-key "\M-r" 'gtags-find-rtag)
         (local-set-key "\M-s" 'gtags-find-symbol)
         (local-set-key "\C-t" 'gtags-pop-stack)
         ))

使い方は、ジャンプしたい関数上で、上記のコマンドを入力します。

なお、Cygwin+Meadow環境では、正しくソースの位置を表示してくれない問題があります。

次のように表示され、正しいソースのある場所を誤ってしまいます。

Use C-u M-x make-directory RET RET to create directory and its parents

Cygwin パスを理解させたいのであれば、次のElisp を利用して下さい。

ダウンロードした「cygwin-mount.el」は「C:\Meadow\site-lisp」に置きましょう。

また、「.emacs」に以下を追加しておきます。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; cygwin-mount
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(when (and (featurep 'meadow) (locate-library "cygwin-mount"))
  (require 'cygwin-mount)
  (cygwin-mount-activate))

vim 上での使用方法

:Gtags main

で global -t main を実行し、結果をエラーウィンドウで開きます。

'-r' で参照元一覧をエラーウィンドウに表示します。

:Gtags -r func1

main.c 内のオブジェクト一覧は次のようなコマンドを入力します。

:Gtags -f main.c               <- locate objects in main.c

% や # も使えます。

:Gtags -f %                    <- locate objects in main.c

「$HOME/.vimrc」に以下を追加しておけば、便利になります。

"----------------------------------------------------
" GNU GLOBAL(gtags)
"----------------------------------------------------
nmap <C-q> <C-w><C-w><C-w>q
nmap <C-g> :Gtags -g
nmap <C-l> :Gtags -f %<CR>
nmap <C-j> :Gtags <C-r><C-w><CR>
nmap <C-k> :Gtags -r <C-r><C-w><CR>
nmap <C-n> :cn<CR>
nmap <C-p> :cp<CR>

コマンドライン 上での使用方法

例えば、「grep」関数が、どのファイルで定義されているかは、次のように調べます。

$ global grep
global-4.8.5/global/global.c        # grep() は global.c で定義されています

'-t' オプションで ctags フォーマット表示

$ global -t  help
help    global-4.8.5/global/global.c    103
help    global-4.8.5/gozilla/gozilla.c  76
help    global-4.8.5/gtags-parser/gctags.c      132
help    global-4.8.5/gtags/gtags.c      110
help    global-4.8.5/htags/htags.c      256

'-r' オプションで参照元表示。help() は 次のファイルで参照されています。

$ global -r  help
global-4.8.5/global/global.c
global-4.8.5/gozilla/gozilla.c
global-4.8.5/gtags-parser/gctags.c
global-4.8.5/gtags/gtags.c
global-4.8.5/htags/htags.c

'-x' オプションで詳細を表示します。

$ global -x  grep
grep              755 global-4.8.5/global/global.c grep(pattern)

'-a' オプションで絶対パスを表示します。

$ global -a grep
/home/hoge/global-4.8.5/global/global.c

gtags: GPATH is corrupted というエラーに遭遇した場合

global を最新に変更してください。

オススメ書籍

人気の高い書籍および参考文献を紹介します。

スポンサードリンク

スポンサードリンク