4

我发现的唯一在线资源是 CMake 文档CMAKE_<LANG>_CPPLINT此处链接)和此示例(此处链接),但我无法弄清楚如何在 CMakeLists.txt 文件中实际使用它。我尝试了提供的示例,但无法使其工作。仅供参考,我按照此处的说明安装了 cpplint 。

到目前为止,我可以使用以下 CMake 命令在 CMakeLists.txt 中运行 cpplint python 脚本:

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

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

4

3 回答 3

7

Daniel Pffeifer 的“Effective Cmake”( https://www.youtube.com/watch?v=rLopVhns4Zs&=&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
  • 疯狂的

其中一些将需要“编译数据库”(set(CMAKE_EXPORT_COMPILE_COMMANDS ON))。

于 2019-06-13T11:02:09.903 回答
1

我没有用来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}"而不是${src}.

  2. 默认情况下,没有任何东西取决于自定义目标,请参阅add_custom_target

如果仍有问题,请调试您的 CMakeLists.txt

于 2018-10-04T15:59:20.577 回答
0

我一直在努力解决同样的问题。

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

kgbook 的答案不再起作用,因为 aux_source_directory 没有列出头文件。但是,您可以使用

get_target_property(src staticcodecheck SOURCES)

这将为您提供所有非系统标头。其余的可以保持不变。至于在特定时间运行 cpplint,您可以尝试

add_custom_command(TARGET ${TARGET}
    PRE_BUILD
...

这将替换他的 cpplint.cmake 中的 add_custom_target(${TARGET_NAME}... 。

希望这可以帮助。

于 2020-05-08T07:18:04.917 回答