LIVE SIMPLY

データ活用組織のマネジメントを行いつつコーチング、本など学んだことを書くblog

【Linux】GNU GLOBAL(gtags)

今回はかなり技術よりの内容。。
今日、AndroidC言語の本を身に新宿のジュンク堂行ったら、面白そうな本がどんどん見つかってスイッチが入ってしまった。。


GNU GLOBALはソースコードを解析し,関数や変数をリンク付けして交互に参照することを可能にしてくれるツール。

対応環境としてはシェルのコマンドラインやbash,vi,Emacs,など数多い。

伊藤直也さんのプレゼンを見て使ってみようと思い導入。

GNU GLOBALのインストール
$ wget ftp://ftp.gnu.org/pub/gnu/global/global-5.7.6.tar.gz
$ tar xvfz global-5.7.6.tar.gz
$ mv global-5.7.6 /usr/local/src
$ cd /usr/local/src/global-5.7.6
$ ./configure
$ make
# make install

■gtagsの導入(vi用)
・gtags.vimの移動
$ mkdir ~/.vim
$ cp /usr/local/src/global-5.7.6/gtags.vim $HOME/.vim/plugin

・準備
gtags コマンドを使ってソースコードを解析
プログラムソースのあるトップのディレクトリで、次のコマンドを入力.
$ cd /usr/src/kernels/2.6.18-53.el5-x86_64
$ gtags -v

すると、下記のファイルが生成される。

$ file G*
GPATH: Berkeley DB 1.85/1.86 (Btree, version 3, native byte-order)
GRTAGS: Berkeley DB 1.85/1.86 (Btree, version 3, native byte-order)
GSYMS: Berkeley DB 1.85/1.86 (Btree, version 3, native byte-order)
GTAGS: Berkeley DB 1.85/1.86 (Btree, version 3, native byte-order)

GTAGS オブジェクト定義のデータベース
GRTAGS オブジェクト参照のデータベース
GSYMS その他シンボルのデータベース
GPATH パス名のデータベース

らしい。

「これでいつでもソースコードから好きな関数を調べられる。」

■利用
 ?ソースに含まれている関数一覧を調べる
 $ global -f sched.h | head -5
_LINUX_SCHED_H 2 sched.h #define _LINUX_SCHED_H
CSIGNAL 9 sched.h #define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
CLONE_VM 10 sched.h #define CLONE_VM 0x00000100 /* set if VM shared between processes */
CLONE_FS 11 sched.h #define CLONE_FS 0x00000200 /* set if fs info shared between processes */
CLONE_FILES 12 sched.h #define CLONE_FILES 0x00000400 /* set if open files shared between processes */



?関数の定義されているソース一覧を調べる
$ global down
../asm-i386/semaphore.h
../asm-x86_64/semaphore.h
../asm/semaphore.h

これは便利!

  • x オプションを付ければ詳細情報もゲットできる

$ global -x down
down 97 ../asm-i386/semaphore.h static inline void down(struct semaphore * sem)
down 103 ../asm-x86_64/semaphore.h static inline void down(struct semaphore * sem)
down 103 ../asm/semaphore.h static inline void down(struct semaphore * sem)

?関数の定義されているソースを表示
$ global -r down
netfilter/nfnetlink.h
smb_fs_sb.h
usb.h
../net/bluetooth/hci_core.h
../net/dn_dev.h
../xen/xenbus.h

?ソースコード全体を grep する
例)downという文字が含まれているソースをgrepする。

$ global -g down | head -5
../acpi/acconfig.h
../acpi/acglobal.h
../acpi/aclocal.h
../acpi/acparser.h
../acpi/acpiosxf.h


すげー便利ツールだなぁ・・・・
あとはテキストエディタとの連携だな。。


■参考記事
・まちゅダイアリー ☆詳しい☆

・777sushi @ ウィキ

(最新verのtarだとなぜかMakefileが生成されず、makeが実行できなかった。。)

GNU GLOBAL ソースコードタグシステム