如何在 CMake 中使用 cpplint 代码风格检查?

How to use cpplint code style checking with CMake?

我找到的唯一在线资源是关于 CMAKE_<LANG>_CPPLINT (link here) and this example (link here) 的 CMake 文档,但我不知道如何在 [=20] 中实际使用它=] 文件。 我尝试了提供的示例,但无法正常工作。仅供参考,我按照 here.

的说明安装了 cpplint

截至目前,我可以使用此 CMake 命令 运行 CMakeLists.txt 中的 cpplint python 脚本:

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

但是,我很确定这不是正确的方法。

我没有使用 CMAKE_<LANG>_CPPLINT 检查代码风格。

我用add_custom_target.

做的
  1. 下载cpplint.py

  2. 然后下载cpplint.cmake或者自己写

假设您的项目中有一个名为src的源代码目录,将这些语句编码到您的CMakeLists.txt中。

aux_source_directory(${CMAKE_SOURCE_DIR}/src src)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}) #I put cpplint.cmake in $CMAKE_SOURCE_DIR
include(cpplint)

add_style_check_target(phoenix-cpplint "${src}") 

注:

  1. 你应该传递整个列表,所以使用 "${src}" instead of ${src}

  2. 默认情况下不依赖于自定义目标,请参阅add_custom_target

如果还有问题,debug your CMakeLists.txt

在 Daniel Pffeifer 的 "Effective Cmake" (https://www.youtube.com/watch?v=rLopVhns4Zs&amp=&t=77m13s).

中介绍了在 CMake 中使用静态分析工具的推荐方法

您可以在调用cmake时定义它,例如:

cmake "-DCMAKE_CXX_CPPLINT=cpplint" ..

或放入CMakeLists.txt:

set(CMAKE_CXX_CPPLINT "cpplint")

推荐的选项是第一个(我们不应该在项目中定义不是项目要求的东西)。

CMake 会为它编译的每个文件调用 cpplint。您可以在分号后传递额外的参数(例如 -DCMAKE_CXX_CPPLINT=cpplint;--linelength=100)。


此方法的缺点:

  1. 错误计数不会累积(因为 cpplint 是分别为每个文件调用的)。
  2. 它不会检查头文件(与 D. Pffeifer 在他的演示文稿中所说的相反,cpplint 不会扫描包含文件)。

注意你可以用同样的方法使用其他静态分析工具:

  • 氏族整洁 "-DCMAKE_CXX_CLANG_TIDY=/usr/bin/clang-tidy-3.9;-checks=*"
  • CppCheck "-DCMAKE_CXX_CPPCHECK=/usr/bin/cppcheck;--std=c++11"
  • 武汉大学 "-DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=/usr/bin/iwyu;--transitive_includes_only"
  • 刘宇宇cmake -DCMAKE_LINK_WHAT_YOU_USE=TRUE
  • 疯狂

其中一些需要 "compilation database" (set(CMAKE_EXPORT_COMPILE_COMMANDS ON))。

我一直在为同样的问题而苦苦挣扎。

我用 CMake 3.10.2 试过了,user2449761 的评论仍然正确。使用 set(CMAKE_CXX_CPPLINT "cpplint") 仍然不检查任何 header 文件。

kgbook 的回答不再有效,因为 aux_source_directory 没有列出 header 文件。但是,您可以使用

get_target_property(src staticcodecheck SOURCES)

这将为您提供所有 non-system header。其余的可以保持不变。至于运行 cpplint 在特定时间,你可以试试

add_custom_command(TARGET ${TARGET}
    PRE_BUILD
...

这将取代 add_custom_target(${TARGET_NAME}... 在他的 cpplint.cmake.

希望对您有所帮助。