Top/Prog/TagSystem

目次

lctags

環境構築

  1. コードの取得
    $ git clone https://github.com/ifritJP/lctags.git
  2. 追加パッケージのインストール
    • swig (ビルドに必要)
    • liblua50-dev
    • lua5.3
    • luajit
    • liblua5.3-dev
    • libssl-dev
  3. 他モジュールのコードを取得・展開
    $ cd lctags/external
    $ curl http://lua.sqlite.org/index.cgi/zip/lsqlite3_fsl09x.zip?uuid=fsl_9x -o luasqlite3.zip
    $ unzip luasqlite3.zip
    $ cp -Rfdp lsqlite3_fsl09x/ luasqlite3/
    $ curl https://www.lua.org/ftp/lua-5.3.4.tar.gz -o lua/lua-5.3.4/src/lua.tar.gz
    $ tar -xvzf lua.tar.gz
    $ mv lua-5.3.4 lua/
  4. ビルド
    1. src/makefile の修正
      diff --git a/src/makefile b/src/makefile
      index d3dde80..9a92a49 100644
      --- a/src/makefile
      +++ b/src/makefile
      @@ -1,128 +1,152 @@
       NDIR=$(shell pwd)
       
      -INST_DIR=/usr/local/bin
      +INST_DIR := /usr/local/bin
       
      -PROXY=
      +PROXY :=
       
      -SWIG=swig
      +SWIG := swig
       
       INSTALL=/usr/bin/install -c
       
      -SO=so
      -## cygwin
      -#SO=dll
      +LUA_VER := 5.3
      +# LUA_VER := 5.2
      +# LUA_VER := 5.1
       
      -####### customize Lua environment ######
      +LUAJIT_VER := 2.0.4
      +# LUAJIT_VER := $(shell luajit -v | awk '{print $2;}')
      +
      +CLANG_VER := 7
      +# CLANG_VER=3.8
      +
      +UNAME := $(shell uname -a)
      +ifeq ($(filter Darwin,$(UNAME)),Darwin)
      +OS := mac
      +else
      +ifeq ($(filter Linux,$(UNAME)),Linux)
      +OS := linux
      +else
      +ifeq ($(filter MINGW,$(UNAME)),Cygwin)
      +OS := cygwin
      +else
      +$(info Your platform $(UNAME) is not supported.)
      +endif
      +endif
      +endif
       
      +ifeq ($(OS),cygwin)
       ## cygwin
      -# LUA_COMMAND=lua
      -# LUA_INC=/usr/include
      -# LUA_LDFLAGS=
      -# LUA_SO=-llua
      +SO := dll
      +else
      +SO := so
      +endif
       
      -# LUA_COMMAND=lua5.1
      -# LUA_INC=/usr/include/lua5.1
      -# LUA_LDFLAGS=
      -# LUA_SO=-llua5.1
      +####### customize Lua environment ######
      +ifeq ($(OS),cygwin)
      +## cygwin
      +LUA_COMMAND := lua
      +LUA_INC     := /usr/include
      +LUA_LDFLAGS :=
      +LUA_SO      := -llua
       
      -LUA_COMMAND=lua5.3
      -LUA_INC=/usr/include/lua5.3
      -LUA_LDFLAGS=
      -LUA_SO=-llua5.3
      +else
      +LUA_COMMAND := lua$(LUA_VER)
      +LUA_INC     := /usr/include/lua$(LUA_VER)
      +LUA_LDFLAGS :=
      +LUA_SO      := -llua$(LUA_VER)
      +endif
       
      -# LUA_COMMAND=luajit
      -# LUA_INC=/usr/include/luajit-2.0
      -# LUA_LDFLAGS=
      -# LUA_SO=-lluajit-5.1
      +# LUA_COMMAND  := luajit
      +# LUA_INC      := /usr/include/luajit-2.0
      +# LUA_LDFLAGS  := 
      +# LUA_SO       := -lluajit-5.1
       
      -# LUA_COMMAND=./clanglua
      -# LUA_CFLAGS=-fPIC -DLUA_COMPAT_5_1 -DLUA_COMPAT_5_2 -I$(NDIR)/$(LUA_DIR)
      -# LUA_DIR=../external/lua/lua-5.3.4/src
      -# LUA_INC=$(NDIR)/$(LUA_DIR)
      -# LUA_LIB=$(LUA_DIR)/liblua.a
      -# LUA_INST_DIR=/usr/local/bin
      -# LUA_LIB_DIR=/usr/local/lib/lua/5.3
      -# LUA_LDFLAGS=-lncursesw
      +# LUA_COMMAND  := ./clanglua
      +# LUA_CFLAGS   := -fPIC -DLUA_COMPAT_5_1 -DLUA_COMPAT_5_2 -I$(NDIR)/$(LUA_DIR)
      +# LUA_DIR      := ../external/lua/lua-5.3.4/src
      +# LUA_INC      := $(NDIR)/$(LUA_DIR)
      +# LUA_LIB      := $(LUA_DIR)/liblua.a
      +# LUA_INST_DIR := /usr/local/bin
      +# LUA_LIB_DIR  := /usr/local/lib/lua/5.3
      +# LUA_LDFLAGS  := -lncursesw
       
      -TEST_LUA_DIR=../external/lua/lua-5.3.4/src
      +TEST_LUA_DIR := ../external/lua/lua-5.3.4/src
       
      -LUA_URL="https://www.lua.org/ftp/lua-5.3.4.tar.gz"
      +LUA_URL := "https://www.lua.org/ftp/lua-5.3.4.tar.gz"
       
      -LUA_COMMAND_FULL:=$(shell python -c 'import os; print( os.path.abspath( "$(shell which $(LUA_COMMAND))" ) );' )
      +LUA_COMMAND_FULL := $(shell python -c 'import os; print( os.path.abspath( "$(shell which $(LUA_COMMAND))" ) );' )
       
       ####### customize libclang environment ######
       
      +ifeq ($(OS),cygwin)
       ## cygwin
      -# LIBCLANG_INC=/usr/include
      -# LIBCLANG_LIB=/lib
      -# LIBCLANG_STD_INC=/lib/clang/5.0.1/include
      -
      -
      -CLANG_VER=3.8
      -LIBCLANG_INC=/usr/lib/llvm-$(CLANG_VER)/include
      -LIBCLANG_LIB=/usr/lib/llvm-$(CLANG_VER)/lib
      -LIBCLANG_STD_INC=$(shell find /usr/lib/llvm-$(CLANG_VER)/lib/clang/ -maxdepth 1 -mindepth 1 | head -n 1)
      +LIBCLANG_INC     := /usr/include
      +LIBCLANG_LIB     := /lib
      +LIBCLANG_STD_INC := /lib/clang/5.0.1/include
       
      -# LIBCLANG_DIR=/proj/next/clang/r34-final
      -# LIBCLANG_INC=../external/clang/r390/llvm/tools/clang/include
      -# LIBCLANG_STD_INC=../external/clang/r390/build/lib/clang/3.9.0/include
      -# LIBCLANG_LIB=/usr/lib/llvm-$(CLANG_VER)/lib
      +else
      +LIBCLANG_INC     := /usr/lib/llvm-$(CLANG_VER)/include
      +LIBCLANG_LIB     := /usr/lib/llvm-$(CLANG_VER)/lib
      +LIBCLANG_STD_INC := $(shell find /usr/lib/llvm-$(CLANG_VER)/lib/clang/ -maxdepth 1 -mindepth 1 | head -n 1)
       
      -# LIBCLANG_SO=-lclang
      +# LIBCLANG_DIR     := /proj/next/clang/r34-final
      +# LIBCLANG_INC     := ../external/clang/r390/llvm/tools/clang/include
      +# LIBCLANG_STD_INC := ../external/clang/r390/build/lib/clang/3.9.0/include
      +# LIBCLANG_LIB     := /usr/lib/llvm-$(CLANG_VER)/lib
      +endif
       
      -LIBCLANG_SO=-lclang
      +LIBCLANG_SO := -lclang
       
       ####### customize luasqlite3 environment ######
       # If you don't have luasqlite3, you must customize this setting.
       # http://lua.sqlite.org/index.cgi/index
       
      -LUASQLITE3_WORKDIR=../external/luasqlite3
      -LUASQLITE3_DIR=$(LUASQLITE3_WORKDIR)/lsqlite3_fsl09x
      -#USE_BDB_SQLITE=y
      +LUASQLITE3_WORKDIR := ../external/luasqlite3
      +LUASQLITE3_DIR     := $(LUASQLITE3_WORKDIR)/lsqlite3_fsl09x
      +#USE_BDB_SQLITE    := y
       
      -LUASQLITE3_URL="http://lua.sqlite.org/index.cgi/zip/lsqlite3_fsl09x.zip?uuid=fsl_9x"
      +LUASQLITE3_URL := "http://lua.sqlite.org/index.cgi/zip/lsqlite3_fsl09x.zip?uuid=fsl_9x"
       
       
       
       ####### make rules ######
       
      -LUA_LIB_DIR=$(shell echo $(LUA_DIR_LIB) | $(LUA_COMMAND) )
      -LUA_MOD_DIR=$(shell echo $(LUA_DIR_SCRIPT) | $(LUA_COMMAND) )
      +LUA_LIB_DIR := $(shell echo $(LUA_DIR_LIB) | $(LUA_COMMAND) )
      +LUA_MOD_DIR := $(shell echo $(LUA_DIR_SCRIPT) | $(LUA_COMMAND) )
       
      -LCTAGS_LOG=4
      -JOBS=3
      +LCTAGS_LOG := 4
      +JOBS       := 3
       
       ifdef LCTAGS_PROF
      -LCTAGS_PROF_OP = --lctags-prof
      +LCTAGS_PROF_OP  :=  --lctags-prof
       endif
       
      -LCTAGS_LOCKLOG=y
      +LCTAGS_LOCKLOG := y
       ifdef LCTAGS_LOCKLOG
      -LOCKLOG = --lctags-lockLog
      +LOCKLOG  :=  --lctags-lockLog
       endif
       
       ifdef LCTAGS_SERVER_ON
      -LCTAGS_SERVER=--lctags-srv
      +LCTAGS_SERVER := --lctags-srv
       endif
       
      -LUA_LIB:=$(addprefix $(NDIR)/,$(LUA_LIB))
      +LUA_LIB    := $(addprefix $(NDIR)/,$(LUA_LIB))
       
      -LCTAGS_LUA=lctags/lctags.lua
      +LCTAGS_LUA := lctags/lctags.lua
       
      -#OPT_OP = -O3
      +#OPT_OP  :=  -O3
       
      -IF_LUA = libclanglua/if.lua
      -IFC_LUA = libclanglua/ifc.lua
      -COREBASE_SO = libclanglua/coreBase.$(SO)
      -CORE_SO = libclanglua/core.$(SO)
      +IF_LUA       :=  libclanglua/if.lua
      +IFC_LUA      :=  libclanglua/ifc.lua
      +COREBASE_SO  :=  libclanglua/coreBase.$(SO)
      +CORE_SO      :=  libclanglua/core.$(SO)
       
      -LUA_DIR_SCRIPT='for path in string.gmatch( package.path, "[^;]+" ) do if path:find( ".*lua.*%?%.lua" ) then print( (path:gsub( "/%?%.lua", "" )) ); break end end'
      -LUA_DIR_LIB="for path in string.gmatch( package.cpath, '[^;]+' ) do if path:find( \".*lua.*%?%.$(SO)\" ) then print( (path:gsub( \"/%?%.$(SO)\", '' ))); break end end"
      +LUA_DIR_SCRIPT := 'for path in string.gmatch( package.path, "[^;]+" ) do if path:find( ".*lua.*%?%.lua" ) then print( (path:gsub( "/%?%.lua", "" )) ); break end end'
      +LUA_DIR_LIB    := "for path in string.gmatch( package.cpath, '[^;]+' ) do if path:find( \".*lua.*%?%.$(SO)\" ) then print( (path:gsub( \"/%?%.$(SO)\", '' ))); break end end"
       
       
       
       ifneq ($(LUA_DIR),)
      -TARGET_LUA = $(LUA_COMMAND)
      +TARGET_LUA  :=  $(LUA_COMMAND)
       endif
       
       all:
      @@ -254,11 +278,11 @@ test-simple:
       
       
       ifdef BATCH
      -BATCH_OP=--lctags-only-reg
      +BATCH_OP := --lctags-only-reg
       endif
       
       ifeq ($(INDIV),y)
      -INDIV_OP=--lctags-indiv
      +INDIV_OP := --lctags-indiv
       endif
  1. ビルド(lctags のトップディレクトリに戻ってから)
    $ make build
    成功すると、以下のファイルが出来る
    src/lsqlite3.so
    src/lctags/Helper
    src/lctags/Helper.so
    src/lctags/core.so
    src/lctags/coreBase.so

実行ファイルに PATH を通す

emacs から使う

  1. lctags を emacs から使う為の lisp は、lctags のリポジトリ内に同梱されているので、これを load 出来るようにする。
    1. リポジトリ内の src/lisp を、emacs が load 出来る場所にコピーするか、 load-path に追加する。
      (add-to-list 'load-path "hoge/lctags/src/lisp") t)
    2. src/lisp/lctags.el を load する。
      (require 'lctags)
  2. これらを使えるようにするために、 helmgtags.el も使えるようにする必要がある。

参考リンク

Rtags

環境構築

  1. rtags をビルドする
    # apt-get install clang libclang-dev cmake
    $ git clone --recursive https://github.com/Andersbakken/rtags
    $ cd rtags
    $ git submodule init
    $ git submodule update
    $ mkdir build
    $ cd build
    $ cmake ..
    $ make
    $ sudo make install

  2. rtags をインストールする
    • ビルドすると rtags/build/bin に以下の実行形式が生成されるので、環境変数 PATH の通っているところに配置する。
      $ ls rtags/build/bin
      rc  rdm  rp

タグを生成する

  1. まず、daemon を起動する
    $ rdm --daemon
  2. タグを生成する方法は2つある

1. rc コマンドに直接渡す

2. rc -Jコマンドで compile_commands.json を読み込ませる

emacs から rtags を使う

参考リンク

cscope

tag の生成

cscope で SymLink になっているファイルが扱えない問題について

xcscope.el

シンボルを探す

keydescriptionremark
C-c s sシンボルを指定して探す(定義・呼び出し箇所等の一覧をリストアップする)
C-c s C指定したシンボルの呼び出し箇所をリストアップ
C-c s G指定したシンボルの定義(宣言ではなく)、またはそれに関する定義をリストアップする
C-c s n次のシンボルへ Jump
C-c s p前のシンボルへ Jump

xcscope のキーバインド一覧(xcscope.el ver.1.0)

;; * Keybindings:
;;
;; All keybindings use the "C-c s" prefix, but are usable only while
;; editing a source file, or in the cscope results buffer:
;;
;;      C-c s s         Find symbol.
;;      C-c s =         Find assignments to this symbol
;;      C-c s d         Find global definition.
;;      C-c s g         Find global definition (alternate binding).
;;      C-c s G         Find global definition without prompting.
;;      C-c s c         Find functions calling a function.
;;      C-c s C         Find called functions (list functions called
;;                      from a function).
;;      C-c s t         Find text string.
;;      C-c s e         Find egrep pattern.
;;      C-c s f         Find a file.
;;      C-c s i         Find files #including a file.
;;
;; These pertain to navigation through the search results:
;;
;;      C-c s b         Display *cscope* buffer.
;;      C-c s B         Auto display *cscope* buffer toggle.
;;      C-c s n         Next symbol.
;;      C-c s N         Next file.
;;      C-c s p         Previous symbol.
;;      C-c s P         Previous file.
;;      C-c s u         Pop mark.
;;
;; These pertain to setting and unsetting the variable,
;; `cscope-initial-directory', (location searched for the cscope database
;;  directory):
;;
;;      C-c s a         Set initial directory.
;;      C-c s A         Unset initial directory.
;;
;; These pertain to cscope database maintenance:
;;
;;      C-c s L         Create list of files to index.
;;      C-c s I         Create list and index.
;;      C-c s E         Edit list of files to index.
;;      C-c s W         Locate this buffer's cscope directory
;;                      ("W" --> "where").
;;      C-c s S         Locate this buffer's cscope directory.
;;                      (alternate binding: "S" --> "show").
;;      C-c s T         Locate this buffer's cscope directory.
;;                      (alternate binding: "T" --> "tell").
;;      C-c s D         Dired this buffer's directory.
;;

xcscope のキーバインドが正しく動作しない場合

参考リンク

acscope.el

導入

tagの生成

参考リンク

参考リンク

id-utils

導入

emacs の設定

DB の生成

symbol の検索

gtags / global の利用

tag の生成

$ gtags [options] [path]
$ gtags -f <files>
$ gtags -v

emacs の設定

vi での設定

  1. vimのプラグインを ~/.vim/plugin にコピー
    $ mkdir ${HOME}/.vim/plugin
    $ cp /usr/share/doc/global/examples/gtags.vim.gz ${HOME}/.vim/plugin
    $ cd ${HOME}/.vim/plugin
    $ gunzip gtags.vim.gz
  2. /.vimrc にgtagsの設定を追加

    map <C-h> :Gtags -f %<CR>
    map <C-j> :GtagsCursor<CR>
    map <C-n> :cn<CR>
    map <C-p> :cp<CR>

操作

bindingdescription
C-hそのソースの関数を表示
C-nリストのカーソルを下に移動
C-pリストのカーソルを上に移動
C-j現在の関数の中にジャンプ
C-oジャンプする前の位置に戻る

参考リンク

etags (ctags for Emacs)の利用

tag の生成

emacs に TAGS ファイルを読みこませる

M-x: tags-reset-tags-tables 一旦リセットする
M-x: visit-tags-table 明示的に TAGS ファイルを読み込む

ctags-exuberant

TAGS file の生成

$ ctags-exuberant -e -R [path]

emacs から TAGS の生成を行えるようにする

参考リンク

ebrowse (ebrowse for Emacs)の利用

Links

SilentBob

tag の生成

$ bob --make-ctags
$ bob --cfiles
$ bob -L cfiles --call-tags

参考リンク

各システムでの解析速度


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS