如何在CMake中使用cpplint代码样式检查?

How to use cpplint code style checking with CMake?

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

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

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

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


Daniel Pffeifer的" Effective Cmake"(https://www.youtube.com/watch?v=rLopVhns4Zs&=&t=77m13s)中介绍了将静态分析工具与CMake结合使用的推荐方法。

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

1
cmake"-DCMAKE_CXX_CPPLINT=cpplint" ..

或放入CMakeLists.txt

1
set(CMAKE_CXX_CPPLINT"cpplint")

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

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

这种方法的缺点:

  • 错误计数将不会累积(因为分别为每个文件调用cpplint)。
  • 它不会检查头文件(与D. Pffeifer在他的演示文稿中所说的相反,包含文件没有被cpplint扫描)。
  • 请注意,您可以以相同方式使用其他静态分析工具:

    • 氏族整洁"-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
    • 懒散的

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


    我无法使用CMAKE__CPPLINT检查代码样式。

    我使用add_custom_target做到了。

  • 下载cpplint.py

  • 然后下载cpplint.cmake或自行编写。

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

    1
    2
    3
    4
    5
    6
    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}")

    注意:

  • 您应该传递整个列表,因此请使用"${src}"而不是${src}

  • 默认情况下,任何内容都不取决于自定义目标,请参见add_custom_target。

  • 如果仍然有问题,请调试CMakeLists.txt。


    首先,非常感谢您的提问。我一直在努力解决同样的问题。

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

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

    1
    get_target_property(src staticcodecheck SOURCES)

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

    1
    2
    3
    add_custom_command(TARGET ${TARGET}
        PRE_BUILD
    ...

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

    希望这可以帮助。