CMakeでビルドしているコードにclang-tidyを実行する


clang-tidyはC++向けの良い感じに自動修正までしてくれるLinterです。
Linterとしてどのくらい良い感じなのかは冬休み到来! clang-tidy で安心安全な C/C++ コーディングを極めよう! - Qiitaを確認していただくとして、ここではCMakeを使って簡単に実行する手順をメモしておきます。

確認した環境

Ubuntu16.04(をVirtualBoxで動かしたもの)
未確認ですが新しめのUbuntuだとCMakeの更新が省けるはず。

準備

以下が必要か不要か忘れたけども、もしかしたら必要。

clang,clang-tidyインストール
sudo apt install clang clang-tidy

CMakeの更新(3.6以上にする)

cmake3.6以降であれば、cmake自身がclang-tidyに対応しているので簡単に導入できる。
最新のcmakeを持ってくる(tar.gz)
https://cmake.org/download/

例えば、下記のようにごちゃごちゃやるとできる。

CMakeをダウンロードしてからパスを通す
mkdir ~/temp
cd ~/temp
wget https://cmake.org/files/v3.8/cmake-3.8.2-Linux-x86_64.tar.gz
tar -xvzf cmake-3.8.2-Linux-x86_64.tar.gz
sudo mv cmake-3.8.2-Linux-x86_64 /opt/
sudo ln -s /opt/cmake-3.8.2-Linux-x86_64/bin/cmake /usr/local/bin/cmake
cmake --version
# cmake version 3.8.2と表示されればOK!

参考:c++ - How to install latest cmake version in Linux/Ubuntu from command line? - Ask Ubuntu

CMakeを使ってclang-tidyする

-DCMAKE_CXX_CLANG_TIDYを使ってなんか適当にやればうまくいく。

環境の例

Direcroty構成
.
└── Qiita
    ├── CMakeLists.txt
    └── main.cpp
Qiita/CMakeLists.txt
cmake_minimum_required(VERSION 3.5)

set(CMAKE_CXX_FLAGS "-std=c++14")

set(SOURCE_FILES
    ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
    )

add_executable(Hello ${SOURCE_FILES})
Qiita/main.cpp
#include <iostream>

int main(){
    std::cout << "Hello World!" << std::endl;

    float f = 0.0F;
    int i = (int)f;
    std::cout << i << std::endl;
}

ビルド

clang-tidyつきのビルドする
mkdir build
cd build
cmake -DCMAKE_CXX_CLANG_TIDY="clang-tidy;-checks=-*,google-readability-casting;-fix;-fix-errors;-header-filter=/home/yoyomion/Qiita" ../Qiita
make
参考:普通にビルド
mkdir build
cd build
cmake ../Qiita
make

確認

開いてみると、指摘された箇所が自動で修正されています。
C++スタイルのキャストになっています。

Qiita/main.cpp(clang-tidy実行後)
#include <iostream>

int main(){
    std::cout << "Hello World!" << std::endl;

    float f = 0.0F;
    int i = static_cast<int>(f);
    std::cout << i << std::endl;
}

説明

先頭にclang-tidy実行コマンドを書いて、以降はセミコロン区切りでclang-tidy向けのオプションを並べます。

書いてあること 説明
clang-tidy clang-tidy実行コマンド。cmake用。
-checks=-*,google-readability-casting clang-tidyのオプション。今回は、-*で全部のチェッカーを無効にしてから、google-readability-castingチェッカーを指定している。
-fix clang-tidyのオプション。修正提案を自動適用する。
-fix-errors clang-tidyのオプション。ビルドエラーになったとしても修正提案を適用する。
-header-filter=/home/yoyomion/Qiita clang-tidyのオプション。ユーザーが用意したヘッダーファイル置き場を絶対パス指定する。このディレクトリ以下のヘッダーはシステムヘッダーとみなされず、clang-tidyで指摘してもらえる。

参考:
Clang-Tidy — Extra Clang Tools 5 documentation
[cmake-developers] Integration of clang-tidy