clang-tidyはC++向けの良い感じに自動修正までしてくれるLinterです。
Linterとしてどのくらい良い感じなのかは冬休み到来! clang-tidy で安心安全な C/C++ コーディングを極めよう! - Qiitaを確認していただくとして、ここではCMakeを使って簡単に実行する手順をメモしておきます。
確認した環境
Ubuntu16.04(をVirtualBoxで動かしたもの)
未確認ですが新しめのUbuntuだとCMakeの更新が省けるはず。
準備
以下が必要か不要か忘れたけども、もしかしたら必要。
sudo apt install clang clang-tidy
CMakeの更新(3.6以上にする)
cmake3.6以降であれば、cmake自身がclang-tidyに対応しているので簡単に導入できる。
最新のcmakeを持ってくる(tar.gz)
https://cmake.org/download/
例えば、下記のようにごちゃごちゃやるとできる。
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
を使ってなんか適当にやればうまくいく。
環境の例
.
└── Qiita
├── CMakeLists.txt
└── main.cpp
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})
#include <iostream>
int main(){
std::cout << "Hello World!" << std::endl;
float f = 0.0F;
int i = (int)f;
std::cout << i << std::endl;
}
ビルド
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++スタイルのキャストになっています。
#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