CLionによるCompilation Databaseを用いたMakefileプロジェクトサポートを試してみた

# はじめに

この記事はJetBrains CLionチームの英文ブログ [Working with Makefiles in CLion using Compilation DB](https://blog.jetbrains.com/clion/2018/08/working-with-makefiles-in-clion-using-compilation-db/) を参考に書いたものです。

## 実現できること

これまでCLionはビルドシステムとしてCMakeのみをサポートしていました。最近のリリースではGralde C++ project等のサポートも追加された一方、歴史あるプロジェクトでは依然として多く使われているMakefileはビルドシステムとして正式にサポートされていません。本稿では、Compilation DB(後述)を使うことにより、**CMake設定ファイルを準備することなく**、MakefileプロジェクトにおいてCLionを利用する方法を紹介します。

## 制限事項

[英文ブログ](https://blog.jetbrains.com/clion/2018/08/working-with-makefiles-in-clion-using-compilation-db/)にあるように、CLion 2018.2.2ではCompilation DBを用いたMakefileプロジェクトサポートは完全ではありません。CLion 2018.2.2の時点で「できること」、「まだできないこと」は以下のとおりです。

- できること
    - コード補完
    - 静的コード解析
    - コードのナビゲーション（定義へのジャンプ等）
- できないこと
    - プロジェクトレベルのビルド
    - 実行
    - デバッグ

「まだできないこと」は今後のリリースでの対応が計画されているようです。

# 予備知識 - [JSON] Compilation Databaseとは
Compilation Databaseとはソースコードをコンパイルするために必要な情報を集約したものです。具体的に言うと、ソースファイルごとに、コンパイルオプション(-Dや-I、-Wall等)が記録されたものです。[Compilation Database Generator](https://github.com/nickdiego/compiledb-generator)というツールを使うと、Makefileベースのビルドシステムに対して、JSON形式のCompilation Databaseを生成することができるようになります。以下に出力例を示します。

```JSON
{
  "directory": "/home/jb/work/ruby",
  "file": "./main.c",
  "arguments": [
   "cc",
   "-Wall",
   "-Wextra",
   //省略
   "-std=gnu99",
   "-D_FORTIFY_SOURCE=2",
  　//省略
   "-I.",
   "-I.ext/include/x86_64-linux",
   "-I./include",
   "-I.",
   "-I./enc/unicode/10.0.0",
   "-c",
   "./main.c"
  ]
 }
```

現状CLionはMakefileを直接サポートしていませんが、Makefileのビルド情報から生成されたCompilation Databaseファイルを解釈することによって、Makefileプロジェクトを扱うことができるようになります。

# RubyプロジェクトのソースコードでCLionを試してみる
[英文ブログ](https://blog.jetbrains.com/clion/2018/08/working-with-makefiles-in-clion-using-compilation-db/)　ではMakefileプロジェクトを扱う例として、OpenSSLがありましたが今回は[Ruby](https://github.com/ruby/ruby)で試してみたいと思います。試してみた環境は以下のとおりです。

* 環境
    * OS:Ubuntu 18.04.1 LTS
    * CLion:2018.2.3
   

ターミナルから、Compilation Database generatorをインストールします。執筆時点では、バージョン0.9.6や0.9.7ではCompilation DBの生成に問題があるようですので0.9.2を指定してインストールしています。

```
$ pip3 install compiledb==0.9.2 
$ pip3 show compiledb
Name: compiledb
Version: 0.9.2
Summary: Tool for generating Clang JSON Compilation Database files for make-based build systems.
Home-page: https://github.com/nickdiego/compiledb-generator
Author: Nick Yamane
Author-email: nick@diegoyam.com
License: GPLv3
Location: /home/jb/.local/lib/python3.6/site-packages
Requires: bashlex, click
```

githubからRubyのソース(試したのは2.6.0)を取ってきて、makeできることを確認します。

```
$ git clone https://github.com/ruby/ruby.git
$ cd ruby
$ autoconf
$ ./configure
$ make -j 3
```

Compilation Database generator(私の環境の場合~/.local/bin/compiledb)を-nオプション(実際のコンパイルはスキップ)付きで実行します。compile_commands.jsonが生成されて、ファイルごとのコンパイル情報が出力できていることが確認できれば準備完了です。

```
$ ~/.local/bin/compiledb -n make
WARNING: Token 'COND_ERROR' defined, but not used
WARNING: There is 1 unused token
## Processing build commands from 3
## Writing compilation database with 475 entries to compile_commands.json
## Done.
```
CLionを起動します。Welcomeダイアログの「Open」から上記compile_commands.jsonが存在する「ruby」ディレクトリを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/22747/99b9dc15-ed5c-0cf8-d90d-c66b15969fae.png)

CLionはcompile_commands.jsonを読んでindexing等の処理を開始します。
indexing等の処理が終わると、コード補完が効いたり、定義ジャンプが可能になったり、cファイルを開くとcode　analysisを実行して静的解析の警告メッセージをだしたりしてくれるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22747/9da55e0b-1980-e744-2a3c-5fe169136dc9.png)

2018.2.3からcompile_commands.jsonを自動再読込する機能が入っているようですが、強制的に再読込させたい場合は、Tools - Compilation Database - Reload Compilation Database Project　から可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/22747/e72ef102-f208-9b13-fc47-a36c6b4307e4.png)
今回は試しませんでしたが、[英文ブログ](https://blog.jetbrains.com/clion/2018/08/working-with-makefiles-in-clion-using-compilation-db/) のExample 2によると、File WatcherプラグインとMakefileプラグインを利用することにより、Makefileを変更したらcompiledbコマンドを自動実行するということもできるようです。[2018/09/10 追記　[CLion 2018.2.3 Update](https://blog.jetbrains.com/clion/2018/09/clion-2018-2-3-update/)に詳細が記載されてれています。]

# まとめ
Compilation Database Generatorを使って一手間かけると、MakefileプロジェクトでもCLionのコーディングアシスト機能を使うことができるようになります。ただし、この手法の場合、ビルドやデバッグはまだサポートされていないので、CLion内(またはOS)のTerminalからコマンドライン操作が必要です。今後のバージョンアップで完全サポートを期待しましょう。

参考:[CLion Online help](https://www.jetbrains.com/help/clion/compilation-database.html)