rtagsのdebパッケージを作成した

はじめに

最強のC/C++インデクサー “Rtags” を本気で使う - QiitaAndersbakken/rtags: A c/c++ client/server indexer for c/c++/objc[++] with integration for Emacs based on clang. の存在を知り、deb パッケージを作ってみたのでメモです。

rtags は emacs 連携が入っているのですが、私は vim ユーザで emacs 使って無くて動作確認するのが面倒なので、自作 deb パッケージでは emacs 連携は外しています。

rtags 用の vim プラグインは lyuts/vim-rtags: Vim bindings for rtags, llvm/clang based c++ code indexer. を私は使っています。

インストール方法

ビルドしたパッケージは vim : Hiroaki Nakamura で公開しています。

以下の手順でインストール出来ます。

sudo apt install software-properties-common
sudo add-apt-repository ppa:hnakamur/vim
sudo apt update
sudo apt install rtags

ちょっと試してみた感じでは xenial の vim だと動きませんでした。 私は vim8 も試してみたかったので terminal機能を有効にしたvim8のdebパッケージを作成した に書いた vim 8 のパッケージを使っています。

vim-rtags はお好みのプラグインマネージャでインストールしてください。 一覧を開くときに location リストではなく quickfix ウィンドウを使いたいときは ~/.vimrc に以下の設定を追加します。

" Use quickfix window for rtags
let g:rtagsUseLocationList = 0

使い方

初期設定

以下の内容で ~/.rdmrc を作ってください。

-s usr/lib/llvm-4.0/lib/clang/4.0.0/include

インデクス作成

rtags のサーバは手動で rdm を起動してください。 rdm は下記のインデクス生成とソースコードを参照する際の両方で起動しておく必要があります。

インデクスを作るのは、私は今のところ上記のQiitaの記事の cmake を使う方法を使っています。

コードを読みたいソースディレクトリで -DCMAKE_EXPORT_COMPILE_COMMANDS=1 を付けて

cmake . -DCMAKE_EXPORT_COMPILE_COMMANDS=1

のように cmake を実行して compile_commands.json を生成し、

rc -J .

でインデクスを作成します。インデクスは ~/.cache/rtags/ 以下に作られます。

インデクス参照

vim-rtags の README に説明がありますが、そのままのバインディングの場合、メソッド名などの上にカーソルを置いて <Leader>rj で定義に飛ぶのを最もよく使います。ヘッダファイルと実装ファイル間で相互にも飛べました。

<Leader>rb でジャンプ前の位置に戻ります。 jump の j と back の b で覚えやすいので、3ストロークかかりますが、とりあえずそのまま使っています。

あとは <Leader>rf で参照している個所一覧を見られます。

パッケージ作成時のメモ

rtags-testing : Hasan Yavuz Özderya をベースにして xenial 用にし、rtags のバージョンを上げて作りました。

C と C++ のコンパイラは Toolchain test builds : “PPA for Ubuntu Toolchain Uploads (restricted)” team gcc-7 と g++-7 を使っています。

pbuilder でのビルド時は pbuilderのchroot環境にレポジトリを追加する で書いた gcc-7 の環境を使っています。

sudo pbuilder build --basetgz /var/cache/pbuilder/gcc7.tgz ../build-area/rtagsのdscファイル

実行時の依存関係に clang と llvm の 4.0 を加えています。なるべく新しいバージョンのほうが C++ の新しい規格で書かれたソースを正しく解釈できるだろうと思ったので 3.x ではなく 4.0 にしました。

おわりに

clang の構文解析インターフェースを利用しているだけあって、正確に定義に飛べてかなり便利です。 ただ、たまに定義に飛ばないときもありました。

そこで GNU GLOBAL source code tagging system も併用しています。

xenial の global パッケージ もあるのですが 5.7.1 と古かったので artful の global パッケージ を xenial にバックポートしました。 global : Hiroaki Nakamura で公開しています。