Search code examples
cmakecpplint

How to use cpplint code style checking with CMake?


The only online resources I have found are the CMake documentation on CMAKE_<LANG>_CPPLINT (link here) and this example (link here), but I cannot figure out how to actually use it inside a CMakeLists.txt file. I tried the example provided, but I can't make it work. FYI, I installed cpplint as explained here.

As of now, I can run the cpplint python script inside CMakeLists.txt using this CMake command:

execute_process(COMMAND cpplint path/To/File/To/Analyse.cpp)

However, I am pretty sure that this is not the right way to do this.


Solution

  • Recommended way to use static analysis tools with CMake was presented in Daniel Pffeifer's "Effective Cmake" (https://www.youtube.com/watch?v=rLopVhns4Zs&amp=&t=77m13s).

    You can either define it when calling cmake, eg.:

    cmake "-DCMAKE_CXX_CPPLINT=cpplint" ..
    

    or put it into CMakeLists.txt:

    set(CMAKE_CXX_CPPLINT "cpplint")
    

    Recommended option is the first one (we shouldn't define in a project what isn't a project requirement).

    CMake will call cpplint for each file it compiles. You can pass extra arguments after semicolon (e.g. -DCMAKE_CXX_CPPLINT=cpplint;--linelength=100).


    Downsides of this method:

    1. Errors count will not get accumulated (because cpplint is invoked for each file separately).
    2. It will not check header files (as opposed to what D. Pffeifer says in his presentation, include files are not being scanned by cpplint).

    Note that you can use other static analysis tools the same way:

    • Clan Tidy "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-3.9;-checks=*"
    • CppCheck "-DCMAKE_CXX_CPPCHECK=/usr/bin/cppcheck;--std=c++11"
    • IWYU "-DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=/usr/bin/iwyu;--transitive_includes_only"
    • LWYU cmake -DCMAKE_LINK_WHAT_YOU_USE=TRUE
    • clazy

    Some of them will require "compilation database" (set(CMAKE_EXPORT_COMPILE_COMMANDS ON)).